Ir para conteúdo
Fórum Script Brasil

Thiago Alencar

Membros
  • Total de itens

    31
  • Registro em

  • Última visita

Tudo que Thiago Alencar postou

  1. E' fazendo isso ela não se comporta de maneira "estranha".. o que estou fazendo agora é calcular os valores "reais" do meu PageUnit por porcentagem pelo tamanho original, assim: Dim PUWidth As Integer = (TotalLengthAvailable * Images(ImagePointer).GetWidth) / 100 Dim PUHeight As Integer = ((TotalHeightAvailable * Images(ImagePointer).GetHeight) / 100) - YPos Onde Images() e' um ArrayList que contem valores < 100 do tanto que a imagem deve ficar dentro do contexto e depois fazer XPos += ImagePadding e.Graphics.DrawImage(_Image, XPos, YPos, PUWidth, PUHeight) ai o YPos += PUHeight fica correto. valeu, t+!
  2. Estou com um probleminha besta aqui mas ainda não achei solucao em nenhum lugar.. vamos ao que interessa: Dim PUWidth As Integer = _Image.Width Dim PUHeight As Integer = _Image.Height e.Graphics.DrawImage(_Image, XPos, YPos) YPos += PUHeight Agora explicando, As variaveis (XPos e YPos), como podem ver, apontam pra onde estou trabalhando no momento. Depois de desenhar uma imagem (que so saberei o tamanho em run-time), preciso reposicionar o meu YPos para abaixo da imagem. O problema e' que trabalho com o PageUnit no formato Display (que se não me engano e' o padrão do Graphics), e o metodo Height e Width me retornam valores em Pixel, naturalmente causando o reposicionamento do Ypos de forma errada.. já tentei varios outros metodos (GetBounds(Drawing.GraphicsUnit.Display).Size.Height) mas mesmo assim não da certo.. alguma sugestao?? obrigado!
  3. A terceira opcao (Duck-type), procuro evitar pois não acredito ser um bom habito programar desta forma, uma vez que por exemplo, voce vai acabar so descobrindo se digitou um metodo incorretamente com erro em tempo de execucao (não na compilacao). Enfim, acho q a primeria opcao seria a mais adequada.. dividindo a classe de conexao em duas (a base, sendo e.g. uma MustInherit) e as derivadas (MsSql e MySql) como voce disse.. já a segunda opcao não entendi pois não recordo mais como usar interfaces (acredito que seria a mesma coisa dessa 1a opcao não?). obrigado! Thiago.
  4. Sim, mas o problema e' que a classe "ClsQualquer" não sabe de que "tipo" a classe de conexao sera (pode ser clsMssql ou clsMysql..) pois a "propriedade" não estaria definida ate ser instanciada. t+
  5. Acho que muitos que colocam OO em pratica devem obter problemas similares a este.. Imagine a seguinte situacao: tenho uma colecao de classes cada uma com suas especificas funcoes: 'colecao de classes--------------------INICIO clsMssql > usada para conectar/manipular bds mssql clsMysql > usada para conectar/manipular bds mysql clsQualquer > qualquer outra classe 'colecao de classes----------------------FIM e clsMainForm > aplicativo principal Considerando: -O clsMainForm utilizara uma classe de conexao(clsMssql ou clsMysql) E a classe "clsQualquer"; -A classe "clsQualquer" precisa utilizar uma conexao com o banco de dados para funcionar(eg.: clsMssql ou clsMysql) A primeira vista, imagino que este seria o design apropriado: clsMainForm tem uma conexao com o bd clsMainForm tem uma clsQualquer clsQualquer tem uma conexao com o bd A relacao "has a" (tem um(a)) em OO se define declarando a mesma e instanciado-a. Porem: a classe "clsQualquer" precisa utilizar a mesma classe de conexao que o clsMainForm. então como ela instanciara esta classe se somente a classe que a instancia esta ciente de qual classe de conexao usar? I.E., como a classe "clsQualquer" ira declarar/instanciar uma classe de conexao, se ela não sabe qual das classes de conexao utilizar? Logo, este "design" não parece correto. Sugestoes? ideias? abracos!
  6. desculpem acabei confundindo finally com finalize. O Finalize sim que não tem garantia de que sera executado, uma vez que e' usado pelo Garbage Collector do CLR - que e' imprevisivel. parece que usando o finally funciona sim Ate +
  7. Precisava realizar umas operacoes antes que meu thread fosse abortado.. de cara o threadAbortException parecia uma mao na roda.. porem percebi que nem sempre meu codigo dentro do bloco catch exception era executado ate o fim e o thread e' abortado antes disso. Talvez colocar este codigo dentro de um finally e seguir a seguinte ideia: Aqui uma descricao sobre o mesmo: "When a call is made to the Abort method to destroy a thread, the common language runtime throws a ThreadAbortException. ThreadAbortException is a special exception that can be caught, but it will automatically be raised again at the end of the catch block. When this exception is raised, the runtime executes all the finally blocks before ending the thread. Since the thread can do an unbounded computation in the finally blocks, or call Thread.ResetAbort to cancel the abort, there is no guarantee that the thread will ever end. If you want to wait until the aborted thread has ended, you can call the Thread.Join method. Join is a blocking call that does not return until the thread actually stops executing." mas acho que li em algum lugar que nem sempre o codigo finally e' executado tambem. Alguma ideia por que isto acontece? abraco!
  8. Acontece que este é um form "secundario". Os threads são controlados por um outro form e não devem ser parados quando o form secundario deixa de ser exibido. Mas esse CheckForIllegalCrossThreadCalls foi a unica salvacao mesmo.. caso contrario teria que re-estruturar todo o programa. Se descobrir a forma mais "correta" de atingir o mesmo objetivo postamos ai! Valeu mesmo Graymalkin! abracos
  9. Olha pra ser sincero não entendi sua aplicacao especificamente, mas aqui esta como leio valores de datagrids: DtGridname.Item(coluna,linha).Value senao me engano e' isso. Verifique se voce criou o grid com colunas/linhas o suficiente para sua aplicacao veja este exemplo, talvez te ajude: Dim Table1 As DataTable = New DataTable("Customers") Dim Row1, Row2, Row3 As DataRow Dim Name As DataColumn = New DataColumn("Name") 'declaring a column named Name Name.DataType = System.Type.GetType("System.String") 'setting the datatype for the column Table1.Columns.Add(Name) 'adding the column to table Dim Product As DataColumn = New DataColumn("Product") Product.DataType = System.Type.GetType("System.String") Table1.Columns.Add(Product) Dim Location As DataColumn = New DataColumn("Location") Location.DataType = System.Type.GetType("System.String") Table1.Columns.Add(Location) Row1 = Table1.NewRow() 'declaring a new row Row1.Item("Name") = "This is a big string" 'filling the row with values. Item property is used to set the field value. Row1.Item("Product") = "Notebook" 'filling the row with values. adding a product Row1.Item("Location") = "Sydney" 'filling the row with values. adding a location Table1.Rows.Add(Row1) 'adding the completed row to the table Row2 = Table1.NewRow() Row2.Item("Name") = "Bella" Row2.Item("Product") = "Desktop" Row2.Item("Location") = "Adelaide" Table1.Rows.Add(Row2) Row3 = Table1.NewRow() Row3.Item("Name") = "Adam" Row3.Item("Product") = "PDA" Row3.Item("Location") = "Brisbane" Table1.Rows.Add(Row3) Dim ds As New DataSet() ds = New DataSet() 'creating a dataset ds.Tables.Add(Table1) 'adding the table to dataset DataGridView1.DataSource = ds.Tables(0) se não conseguir resolver recomendo dar uma lida sobre os componentes que esta usando. abracos, ate +
  10. Isso que imaginei.. Na verdade o problema não é de varios threads manipularem um mesmo controle, mas quando o controle deixa de existir (por exemplo ao fechar o form) e ainda há um processo de um evento ocorrendo.. o que fiz para "resolver" isso foi enlacar o codigo dentro de um try/catch so para que não ocorra nada (nenhuma interrupcao) quando houver uma excessao como esta. Ate agora não estou tendo maiores problemas. muito obrigado, Thiago.
  11. Ola Graymalkin! setando CheckForIllegalCrossThreadCalls para False não tive mais InvalidOperationException! Pode explicar o que essa propriedade faz e por que é "True" por padrão? Acho que não é muito seguro utilizar essa propriedade em false. O aplicativo lanca diferentes excessoes "randomicamente" agora de vez em quando. Voce costuma usa-la frequentemente? Tem problemas tambem? obrigado!
  12. Voce esqueceu de instanciar algum dos objetos da linha "grdCarteira.CurrentRow.Cells(0).Value = cboCredoraFuncionario.SelectedRow.Cells(0).values" coloque um "break-point" nessa linha ao compilar verifique (colocando o mouse sobre o objeto) se nenhum dos seus componentes esta como "Nothing". Caso positivo, voce deve fazer com que o mesmo seja instanciado antes de poder utilizar o seu event handler cboCredoraFuncionario_Validated. abraco!
  13. Estou com um problemao aqui relacionado a GUIs/Threads e eventos em vb.net.. quem tem boa nocao nessa area se puder me ajudar eu agradeco muito. Preciso rodar processos como threads na aplicacao. Esses threads contem estados de execucao (por ex. iniciado, lendo, escrevendo,etc). Estes estados precisam ser exibidos no form. Antes de mais nada, quero deixar claro os motivos pelo qual não uso delegates para controlar os componentes do formulario pelo thread: -Como não sei o numero de threads que terei de instanciar (no momento em que projeto o sistema), seria um trabalho muito grande adaptar o codigo toda vez incluindo ou removendo os delegates. -Haveria um aumento absurdo na quantidade/manutencao de codigo pois cada thread vai ter seu componente especifico no form. A ideia que tive para solucionar este problema, ao invés de criar milhares de delegates apontando para os labels dos forms, foi a seguinte: Instanciar e criar os threads (na classe do form principal). Estes threads contem eventos que serao "raised" (ou chamados) conforme seus estados mudam. Neste mesmo form principal, adiciono os respectivos event handlers pelo metodo "Addhandler". Por exemplo, se na minha classe do thread declarei: Public Event E_CurrentOperation(ByVal op As Operation) no codigo do formulario faco: AddHandler TestConn.E_CurrentOperation, AddressOf Me.CurrentStatus_Handler onde naturalmente o "CurrentStatus_Handler" é o metodo que contem o codigo que sera executado quando o evento for detectado. Fazendo um teste, coloquei um "MessageBox.Show("TESTE")" no CurrentStatus_Handler para ver o que aconteceria. Para minha surpresa, funcionou perfeitamente (inclusive com os parametros). Minha decepcao foi quando alterei o MessageBox.Show("TESTE") para Me.LblStatus.Text = "whatever", recebendo a excecao InvalidOperationException: Ou seja, não da pra alterar nada do formulario! Ai fiquei surpreso, porque poxa! agora que o evento já foi detectado (que normalmente seria a parte mais complicada) não consigo rodar nada que altere componentes do form, no proprio codigo do form! isso parece um absurdo pra mim, mas vai ver e' porque os Guis não são "thread-safe".. vai saber? deve haver alguma solucao para isto, alguém se propoe a dar uma sugestao? obrigado pela atencao! Thiago.
  14. Preciso de uma atualizacao constante das informacoes na tabela. Porem, a cada update, a barra de rolagem volta para o inicio da tabela, impossibilitando utiliza-la quando a atualizo, por exemplo, a cada segundo quando há muitas linhas. Existe uma forma de atualiza-la sem ficar voltar para o inicio? obrigado!
  15. Ola galera! talvez alguém q manja de multithreading possa me ajudar aqui.. Tenho quatro métodos (threads) em minha aplicação que devem trabalhar sincronizados compartilhando um array de 8 elementos como um circular buffer array. Cada método deve trabalhar nos dados só depois que seu antecessor tenha completado sua tarefa, na seguinte ordem: 1.: Ler dados de arquivo e coloca-lo num elemento livre do array; 2.: Ler dado produzido pelo thread 1, alterar e salvar; 3.: Ler dados produzidos por thread 2, alterar e salvar; 4.: Ler dados produzidos por thread 3, escrever para arquivo e liberar elemento do array para que thread 1 possa trabalhar. É possível (nessa aplicacao) que todos threads acessem e manipulem os dados simultaneamente sem causar monitor overhead? Qual é o melhor meio de alcançar isto de forma que possam trabalhar juntos mas na ordem correta / sincronizada? detalhe: a forma q estou tentando resolver esse problema é utilizando Circular Buffer Array, para quem nunca ouviu falar eu tentei dar uma explicacao (seguindo o meu livro) no quinto post deste forum. (esta em ingles) Obrigado.
  16. Link do tópico: http://scriptbrasil.com.br/forum/index.php?showtopic=104682
  17. Link do tópico: http://scriptbrasil.com.br/forum/index.php?showtopic=104682
  18. http://scriptbrasil.com.br/forum/index.php?showtopic=104682
  19. Para que exatamente servem essas duas linhas: Cr.ReportSource = crs Cr.DataBind() ?? não encontrei declaracao do "cr".. que tipo seria este? valeu.. t+
  20. ok, muito obrigado.. ninguém tem alguma experiencia de como trabalhar sem usar o designer? qualquer dica esta valendo! obrigado! t+ ok.. consegui ate agora algo assim: (no evento form_load): '*************Create Grid BEGIN***************************************| Dim Table1 As DataTable = New DataTable("Customers") Dim Row1, Row2, Row3 As DataRow Dim Name As DataColumn = New DataColumn("Name") 'declaring a column named Name Name.DataType = System.Type.GetType("System.String") 'setting the datatype for the column Table1.Columns.Add(Name) 'adding the column to table Dim Product As DataColumn = New DataColumn("Product") Product.DataType = System.Type.GetType("System.String") Table1.Columns.Add(Product) Dim Location As DataColumn = New DataColumn("Location") Location.DataType = System.Type.GetType("System.String") Table1.Columns.Add(Location) Row1 = Table1.NewRow() 'declaring a new row Row1.Item("Name") = "This is a big string" 'filling the row with values. Item property is used to set the field value. Row1.Item("Product") = "Notebook" 'filling the row with values. adding a product Row1.Item("Location") = "Sydney" 'filling the row with values. adding a location Table1.Rows.Add(Row1) 'adding the completed row to the table Row2 = Table1.NewRow() Row2.Item("Name") = "Bella" Row2.Item("Product") = "Desktop" Row2.Item("Location") = "Adelaide" Table1.Rows.Add(Row2) Row3 = Table1.NewRow() Row3.Item("Name") = "Adam" Row3.Item("Product") = "PDA" Row3.Item("Location") = "Brisbane" Table1.Rows.Add(Row3) Dim ds As New DataSet() ds = New DataSet() 'creating a dataset ds.Tables.Add(Table1) '*************Create Grid END***************************************| Dim MyReport As New CrystalReport1 'MyReport.DataDefinition.RecordSelectionFormula = "{Orders.Order Date}>#01/01/2004#" MyReport.SetDataSource(ds) MyReport.PrintToPrinter(1, True, 0, 0) MyReport.SaveAs("asdf", True) MyReport.ExportToDisk(ExportFormatType.RichText, "C:\testesss.pdf") apesar de existir um "overloaded method" SetDataSource que recebe um DataSet, toda vez que rodo o codigo com essa linha (MyReport.SetDataSource(ds)) ele retorna uma excessao dizendo que não existe tabela?! sugestoes??
  21. Acabei de descobrir que o Crystal Reports vem embutido no VS .NET 2005 e gostaria de usa-lo na minha classe.. Sou novo nisto.. alguém poderia escrever um passo-a-passo bem basico instanciando, usando os metodos e salvando o relatorio? Estive olhando a documentacao mas todos que encontrei explica como usa-la com wizzards.. mas eu preciso usa-lo programaticamente (essa palavra existe? rs) Obrigado desde já, Thiago. ******************************* Hello, I just found out that Crystal Reports comes embedded inside VS .NET 2005 and would like to use in my class.. So I'm new to this, could someone write a step-by-step of how do you instantiate, work and save the report ? I've been looking over its documentation but all the ones I found explains how to use it through wizzards.. but I need to use it programmatically. Thanks in advance..
  22. Thiago Alencar

    Crystal

    Ola, voce conhece alguma biblioteca que possa substituir o "CrystalDecisions" que voce usa? me parece que esta e' paga.. exista uma opcao equivalente open source? to precisando gerar uns arquivos pdf mas não estou encontrando nada p/ vb .net.. valeu!
  23. Ola! não é tão simples como parece, se você rodar esse codigo penso que encontrara problemas com os valores. não entendi muito bem sua declaracao do byte: Dim buffer As Byte() = {1, 0, 0, 1, 0, 1, 1, 1} pra mim isso seria: buffer(0) = 00000001 buffer(1) = 00000000 buffer(2) = 00000000 buffer(3) = 00000001 buffer(4) = 00000000 buffer(5) = 00000001 buffer(6) = 00000001 buffer(7) = 00000001 e não buffer(0) = 10010111 que acho que é o que você quis dizer...correto ou estou enganado? Estou com o mesmo tópico em um outro forum (thescripts.com) e ate agora ninguém postou um codigo com melhor performance que o que mostrei aqui. Se quiser dar uma olhada: http://www.thescripts.com/forum/showthread...900#post2587900 teve um cara que deu uma ideia bacana de usar o pow, porem a performance foi horrivel (como postei la no post do resultado, quase o dobro do tempo) qualquer ideia está valendo.. T+!
  24. Ei Anderson, to ligado que aquele codigo está nojento.. não to nos meus dias hoje como já disse heh poderia dar um exemplo da sua ideia em codigo? valeu!
  25. Qual e a melhor forma de se manipular bits? Estou numa situacao em que preciso organizar a ordem dos bits de um byte em um grande loop, então digo "melhor" no aspecto do performance, com menos instrucoes de conversoes possivel, mais instrucoes nativas do cpu (baixo nivel, tipo xor). Pra ser mais especifico: Eu tenho uma array shift Integer() que contem a ordem dos bits. E claro um array "buffer" de bytes. Por exemplo: Dim shift as Integer() {2,1,0,7,5,4,6,3} dim buffer as Byte() 'variable with data no caso acima e com um byte tipo 10010111, o mesmo deve se tornar 00110011. assim: ------------------------ De: 10010111 Para : 00110011 ------------------------ sguindo a ordem do "shift" pelos seus indices. Parece um problema simples, mas a performance e' realmente critica aqui (o loop e' imenso). Com o codigo que tenho atualmente consigo realizar isso mas construindo o byte com uma concatecanao de um objeto StringBuilder, porem a velocidade e' muito lenta: Private Sub ShiftMe(ByVal buffer As Byte(), ByVal shift As Integer()) 'Lets shift byte's columns Dim worker As New System.Text.StringBuilder Dim bkupArray As Boolean() ReDim bkupArray(7) For p As Integer = 0 To buffer.GetUpperBound(0) 'Separate each bit of byte bkupArray(0) = buffer(p) And 1 bkupArray(1) = (buffer(p) And 2) >> 1 bkupArray(2) = (buffer(p) And 4) >> 2 bkupArray(3) = (buffer(p) And 8) >> 3 bkupArray(4) = (buffer(p) And 16) >> 4 bkupArray(5) = (buffer(p) And 32) >> 5 bkupArray(6) = (buffer(p) And 64) >> 6 bkupArray(7) = (buffer(p) And 128) >> 7 'Create Shifted byte buffer(p) = 0 'clean old byte worker.Remove(0, worker.Length) worker.Append(bkupArray(shift(7)) & bkupArray(shift(6)) & bkupArray(shift(5)) & bkupArray(shift(4)) & bkupArray(shift(3)) & bkupArray(shift(2)) & bkupArray(shift(1)) & bkupArray(shift(0))) buffer(p) = StrToByteArray(worker.ToString) Next End Sub meu estoque de criatividade de logicas já se esgotou, se alguém tiver alguma dica está valendo.. valeu!
×
×
  • Criar Novo...