Sim!
De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Ricardo
César Cardoso
Enviada em: quinta-feira, 20 de setembro de 2007 10:26
Para: delphi-br@yahoogrupos.com.br
Assunto: Re: RES: [delphi-br] Duvida ao trabalhar com TStringList
Obrigado pela explicação Davi. Realmente, vi que a minha solução não era uma
boa prática, apesar de funcional, mas não sabia exatamente o porque... Valeu
mesmo.
Então o conselho resumido seria: ao invés de utilizar uma Function, utilize uma
Procedure?
Desde já grato,
Ricardo.
Davi Eduardo Borges Wall [EMAIL PROTECTED] mailto:davi.wall%40mult.com.br
escreveu: Como que eu vou te explicar isso por e-mail. vou tentar com um
exemplo.
function xxx: TStringList;
Var
Sl: TStringList;
Begin
Sl := TStringList.Create;
Sl.Add('ola mundo');
Result := Sl;
FreeAndNil(SL);
End;
Veja este código, ele mostra exatamente o que você está fazendo. Agora imagine
que Result é uma string list que vai receber um ponteiro
De SL. Blz, ele recebe o ponteiro tranqüilo. Mas na próxima linha, vc está
destruindo SL. Result aponta para SL, SL foi destruído, logo Result é nil.
(lógico aristotélica RS..)
Quando vc for acessar o resultado desta função com certeza irá gerar uma AV. A
segunda maneira está correta pois vc está inserindo os dados no Result e não
inserindo um ponteiro
de outra StringList, mas não é uma boa prática de programação.
Ainda, a maneira mais elegante de se resolver esse problema é passar a
stringlist como referencia. Ficaria assim:
procedure xxx(Var SL : TStringList);
Begin
Sl.Add('ola mundo');
End;
Daí a chamada ficaria assim:
Var
Sl: TStringList;
Begin
Sl := TStringList.Create;
Xxx(SL);
FreeAndNil(SL);
End;
Sugiro que você estude passagem de parâmetros, mais especificamente passagem de
parâmetros por referencia.
[]'s
De: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
[mailto:delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br ]
Em nome de Ricardo César Cardoso
Enviada em: quinta-feira, 20 de setembro de 2007 09:10
Para: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
Assunto: [delphi-br] Duvida ao trabalhar com TStringList
Bom dia amigos da lista!
Tenho uma função que, ao fornecer doi parametros, retorna o resultado para um
TStringList. Não entrarei em muitos detalhes sobre a função pois acredito que
sejam descartáveis. O problema que tinha era que dentro da função eu criava um
TStringList temporário que capturava os dados e somente depois passava os dados
para o TStringList resultado. A estrutura era a seguinte:
/**/
Function Selecionar_Velocidade_Corte(var aMatEspecificacao,
aDimensao: String): TStringList;
Var
aSQLQuery : TSQLQuery;
Temp : TStringList;
Begin
// Cria o StringList Temporário
Temp := TStringList.Create;
aSQLQuery := TSQLQuery.Create(nil);
with aSQLQuery do
begin
SQLConnection := dmConexao.conPowerCalcXPLite;
with SQL do
begin
// Instruções de Preparação da consulta
end;
// Passagem de parâmetros
Open;
while not EOF do
begin
with Temp do
begin
// Insere os dados encontrados no StringList
end;
Next;
end
end;
// Repassa os dados para o Resultado
Result := Temp;
aSQLQuery.Free;
//Libera o StringList temporário
Temp.Free;
End;
/**/
Porém sempre que ia acessar algum item da StringList que foi preenchido pela
chamada a esta função (q foi criado fora da função) eu tinha um Access
Violation.
Pesquisei outros códigos que tinham conceito parecido e acabei por otimizar a
função tirando o TStringList temporário. O resultado final é:
/**/
Function Selecionar_Velocidade_Corte(var aMatEspecificacao,
aDimensao: String): TStringList;
Var
aSQLQuery : TSQLQuery;
Begin
aSQLQuery := TSQLQuery.Create(nil);
with aSQLQuery do
begin
SQLConnection := dmConexao.conPowerCalcXPLite;
with SQL do
begin
// Instruções de Preparação da consulta
end;
// Passagem de parâmetros
Open;
while not EOF do
begin
with Result do
begin
// Insere os dados encontrados no StringList
end;
Next;
end
end;
aSQLQuery.Free;
End;
/**/
Tudo funcionou como o esperado, mas acho que perdi alguma coisa. Alguém poderia
me explicar pq não conseguia acessar o StringList usando a primeira forma da
função?
Desculpem o texto longo...
Sds,
Ricardo
Flickr agora em português. Você clica, todo mundo vê. Saiba mais.
[As partes desta mensagem que não continham texto foram removidas]
[As partes desta mensagem que não continham texto foram removidas]