Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Ricardo César Cardoso
Muito obrigado João. Vou rever o código e depois passo como ficou. 

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]



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Joao Morais
Ricardo César Cardoso wrote:
> * Poderia então deixar o bloco onde uso o TStringList como abaixo?
> 
>  /***/
> Var
> SLFinal : TStringList;
>   Especificacao : String;
>   Dimensao : Real;
>   VC_Maximo : Real;
>   VC_Minimo : Real;
>   Area_Corte : Real;
> Begin
>// SLFinal := TStringList. Create; exclui esta linha
>   
>   { bloco de comandos }
>   
>   SLFinal := Seleciona_Velocidad e_Corte(Especificacao, Dimensao);
>   
>   { bloco de comandos }
>   
>   VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5] );
>   VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6] );
>   
>  {finalização}
>  SLFinal.Free;
>   
> End;
>  /***/
> 
> Pela "regra" da instanciação e liberação seria isso, mas minha
> dúvida é se procede e se esta é uma boa prática.

Pela regra vai funcionar, você tem um create dentro da função e tem um 
free fora dela, mas para ficar zero-bala, você pode escolher uma destas 
abordagens:

1. renomeie a função para algo como CriaListaAlgumaCoisa; assim o 
próprio nome da função dirá que ela está criando uma lista e você terá 
que dar cabo de destruí-la;

2. use uma procedure para que o create/free fique no mesmo bloco;

Se você me perguntasse, eu responderia que neste caso eu prefiro a opção 2.

E para qualquer um dos casos, sempre utilize um bloco protegido entre o 
create e o free. Então você terá isto aqui:

VLista := CriaLista(Especificacao, Dimensao);
try
   // trabalha com VLista
finally
   VLista.Free;
end;

ou terá isto aqui:

VLista := TStringList.Create;
try
   Seleciona_...(VLista, Especificacao, Dimensao);
finally
   VLista.Free;
end;

Caso o processamento gere alguma exception, você não terá vazamento de 
memória.

Se usar CriaLista, é bom usar um bloco protegido lá também, então:

function CriaLista...(Espefic, Dim): TStringList;
begin
   Result := TStringList.Create;
   try
 // popula Result
   except
 FreeAndNil(Result);
 raise;
   end;
end;

--
Joao Morais


Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Ricardo César Cardoso
João... Muito obrigado mesmo, por exclarecer a dúvida que tinha. Com isso já 
consigo entender perfeitamente, mas gostaria de apenas confirmar uma última 
coisa:

* Poderia então deixar o bloco onde uso o TStringList como abaixo?

 /***/
Var
SLFinal : TStringList;
  Especificacao : String;
  Dimensao : Real;
  VC_Maximo : Real;
  VC_Minimo : Real;
  Area_Corte : Real;
Begin
   // SLFinal := TStringList. Create; exclui esta linha
  
  { bloco de comandos }
  
  SLFinal := Seleciona_Velocidad e_Corte(Especificacao, Dimensao);
  
  { bloco de comandos }
  
  VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5] );
  VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6] );
  
 {finalização}
 SLFinal.Free;
  
End;
 /***/

Pela "regra" da instanciação e liberação seria isso, mas minha dúvida é se 
procede e se esta é uma boa prática.

Desde já grato,
Ricardo

   Flickr agora em português. Você clica, todo mundo vê. Saiba mais.

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Joao Morais

Ricardo César Cardoso wrote:
> Olá João e obrigado pela resposta.
> 
> Na verdade eu uso o que chamei de SLFinal "externamente" ou seja,
> a função "Seleciona_Velocidade_Corte" alimenta o SLFinal e depois
> de alimentado, eu uso dois itens desse SLFinal como base pra
> cálculo em outros pontos do código da procedure onde ele foi
> inserido (evento OnClick de um botão).

Olá Ricardo,

Você não está alimentando SLFinal, você está criando uma nova lista e 
está perdendo a referência à primeira neste trecho aqui:

=
   SLFinal := TStringList.Create;
   { bloco de comandos }
   SLFinal := Seleciona_Velocidade_Corte(Especificacao, Dimensao);
=

Se você quiser aproveitar a lista que você criou nesta primeira linha, 
tem que passá-la como parâmetro tal qual o Davi sugeriu, e então 
declarar uma procedure. O trecho ficaria assim:

