Como destruir um memo
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.
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
Curtidas 0
Respostas
Osocram
11/08/2009
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;
GOSTEI 0
Fonsenix
11/08/2009
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 .
GOSTEI 0
Osocram
11/08/2009
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;
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;
GOSTEI 0
Fonsenix
11/08/2009
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.
GOSTEI 0