No lugar de Result := Sl;
Use Result.AddStrings(Sl); Márcio ----- Original Message ----- From: Davi Eduardo Borges Wall To: delphi-br@yahoogrupos.com.br Sent: Thursday, September 20, 2007 9:51 AM Subject: RES: [delphi-br] Duvida ao trabalhar com TStringList 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] [As partes desta mensagem que não continham texto foram removidas]