=
   SLFinal := TStringList.Create;
   { bloco de comandos }
   Seleciona_Velocidade_Corte(SLFinal, Especificacao, Dimensao);
=

Dentro de Seleciona_Velocidade_Corte você não vai mais precisar disto aqui:

=
Result := TStringList.Create;
with Result do
begin
   ...
=

ao invés disto, o trecho ficaria assim:

=
ASLFinal.Clear;
ASLFinal.Add(...);
...
=

este ASLFinal que eu citei acima é o primeiro parâmetro da sua procedure 
Seleciona_Velocidade_Corte.

Daí então, no final do bloco principal, você executa o SLFinal.Free tal 
qual você fez. Esta é a única string list que existe em toda a sua rotina.

Para você não se perder nos create/free, analisa da seguinte forma: todo 
create deve ter um free correspondente. Sempre. E depois de chamar o 
Free, você não pode mais acessar o objeto. Então a cada Create que você 
encontrar no seu código, analisa aonde que está o Free que diz respeito 
a ele. Tem sempre que existir um, nem que seja em outro lugar, no 
destructor, no owner, etc.

--
Joao Morais




> Essa função seleciona
> vários parametros pertinentes ao cálculo, mas ao invés de fazer
> várias funções menores para pegar os parâmetros, fiz uma unica
> função que me tras todos os parametros que preciso e populo o
> TStringList. Depois uso esse conteúdo do TStringList como for
> necessário.
> 
> Segue o código editado de Seleciona_Velocidade_Corte:
> 
> //
> 
> Function Selecionar_Velocidade_Corte(var aMatEspecificacao,
>  aDimensao: String): TStringList;
>  Var
>aSQLQuery : TSQLQuery;
> 
>  Begin
> 
>aSQLQuery := TSQLQuery.Create(nil);
> 
> 
>with aSQLQuery do
>begin
>  SQLConnection := dmConexao.conConexao;
> 
>  with SQL do
>  begin
> 
> // Instruções SQL de consulta para popular o Result
> // Essa instrução retorna um único registro, cujos 
> // Campos alimentam o TStringList
> 
>  end;
> 
>  Params[0].AsString := aMatEspecificacao;
>  Params[1].AsFloat  := StrToFloat(aDimensao);
> 
>  Open;
> 
>  Result := TStringList.Create;
>with Result do
>begin
>  Add(Fields[0].AsString);
>  Add(Fields[1].AsString);
>  Add(Fields[2].AsString);
>  Add(Fields[3].AsString);
>  Add(Fields[4].AsString);
>  Add(Fields[5].AsString);
>  Add(Fields[6].AsString);
>end;
> 
> 
>end;
> 
>aSQLQuery.Free;
> 
>  End;
> 
> //
> 
> Então aliado a esta função tenho o código  que demonstrei na mensagem 
> anterior:
> 
> /***/
> Var
>   SLFinal : TStringList;
>   Especificacao : String;
>   Dimensao : Real;
>   VC_Maximo : Real;
>   VC_Minimo : Real;
>   Area_Corte : Real;
> Begin
>   SLFinal := TStringList.Create;
>   
>   { bloco de comandos }
>  
>   SLFinal := Seleciona_Velocidade_Corte(Especificacao, Dimensao);
>  
>   { bloco de comandos }
>   
>   VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5]);
>   VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6]);
>   {finalização}
>   SLFinal.Free;
> 
> End;
> /***/
> 
> Não sei se compliquei ainda mais, mas estou usando exatamente desta maneira 
> como descrevi. Aparentemente funciona, mas como vcs reportaram que não é uma 
> boa prática, gostaria de saber como seria o correto e assim melhorar este 
> código.
> 
> Grato,
> Ricardo.
> 


Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Ricardo César Cardoso
Olá João e obrigado pela resposta.

Na verdade eu uso o que chamei de SLFinal "externamente" ou seja, a função 
"Seleciona_Velocidade_Corte" alimenta o SLFinal e depois de alimentado, eu uso 
dois itens desse SLFinal como base pra cálculo em outros pontos do código da 
procedure onde ele foi inserido (evento OnClick de um botão). Essa função 
seleciona vários parametros pertinentes ao cálculo, mas ao invés de fazer 
várias funções menores para pegar os parâmetros, fiz uma unica função que me 
tras todos os parametros que preciso e populo o TStringList. Depois uso esse 
conteúdo do TStringList como for necessário.

