Array
(
)

label nao aparece no form

Fernando_cunha
   - 29 dez 2005

#Código

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
   - 29 dez 2005

disfarcem a pergunta ridicula .. ja achei o erro!!
[]s


Michael
   - 29 dez 2005

Uma dica: se este form que vc está criando será destruído posteriormente, tbm por vc, use nil no seu Owner, e não Application.

#Código

Fm:= TForm.Create(nil);


Da mesma forma, coloque o restante do código dentro de um bloco try..finally para garantir a liberação do objeto.

#Código
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


Fernando_cunha
   - 29 dez 2005

abaixo segue uma funcao que estou criando ...

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!??


#Código

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

#Código
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;



Michael
   - 29 dez 2005

Veja os links que eu mencionei acima para entender como o Delphi funciona nesse sentido. Vale a pena mesmo. ;-)

Sobre os componentes, sim eles são destruídos qdo o form for. E com relação a Self, 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

#Código

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 fProcurar 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


Fernando_cunha
   - 29 dez 2005

valeu cara, acho que antes de sair perguntando tenho que ler mesmo e tentar desenvolver sozinho ...
mas valeu pelas dicas ...
[]s


Michael
   - 29 dez 2005

Não há problema em vc perguntar. Eu só sugeri a leitura de dois artigos excelentes que vão aprimorar o seu conhecimento. ;-)

[]´s