label nao aparece no form

29/12/2005

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

Respostas

29/12/2005

Fernando_cunha

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


Responder Citar

29/12/2005

Michael

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

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


Responder Citar

29/12/2005

Fernando_cunha

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


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;



Responder Citar

29/12/2005

Michael

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


Responder Citar

29/12/2005

Fernando_cunha

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


Responder Citar

29/12/2005

Michael

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

[]´s


Responder Citar