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]



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]



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: 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]