Segue o código editado de Seleciona_Velocidade_Corte:

//

Function Selecionar_Velocidade_Corte(var aMatEspecificacao,
 aDimensao: String): TStringList;
 Var
   aSQLQuery : TSQLQuery;

 Begin

   aSQLQuery := TSQLQuery.Create(nil);


   with aSQLQuery do
   begin
 SQLConnection := dmConexao.conConexao;

 with SQL do
 begin

// Instruções SQL de consulta para popular o Result
// Essa instrução retorna um único registro, cujos 
// Campos alimentam o TStringList

 end;

 Params[0].AsString := aMatEspecificacao;
 Params[1].AsFloat  := StrToFloat(aDimensao);

 Open;

 Result := TStringList.Create;
   with Result do
   begin
 Add(Fields[0].AsString);
 Add(Fields[1].AsString);
 Add(Fields[2].AsString);
 Add(Fields[3].AsString);
 Add(Fields[4].AsString);
 Add(Fields[5].AsString);
 Add(Fields[6].AsString);
   end;


   end;

   aSQLQuery.Free;

 End;

//

Então aliado a esta função tenho o código  que demonstrei na mensagem anterior:

/***/
Var
  SLFinal : TStringList;
  Especificacao : String;
  Dimensao : Real;
  VC_Maximo : Real;
  VC_Minimo : Real;
  Area_Corte : Real;
Begin
  SLFinal := TStringList.Create;
  
  { bloco de comandos }
 
  SLFinal := Seleciona_Velocidade_Corte(Especificacao, Dimensao);
 
  { bloco de comandos }
  
  VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5]);
  VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6]);
  {finalização}
  SLFinal.Free;

End;
/***/

Não sei se compliquei ainda mais, mas estou usando exatamente desta maneira 
como descrevi. Aparentemente funciona, mas como vcs reportaram que não é uma 
boa prática, gostaria de saber como seria o correto e assim melhorar este 
código.

Grato,
Ricardo.

   Flickr agora em português. Você clica, todo mundo vê. Saiba mais.

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Joao Morais
Ricardo César Cardoso wrote:
> Bom dia João!

Bom dia Ricardo,

> Na verdade o StringList "Final" (o que é alimentado pela função
> "Seleciona_Velocidade_Corte") serve apenas como um "container"
> de dados que serão utilizados depois em alguns cálculos, mas num
> primeiro momento apenas dois itens desse TStringList me interessam,
> os itens 5 e 6.
> 
> O correto seria criar classes mais específicas para a minha situação,
> mas tenho que testar a lógica da aplicação antes, gostaria de fazer
> algo mais simples, usando as classes do Delphi antes de criar classes
> de negócio

Não necessariamente. As classes do Delphi servem muito bem como 
containeres genéricos. Se você precisar guardar esta lista para outros 
processamentos futuros, então sim, um container personalizado por você 
pode ser bem útil. Só tenho algumas dúvidas no seu código:

> /**/
> Var
>   SLFinal : TStringList;
>   Especificacao : String;
>   Dimensao : Real;
>   VC_Maximo : Real;
>   VC_Minimo : Real;
>   Area_Corte : Real;
> Begin
>   SLFinal := TStringList.Create;
> 
>   { bloco de comandos }

Para que você usa SLFinal? Você destroi ou copia a string list dentro do 
bloco acima?

>   SLFinal := Seleciona_Velocidade_Corte(Especificacao, Dimensao);
> 
>   { bloco de comandos }
>   
>   VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5]);
>   VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6]);

Faltou destruir a string list antes de terminar a rotina, ou faltou 
copiá-la para um membro da classe.

Se você cria a string list especialmente para fazer o cálculo e depois 
ela é destruida, a minha recomendação é você implementar assim:

SLFinal := TStringList.Create;
try
   // comandos
   Seleciona_Velocidade(SLFinal, Especificacao, Dimensao);
   VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5]);
   VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6]);
finally
   SLFinal.Free;
end;

Se você utilizar a string list fora desta rotina, então a recomendação é 
a seguinte:

FreeAndNil(FListaFinal);
FListaFinal := CriaListaVelocidade(Especificacao, Dimensao);
VC_Maximo := Area_Corte / StrToFloat(FListaFinal.Strings[5]);
VC_Minimo := Area_Corte / StrToFloat(FListaFinal.Strings[6]);

