Fórum Como destruir um memo #373425

11/08/2009

0

Amigos, criei uma função para colocar os resultados de uma consulta em baixo de um edit, simulando a busca do google.
Ele funciona bem apesar de cintilar um pouco a tela em cada digitação.
Mas o problema é que não consigo destruir o memo.
A função que cria é esta:

procedure TfrmMenu.Buscador(form: TForm; ancora: TDBEdit; valor, tabela, campo: String);
var
dados:TMDOQuery;
P: TPoint;
begin
if not (valor = ´´) then
begin
dados := TMDOQuery.Create(dados);
dados.Database := DM.MDODB;
dados.Close;
dados.SQL.Clear;
dados.SQL.Add(´select ´+campo+´ from ´+tabela+´ where ´+campo+´ like ´+QuotedStr(valor+´¬´));
dados.Open;

lst := TMemo.Create(form);
lst.Parent := ancora.Parent;
lst.Left := ancora.Left; //P.X;
lst.Top := ancora.Top+22; // P.Y + 22;
lst.Width := ancora.Width;

while not dados.Eof do
begin
lst.Lines.Add(dados.Fields[0].AsString);
dados.Next;
end;
end;
end;

Já tentei destruir com Free ou Destroy, mas não tem jeito.
O memo não some.

Alguém teria uma dica ?

Grato.


Fonsenix

Fonsenix

Responder

Posts

12/08/2009

Osocram

o certo seria assim

lst := TMemo.Create(nil); <- mude aqui p nil
try                                  <- comece o try apos o create
lst.Parent := ancora.Parent;
lst.Left := ancora.Left; //P.X;
lst.Top := ancora.Top+22; // P.Y + 22;
lst.Width := ancora.Width;

while not dados.Eof do
begin
lst.Lines.Add(dados.Fields[0].AsString);
dados.Next;
end;
end;
end;
finally                      <- depois q fizer oq precisa com o lst fazer o finally
  FreeAndNil (lst);     <- aqui ele libera o objeto
end;



Responder

Gostei + 0

12/08/2009

Fonsenix

o certo seria assim
lst := TMemo.Create(nil); <- mude aqui p nil
try                                  <- comece o try apos o create
lst.Parent := ancora.Parent;
lst.Left := ancora.Left; //P.X;
lst.Top := ancora.Top+22; // P.Y + 22;
lst.Width := ancora.Width;

while not dados.Eof do
begin
lst.Lines.Add(dados.Fields[0].AsString);
dados.Next;
end;
end;
end;
finally                      <- depois q fizer oq precisa com o lst fazer o finally
  FreeAndNil (lst);     <- aqui ele libera o objeto
end;


Marcos,
primeiro deixa eu corrigir uma grande gafe, rs Eu criei uma Procedure e não uma função hehehe.
Segundo, muito obrigado mesmo por sua ajuda, funciona beleza, mas eu quero destruilo depois de um Enter por exemplo, que é quando o usuario terá escolhido uma opção.

Pode me dar mais essa dica?

Muito obrigado .


Responder

Gostei + 0

12/08/2009

Osocram

vc precisa ter o objeto instanciado em alguma variavel ou ter o ponteiro dele guardado para dar um free depois.

posta a declaração deste metodo e se possivel um exemplo de como é que vc utiliza este Memo antes do ´enter´

pq assim.... se vc utiliza este memo antes do ´enter´ então vc tem acesso ao objeto, então é so dar um FreeAndNil depois;


Responder

Gostei + 0

12/08/2009

Fonsenix

vc precisa ter o objeto instanciado em alguma variavel ou ter o ponteiro dele guardado para dar um free depois. posta a declaração deste metodo e se possivel um exemplo de como é que vc utiliza este Memo antes do ´enter´ pq assim.... se vc utiliza este memo antes do ´enter´ então vc tem acesso ao objeto, então é so dar um FreeAndNil depois;


Olha Marcos,
como ficou depois do que vc me passou.

procedure TfrmMenu.Buscador(form: TForm; ancora: TDBEdit; valor, tabela,
campo: String; cond: Integer);
var
dados:TMDOQuery;
begin
if cond = 1 then
begin
if not (valor = ´´) then
begin

dados := TMDOQuery.Create(dados);
dados.Database := DM.MDODB;
dados.Close;
dados.SQL.Clear;
dados.SQL.Add(´select ´+campo+´ from ´+tabela+´ where ´+campo+´ like ´+QuotedStr(valor+´¬´));
dados.Open;

lst := TMemo.Create(nil); //<- mude aqui p nil
try // <- comece o try apos o create
lst.Parent := ancora.Parent;
lst.Left := ancora.Left;
lst.Top := ancora.Top+22;
lst.Width := ancora.Width;

while not dados.Eof do
begin
lst.Lines.Add(dados.Fields[0].AsString);
dados.Next;
end;

finally // <- depois q fizer oq precisa com o lst fazer o finally
FreeAndNil (lst); // <- aqui ele libera o objeto
end;


end
else if cond = 0 then
begin
{
----> isso era uma tentativa de destruir o memo
}
//dados := nil;
dados.Free;

//lst := nil;
lst.Free();
end;
end;
end;

Então quando o cara começa a digitar aparece o memo filtrando conforme for digitando o resultado da pesquisa.
Aí vou fazer o código que com a seta pra baixo o foco mude para o memo criado então quando o usuario teclar enter vai selecionar o elemento do memo e destrui-lo.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar