Re: [delphi-br] Duvida ao trabalhar com TStringList
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
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
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
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
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
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
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
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
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
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
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
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
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]
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
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
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
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
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
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
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
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
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
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]