...

destructor TSuaClasse.Destroy;
begin
   FListaFinal.Free;
   inherited;
end;

--
Joao Morais





> End;
> /**/
> 
> Espero ter sido mais claro agora.
> 
> Desde já grato,
> Ricardo.
> 
>Flickr agora em português. Você clica, todo mundo vê. Saiba mais.
> 
> [As partes desta mensagem que não continham texto foram removidas]
> 
> 
> 



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-21 Por tôpico Ricardo César Cardoso
Bom dia João!

Na verdade o StringList "Final" (o que é alimentado pela função 
"Seleciona_Velocidade_Corte") serve apenas como um "container" de dados que 
serão utilizados depois em alguns cálculos, mas num primeiro momento apenas 
dois itens desse TStringList me interessam, os itens 5 e 6.

O correto seria criar classes mais específicas para a minha situação, mas tenho 
que testar a lógica da aplicação antes, gostaria de fazer algo mais simples, 
usando as classes do Delphi antes de criar classes de negócio

Basicamente eu tenho a seguinte sequencia (desculpe se estou repetindo o q já 
escrevi, mas esqueci de detalhar na mensagem anterior):

/**/
Var
  SLFinal : TStringList;
  Especificacao : String;
  Dimensao : Real;
  VC_Maximo : Real;
  VC_Minimo : Real;
  Area_Corte : Real;
Begin
  SLFinal := TStringList.Create;

  { bloco de comandos }
  
  SLFinal := Seleciona_Velocidade_Corte(Especificacao, Dimensao);

  { bloco de comandos }
  
  VC_Maximo := Area_Corte / StrToFloat(SLFinal.Strings[5]);
  VC_Minimo := Area_Corte / StrToFloat(SLFinal.Strings[6]);


End;
/**/

Espero ter sido mais claro agora.

Desde já grato,
Ricardo.

   Flickr agora em português. Você clica, todo mundo vê. Saiba mais.

[As partes desta mensagem que não continham texto foram removidas]



RES: RES: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Davi Eduardo Borges Wall
Blz, 

eu não havia entendido quando vc tinha falado " alterar o endereço do objeto" .

 

Mas estávamos falando a mesma coisa então!!!

 

[]'s

 

De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Joao 
Morais
Enviada em: quinta-feira, 20 de setembro de 2007 11:38
Para: delphi-br@yahoogrupos.com.br
Assunto: Re: RES: RES: [delphi-br] Duvida ao trabalhar com TStringList

 

Davi Eduardo Borges Wall wrote:
> Essa é a diferença. E há casos que vc não consegue trabalhar com o
> ponteiro do ponteiro.
> 
> Houve um caso aqui mesmo na lista, onde se não me engano o cara
> passa uma variável (não instanciada) do tipo form para uma procedure
> e dentro da procedure ele usa essa variável para criar o form de
> acordo com o form que ele quer.
> 
> Dava AV no retorno. foi aí que fui pesquisar sobre isso, pois achei
> interessante.

Foi o que eu havia falado. Só precisa quando é necessário alterar o 
endereço do objeto (no seu exemplo, criar um form). Quando precisa 
alterar apenas o objeto, é irrelevante passar por valor ou referência.

--
Joao Morais

 



