label nao aparece no form
29/12/2005
0
function TMySQL.fProcurar(Sender: TObject; tb: string; vl: string): TADOQuery; var Q: TADOQuery; Fm: TForm; Lbl: TLabel; Edt: TEdit; begin Fm:= TForm.Create(Application); Fm.Caption:= ´Pesquisar por ´ + TLabel(Sender).Caption + ´ : ´ + vl; Fm.BorderStyle:= bsDialog; Fm.Position:= poMainFormCenter; Fm.Height:= 200; Fm.Width:= 300; Fm.ShowModal; Lbl:= TLabel.Create(Fm); Lbl.Parent:= Fm; Lbl.Caption:= ´TESTE´; Lbl.Top:= 10; Lbl.Left:= 10; end;
amigos, alguem pode me dizer pq o form é criado mas a label nao aparece no dito form!!?????
abraços!!!
Fernando_cunha
Posts
29/12/2005
Fernando_cunha
[]s
29/12/2005
Michael
Fm:= TForm.Create(nil);
Da mesma forma, coloque o restante do código dentro de um bloco [b:a03cf7838b]try..finally[/b:a03cf7838b] para garantir a liberação do objeto.
Fm:= TForm.Create(nil); try ... finally Fm.Release; // Não use Free para forms end;
Para mais informações acerca de criação de objetos em run-time, consulte [url=http://forum.devmedia.com.br/viewtopic.php?t=68285&]este link[/url], e [url=http://delphi.about.com/od/adptips2005/qt/nilselfapp.htm]este[/url] tbm.
[]´s
29/12/2005
Fernando_cunha
como foi sugerido pelo colega Michael
criei o form com Owner = nil ...
até hoje nao entendo direito algumas coisas no delphi.
Esta funcao faz parte de uma classe, chamada TMySQL que é proveniente da classe TADOConnection ...
vejamos ...
no trecho abaixo, Q.Connection recebe que valor? ou melhor, Self faz referencia a quem???
em
Q:= TADOQuery.Create(Self);
Self faz referencia a quem nesse trecho!??
Q:= TADOQuery.Create(Self); Q.Connection:= Self; Q.Close; Q.SQL.Clear; Q.SQL.Text:= ´Select * from ´ + tb + ´ where ´ + Tlabel
o codigo ta funcionando, mas nao tenho certeza se nao esta ficando nada de sujeira na memoria ... vcs teriam alguma sugestao???
os componentes label , edits, e buttons dentro desse form tenho certeza de que estao liberados pois seu Owner é o proprio form, entao quando este for fechado os componentes serao liberados da memoria, ou nao??
Aceito sugestoes de melhorias ...
[]ssss
function TMySQL.fProcurar(Sender: TObject; tb: string): TADOQuery; var Q: TADOQuery; Fm: TForm; Edt: TEdit; begin Fm:= TForm.Create(nil); try Fm.Caption:= ´Pesquisar por ´ + TLabel(Sender).Caption + ´ : ´; Fm.BorderStyle:= bsDialog; Fm.Position:= poMainFormCenter; Fm.Height:= 200; Fm.Width:= 300; with TLabel.Create(Fm) do begin Parent := Fm; Caption := TLabel(Sender).Caption + ´ :´; Left := 10; Top := 10; end; Edt:= TEdit.Create(Fm); with Edt do begin Parent:= Fm; Left:= 10; Top:= 25; end; with TBitBtn.Create(Fm) do begin Parent:= Fm; Left:= 10; Top:= 55; width:= 50; Kind := bkOk; ModalResult:= MrOk; Caption:= ´´; //Glyph.LoadFromFile(´search and replace.bmp´); end; with TBitBtn.Create(Fm) do begin Parent:= Fm; Left:= 65; Top:= 55; width:= 50; Kind := bkCancel; ModalResult:= MrCancel; Caption:= ´´; //Glyph.LoadFromFile(´search and replace.bmp´); end; if Fm.ShowModal = MrOk then begin try if Edt.Text <> ´´ then begin Q:= TADOQuery.Create(Self); Q.Connection:= Self; Q.Close; Q.SQL.Clear; Q.SQL.Text:= ´Select * from ´ + tb + ´ where ´ + Tlabel(Sender).Caption + ´=´ + QuotedStr(Edt.Text); ShowMessage(Q.SQL.Text); Q.Open; Result:= Q; end; finally end; end; finally Fm.Release; end; end;
29/12/2005
Michael
Sobre os componentes, sim eles são destruídos qdo o form for. E com relação a [b:98f264976f]Self[/b:98f264976f], ele se refere à instâncio da classe a qual o método pertence. No seu exemplo, Self é a instância naquele momento de TMySQL.
Usar Self no código mencionado por vc é perigoso. Veja pq: vc está dizendo q o TADOQuery criado será destruído quando a instância da classe TMySQL for. Mas um problema pode acontecer se vc destruí-lo antes, pois a classe vai tbm tentar fazê-lo posteriormente. Isso pode introduzir memory leaks na sua aplicação.
Eu criaria TADOQuery passando nil, e, onde for usar a função fProcurar, faria um try..finally. Veja
var Q: TADOQuery; begin Q := MySQL.fProcurar(algum_objeto, algum_valor); try // faz alguma coisa com Q finally Q.Free; end;
Sempre q vc criar alguma coisa via código, vc deve saber quando ela vai ser destruída. No caso dos componentes, vc pode passar o Owner deles como o form, pq sabe q o form será liberado da memória logo em seguida, levando os componentes com ele. Já no caso da query, vc pode chamar o método [b:98f264976f]fProcurar [/b:98f264976f]várias vezes e a cada chamada uma nova instância do objeto TADOQuery seria alocada na memória, e só sairão de lá quando TMySQL.Destroy for chamado ou se vc o fizer antes. Essa dúvida de quem vai destruir o objeto, além de não ser uma boa prática de programação, pode alocar coisas na memória desnecessariamente. Já usando nil e try..finally vc evita esses memory leaks.
Novamente, leia os artigos mencionados. Eles acrescentam muito ao conhecimento de qualquer programador Delphi, experiente ou não.
[]´s
29/12/2005
Fernando_cunha
mas valeu pelas dicas ...
[]s
29/12/2005
Michael
[]´s
Clique aqui para fazer login e interagir na Comunidade :)