Função que retorne um TStringList

Delphi

09/11/2006

Salve pessoal,
Estou precisando desenvolver uma função e seu retorno tem que ser to tipo TStringList ... mais ou menos assim:

function RetornaNomes : TStringList;
begin

Result := TStringList.Create;
try
Result.Add( ´Marcelo´ );
Result.Add( ´Maria´ );
finally
FreeAndNil( Result ); // Não posso fazer isso vai dar pauu
end;

end;


Depois para usar esta função queria algo assim:

Memo1.lines.add( RetornaNomes.Strings[0] );
Memo1.lines.add( RetornaNomes.Strings[1] );



Bom isso que eu fiz ai sei que esta totalmente errado ... nao vai funcionar mas acho que da para ter uma ideia do que eu estou querendo.
Se alguem puder dar um help ai ... valewwww


Mmoreira

Mmoreira

Curtidas 0

Respostas

Tnaires

Tnaires

09/11/2006

Olá
A função deve retornar o StringList sem destruí-la. É responsabilidade do método que chamou a função destruir o objeto passado como resultado.
with RetornaNomes do
  try
    // Faça algo
  finally
    Free;
  end;

Abraços


GOSTEI 0
Tnaires

Tnaires

09/11/2006

Detalhando mais o exemplo:
function RetornaNomes: TStringList;
begin
  Result := TStringList.Create;
  Result.Add( ´Marcelo´ );
  Result.Add( ´Maria´ );
end;

with RetornaNomes do
  try
    Memo1.Lines.Add( Strings[0] );
    Memo1.Lines.Add( Strings[1] );
  finally
    Free;
  end;

Abraços


GOSTEI 0
Martins

Martins

09/11/2006

Marcelo, vc pode usar a dica do colea tnaires, assim vc acaba com o ´Access violation´, pq o free q vc está utilizando dentro de sua função depois do Finally está provocando isso.

Não sei exatamente o q vc pretende mas, estarei on-line amanhã lá pelas 9:30 no MSN.

Boa sorte


GOSTEI 0
Mmoreira

Mmoreira

09/11/2006

Vou tentar explicar o que eu preciso fazer:

Vou receber nesta funcão uma string mais ou menos assim:

String := ´marcelo/joao/maria´


O que minha função vai ter que fazer?
Ela vai quer que quebrar a string na barra e me retornar os nomes .... a quantidade de nomes por string nao tem como prever, será aleatório por isso pensei em jogar nome por nome na stringlist.

Não tenho certeza se esta seria a melhor opção para resolver esta questão ... aproveito para pedir a opinião do tnaires e Martins ... o que vc acham ??? é o melhor caminho ???

Brigado pela atenção de todos.

Abraços!!!


GOSTEI 0
Adriano Santos

Adriano Santos

09/11/2006

Marcelo, vc pode usar a dica do colea tnaires, assim vc acaba com o ´Access violation´, pq o free q vc está utilizando dentro de sua função depois do Finally está provocando isso. Não sei exatamente o q vc pretende mas, estarei on-line amanhã lá pelas 9:30 no MSN. Boa sorte


Só pra constar, caso não saiba, o Finally é executado mesmo não havendo erros, ou seja, o código no try é executado e logo em seguida é executado o fnally, por isso o Access Violation.


GOSTEI 0
Mmoreira

Mmoreira

09/11/2006

tnaires,

Só para deixar registrado sua dica funcionou perfeitamente, fiz o teste aqui e obtive o resultado esperado. Meu erro era mesmo estar destruindo o objeto no momento erra.

Brigadão pela ajuda.


GOSTEI 0
Martins

Martins

09/11/2006

[quote:bf7e44ee73=´Adriano Santos´]
Marcelo, vc pode usar a dica do colea tnaires, assim vc acaba com o ´Access violation´, pq o free q vc está utilizando dentro de sua função depois do Finally está provocando isso. Não sei exatamente o q vc pretende mas, estarei on-line amanhã lá pelas 9:30 no MSN. Boa sorte


Só pra constar, caso não saiba, o Finally é executado mesmo não havendo erros, ou seja, o código no try é executado e logo em seguida é executado o fnally, por isso o Access Violation.[/quote:bf7e44ee73]

é verdade [b:bf7e44ee73]Adriano[/b:bf7e44ee73] como não tem nada no bloco entre o try e finnaly q receba os valores da stringlist, quando chegar no finally ela será liberada e o retorno da função não vai ser o esperado mas sim um erro por requisitar algo q não existe mais.


GOSTEI 0
Martins

Martins

09/11/2006

tnaires, Só para deixar registrado sua dica funcionou perfeitamente, fiz o teste aqui e obtive o resultado esperado. Meu erro era mesmo estar destruindo o objeto no momento erra. Brigadão pela ajuda.


A dica do [b:0bc7b0802c]tnaires[/b:0bc7b0802c] funciona sim. agora diga-nos uma coisa de onde vc vai pegar essas informações q alimentarão essa stringlist?

vc terá q quebrar a string e remover a barra, posso tentar algo, só não estou com o Delphi aqui agora, mas aguardo seu retorno.

boa sorte!


GOSTEI 0
Mmoreira

Mmoreira

09/11/2006

Martins,

Eu vou pegar estas informações de uma base de dados em ACCESS ... os caras tem um cadastro la e foram colocando exatamente assim: ´marcelo/maria/joao´


GOSTEI 0
Martins

Martins

09/11/2006

Martins, Eu vou pegar estas informações de uma base de dados em ACCESS ... os caras tem um cadastro la e foram colocando exatamente assim: ´marcelo/maria/joao´


Certo Marcelo, vou fazer uns testes aqui.

t+


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

09/11/2006

uma outra alternativa seria você passar a lista de strings como parametro, por exemplo:

procedure ObterNomes(ListaDeNomes: TStrings);
begin
  with ListaDeNomes do
  begin
    Add(´Marcelo´);
    Add(´Maria´);
  end;
end;


ai existem duas maneiras de usá-la

var
  ListaDeNomes: TStrings;
begin
  (...)
  try
    ListaDeNomes := TStringList.Create;
    ObterNomes(ListaDeNomes);
    with ListaDeNomes do
    begin
      Memo1.Lines.Add( Strings[0] );
      Memo1.Lines.Add( Strings[1] );
    end;
  finally
    ListaDeNomes.Free;
  end;
  (...)
end;


ou

ObterNomes(Memo1.Lines);
:)


GOSTEI 0
Martins

Martins

09/11/2006

Marcelo, estou apenas concluindo um relatório e irei testar seu código fazendo nele as alterações necessárias para que ele funcione como desejado.

T+


GOSTEI 0
Martins

Martins

09/11/2006

Olá Marcelo (mMOREIRA), veja se o DEMO q te mandei por e-mail te serve.

PS: Desculpem demais usuários, mas tão logo seja confirmada pelo colega, posto a função aqui para todos verem e analisarem inserindo comentários e fazendo melhorias.

t+


GOSTEI 0
POSTAR