[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Joao Morais
Ricardo César Cardoso wrote:
> Não sei se o Yahoo trocou as mensagens, mas ambos funcionam. O fato é que eu 
> crio o StringList "final" fora das functions. Seria algo assim:
> 
> Var
>   SLFinal : TStringList;
> 
> Begin
>SLFinal := TStringList.Create;
>{ bloco de comandos }
> 
>SLFinal := Selecionar_Velocidade_Corte(Especificacao, Dimensao);
> End;
> 
> e antes desse código e no meu caso em outra unit está declarada a function 
> que cito na 1ª mensagem.
> 
> Isso muda alguma coisa? Fiz uns testes aqui e funcionou... mas não fiz como 
> vc passou.

Neste caso você não está utilizando SLFinal. Esta variável está apenas 
recebendo um objeto, que por sinal foi destruído -- vide Temp.Free 
dentro da sua função.

Outro problema, você criou um string list, associou ao SLFinal e perdeu 
a referência a ele quando fez a atribuição com o resultado da função. Em 
alguns pontos do código você está tratando objetos como um número ou uma 
ansi string. Vou citar alguns exemplos, espero não ser inconveniente com 
isto.

VLista := TStringList.Create;
Result := VLista;
VLista.Free;

aqui Result, bem como VLista, apontam para um objeto recém destruído e 
isto vai gerar um AV assim que você tentar utilizá-lo. Quando você 
associa uma variável a outra, você não copia informação mas apenas o 
endereço daonde o objeto se encontra. Outro exemplo:

VLista := TStringList.Create;
Result := VLista;
writeln(Result.Count); // retorna 0
VLista.Add('1');
writeln(Result.Count); // retorna 1
VLista.Free;
writeln(Result.Count); // AV

Um último exemplo para não ficar muito xarope:

VLista := TStringList.Create;
VLista := ManipulaLista(Especificacao, Dimensao);

Você perdeu a referência ao StringList que você criou e terá um 
vazamento de memória independente da forma que ManipulaLista seja 
implementado. Por outro lado, ManipulaLista não recebe referência alguma 
da sua StringList, a variável Result daquela função tem valor inicial 
indefinido.

Se você quiser e puder detalhar melhor o que precisa ser feito, talvez 
saiam algumas idéias legais para a implementação.

--
Joao Morais


Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Ricardo César Cardoso
Não sei se o Yahoo trocou as mensagens, mas ambos funcionam. O fato é que eu 
crio o StringList "final" fora das functions. Seria algo assim:

Var
  SLFinal : TStringList;

Begin
   SLFinal := TStringList.Create;
   { bloco de comandos }

   SLFinal := Selecionar_Velocidade_Corte(Especificacao, Dimensao);
End;

e antes desse código e no meu caso em outra unit está declarada a function que 
cito na 1ª mensagem.

Isso muda alguma coisa? Fiz uns testes aqui e funcionou... mas não fiz como vc 
passou.

Sds,
Ricardo.

Joao Morais <[EMAIL PROTECTED]> escreveu:   
 No primeiro exemplo você cria o StringList e depois o destroi. No 
 segundo você sequer cria o StringList. Nenhum dos dois deveria funcionar.
 
 A estruturada sua função deve ser algo assim:
 
 function Selecionar(...): TStringList;
 begin
Result := TStringList.Create;
try
  // popula o Result, que é um StringList;
except
  FreeAndNil(Result);
  raise;
end;
 end;
 
 e o método que chama Selecionar() irá receber um novo objeto, que é o 
 StringList, e será o responsável por destruí-lo tão logo não seja mais 
 necessário.
 
 --
 Joao Morais
 
 Ricardo César Cardoso wrote:
 > 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]



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Joao Morais

No primeiro exemplo você cria o StringList e depois o destroi. No 
segundo você sequer cria o StringList. Nenhum dos dois deveria funcionar.

A estruturada sua função deve ser algo assim:

function Selecionar(...): TStringList;
begin
   Result := TStringList.Create;
   try
 // popula o Result, que é um StringList;
   except
 FreeAndNil(Result);
 raise;
   end;
end;

e o método que chama Selecionar() irá receber um novo objeto, que é o 
StringList, e será o responsável por destruí-lo tão logo não seja mais 
necessário.

--
Joao Morais



Ricardo César Cardoso wrote:
> 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
> 


Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Ricardo César Cardoso
Tb tinha feito esse teste Márcio, mas tive os mesmo problemas. 

Valew pela atenção,
Ricardo.

Marcio - Aquid <[EMAIL PROTECTED]> escreveu:   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.
 





   Flickr agora em português. Você clica, todo mundo vê. Saiba mais.

[As partes desta mensagem que não continham texto foram removidas]



Re: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Marcio - Aquid
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]



Re: RES: [delphi-br] Duvida ao trabalhar com TStringList [RESOLVIDO]

2007-09-20 Por tôpico Ricardo César Cardoso
Obrigado pelas dicas, paciência e compreensão João (sempre vc :) ) e Davi

Até +
Ricardo.

   Flickr agora em português. Você clica, todo mundo vê. Saiba mais.

[As partes desta mensagem que não continham texto foram removidas]



Re: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Joao Morais
Ricardo César Cardoso wrote:
> 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?

