Fórum Função que retorne um TStringList #332928

09/11/2006

0

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

Responder

Posts

09/11/2006

Tnaires

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


Responder

Gostei + 0

09/11/2006

Tnaires

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


Responder

Gostei + 0

10/11/2006

Martins

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


Responder

Gostei + 0

10/11/2006

Mmoreira

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!!!


Responder

Gostei + 0

10/11/2006

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.


Responder

Gostei + 0

10/11/2006

Mmoreira

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.


Responder

Gostei + 0

10/11/2006

Martins

[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.


Responder

Gostei + 0

10/11/2006

Martins

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!


Responder

Gostei + 0

10/11/2006

Mmoreira

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´


Responder

Gostei + 0

10/11/2006

Martins

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+


Responder

Gostei + 0

10/11/2006

Marcelo Saviski

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);
:)


Responder

Gostei + 0

10/11/2006

Martins

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+


Responder

Gostei + 0

11/11/2006

Martins

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+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar