Fórum POO - Bug ou erro de programacao? #328565
04/09/2006
0
imaginem a seguinte classe
type
TConexao = class
private
FSqlQuery: TIBSQL;
FSQSQL: TStringList;
procedure SetSQSQL(const Value: TStringList);
public
constructor Create;
destructor Destroy; override;
procedure SQExecutar;
published
property QRSQL: TStringList read FQRSQL write SetQRSQL;
property SQSQL: TStringList read FSQSQL write SetSQSQL;
end;
constructor TConexao.Create;
begin
inherited;
FSqlQuery:=TIBSQL.Create(nil);
FSqlQuery.Database:=<ojebto IBDatabase>;
FSqlQuery.Transaction:=<objeto IBTransaction>;
FSQSQL:=TStringList.Create;
end;
destructor TConexao.Destroy;
begin
FreeAndNil(FSqlQuery);
FreeAndNil(FSQSQL);
inherited;
end;
procedure TConexao.SQExecutar;
begin
FSqlQuery.ExecQuery;
end;
procedure TConexao.SetSQSQL(const Value: TStringList);
begin
FSQSQL:=Value;
FSqlQuery.SQL:=FSQSQL;
end;
o problema nessa classe eh que o metodo SetSQSQL nunca eh executado... tanto que se vc colocar um brakpoint dentro do procedimetno SetSQSQL ele ira ficar desabilitado... como se o compiliador tivesse ignorado este procedimento..
eu ja troquei o tipo de dados do campo FSQSQLpara TStrings e no constructor instansiei como sendo TStringList e mesmo assim nao funcionou...
a unica maneira que deu certo foi quando eu troquei o tipo de dados do campo FSQSQL para string... apos ter feita essa alteracao tudo passou a funcionar corretamente...
ja olhei outros objetos do proprio delphi que tenhao propriedade do tipo TStrings ou TStringList pra ver se eles trabalhão de maneira diferente, mas nao encontrei nada que fosse fazer diferenca...
muito estranho esse erro... o mais estranho eh que todos os programadores que conheco nunca viram esse tipo de erro...
aguardo a ajuda do forum.... :cry:
obrigado
Diviex
Curtir tópico
+ 0Posts
04/09/2006
Massuda
procedure TConexao.SetSQSQL(const Value: TStringList); begin //FSQSQL.Clear; FSQSQL.AddStrings(Value); //FSqlQuery.SQL.Clear; FSqlQuery.SQL.AddStrings(Value); end;
Gostei + 0
04/09/2006
Diviex
mesmo assim ainda nao deu...
o compilador ainda continua ignorando o procedimento, ou seja, mesmo vc alterando a pripriedade SQSQL do objeto TConexao, o campo FSQSQL permanece sem alteracao pq o evento SetSQSQL sequer xega a ser executado
procedimento onde se altera a propriedade SQSQL do objeto TConexao
var
Conexao1: TConexao;
begin
Conexao1:=TConexao.Create;
{demais codigos}
Conexao1.SQSQL.Clear;
Conexão1.SQSQL.Add(´texto a ser adicionado´);
FreeAndNil(Conexao1);
end;
a imagem abaixo mostra o procedimento que seria responsavel por fazer a atualizacao do campo FSQSQL durante a execucao do programa
[img:a74e0c23dd]http://www.dvx.grandsinformatica.com.br/erro.jpg[/img:a74e0c23dd]
observe que os brakpoints estao desabilitados, ou seja o compilador nao reconhece as linhas onde estao os brakpoint pq ele nunca passara por la..
mas porque ele faz isso se pela logica ele passara por lah varias vezes???
Gostei + 0
04/09/2006
Massuda
Isso pode ser desabilitado em Project|Options, aba Compiler, desmarcando a opção Optimization.
Entretanto, o fato do código estar desabilitado pode inidicar que você omitiu a chamada a procedure SetSQSQL (ou a atribuição à propriedade SQSQL) ou existe no seu programa uma situação tal que a chamada nunca ocorrerá.
Gostei + 0
04/09/2006
Diviex
mais entaum cara.... o programa em si esta xamando a proprieade SQSQL sim... mais mesmo assim, na propria unit onde esta declarada a classe TConexao, existe outra classe que esta xamando pelo menos uma vez a propriedade em questão...
e agente nao pode se esquecer de um detalhes importante... trocando o tipo de dados de TStringList para String... o problema eh 100¬ resolvido...
atualmente eu estou trabalhando com o tipo String para o programa nao ficar parado, porem, nao ficou legal... pois ´politicamente´ correto, seria usar o TStrings ou TStringList...
vc tem mais alguma ideia do que pode ser??
eu tenho um programa de demostracao desse erro (pq ele ja eh de longa data e ninquem consequiu uma solucao ate hoje)... caso vc (ou outros que queiram ajudar) queira, pode pega-lo no link [url]http://www.dvx.grandsinformatica.com.br/demo_erro.zip[/url]
obrigado novamente
Gostei + 0
05/09/2006
Diviex
Gostei + 0
05/09/2006
Siam
Se vc fizer: SQSQL := nil; aí sim ele irá entender como um [b:08907d737b]write[/b:08907d737b] e executar a procedure.
Gostei + 0
05/09/2006
Diviex
me escplica melhor essa parte do SQSQL:=nil.
isso seria colocado no constructor da classe, ou em algum outro lugar???
Gostei + 0
05/09/2006
Diviex
me explica melhor essa parte do SQSQL:=nil.
isso seria colocado no constructor da classe, ou em algum outro lugar???
Gostei + 0
05/09/2006
Siam
Gostei + 0
05/09/2006
Night_man
quando tu muda os items de um StringList tu nao esta mudando o variavel do tipo StringLista, esta mudando algo dentro dela
Quando voce muda o text do teu SQL nao dipara write, pois o SQL nao foi mudado e sim os items dele
faca o seguinte no evento OnChange do StringList atribu o metodo SetSQSQL, dai toda vez que os items forem mudados ele sera chamado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)