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:[EMAIL PROTECTED] Em nome de Ricardo 
César Cardoso
Enviada em: quinta-feira, 20 de setembro de 2007 09:10
Para: delphi-br@yahoogrupos.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]

Responder a