Jump to content
Fórum Script Brasil

Thiago Alencar

Membros
  • Posts

    31
  • Joined

  • Last visited

About Thiago Alencar

Thiago Alencar's Achievements

0

Reputation

  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.
×
×
  • Create New...