O meu pitaco é: se você cria um string list que continuará em memória, 
use uma função, de preferência com um nome sugestivo como CriaLista.

Se a lista é temporária, passe-a para uma procedure, ou uma função 
boolean para indicar se ocorreu tudo ok ou não. A procedure deve receber 
a lista já instanciada e vai apenas populá-la. Ex de uso:

begin
   VLista := TStringList.Create;
   try
 UsaLista(VLista);
 // algum processamento na lista
   finally
 VLista.Free;
   end;
end;

--
Joao Morais


Re: RES: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Joao Morais
Davi Eduardo Borges Wall wrote:
> Essa é a diferença. E há casos que vc não consegue trabalhar com o
> ponteiro do ponteiro.
> 
> Houve um caso aqui mesmo na lista, onde se não me engano o cara
> passa uma variável (não instanciada) do tipo form para uma procedure
> e dentro da procedure ele usa essa variável para criar o form de
> acordo com o form que ele quer.
> 
> Dava AV no retorno. foi aí que fui pesquisar sobre isso, pois achei
> interessante.

Foi o que eu havia falado. Só precisa quando é necessário alterar o 
endereço do objeto (no seu exemplo, criar um form). Quando precisa 
alterar apenas o objeto, é irrelevante passar por valor ou referência.

--
Joao Morais



RES: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Davi Eduardo Borges Wall
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]



RES: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Davi Eduardo Borges Wall
Não necessariamente Joao.

 

Quando vc passa um objeto como parâmetro, é criado um novo ponteiro (4 bytes)  
que aponta para o objeto.
Quando vc passa por referencia, vc aponta diretamente para o objeto.

 

Essa é a diferença. E há casos que vc não consegue trabalhar com o ponteiro do 
ponteiro.

Houve um caso aqui mesmo na lista, onde se não me engano o cara passa uma 
variável (não instanciada) do tipo form para uma procedure
e dentro da procedure ele usa essa variável para criar o form de acordo com o 
form que ele quer.

Dava AV no retorno. foi aí que fui pesquisar sobre isso, pois achei 
interessante.

 

Também não acho uma solução "elegante", mas foi o que ocorreu.

 

De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em nome de Joao 
Morais
Enviada em: quinta-feira, 20 de setembro de 2007 10:23
Para: delphi-br@yahoogrupos.com.br
Assunto: Re: RES: [delphi-br] Duvida ao trabalhar com TStringList

 

Davi Eduardo Borges Wall wrote:
> Sugiro que você estude passagem de parâmetros, mais especificamente
> passagem de parâmetros por referencia.

Para objetos é indiferente passar por valor ou por referência, a menos 
que você precise alterar o endereço do objeto.

--
Joao Morais

 



[As partes desta mensagem que não continham texto foram removidas]



Re: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Ricardo César Cardoso
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]> 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:[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]



Res: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Andre Luis Silveria
Na realidade vc não colocava os dados do temporário no result, e sim 
passava o temporário para ele, e como vc destruia o temporário se perdia o 
vinculo ...

 

 GYNCOWBOY 
 André Luis da Silveira


- Mensagem original 
De: Ricardo César Cardoso <[EMAIL PROTECTED]>
Para: delphi-br@yahoogrupos.com.br
Enviadas: Quinta-feira, 20 de Setembro de 2007 9:09:53
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_Velocida de_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.conPowerC alcXPLite;



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_Velocida de_Corte( var aMatEspecificacao,

 aDimensao: String): TStringList;

 Var

   aSQLQuery : TSQLQuery;

  

 Begin



aSQLQuery := TSQLQuery.Create( nil);



with aSQLQuery do

   begin

 SQLConnection := dmConexao.conPowerC alcXPLite;



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]






  
























  Flickr agora em português. Você clica, todo mundo vê.
http://www.flickr.com.br/

[As partes desta mensagem que não continham texto foram removidas]



Re: RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Joao Morais
Davi Eduardo Borges Wall wrote:
> Sugiro que você estude passagem de parâmetros, mais especificamente
> passagem de parâmetros por referencia.

Para objetos é indiferente passar por valor ou por referência, a menos 
que você precise alterar o endereço do objeto.

--
Joao Morais


RES: [delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Davi Eduardo Borges Wall
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]



[delphi-br] Duvida ao trabalhar com TStringList

2007-09-20 Por tôpico Ricardo César Cardoso
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]