função sql genérica
08/09/2004
0
que recebe dois parâmetros:
- parâmetro 1 : opt
espera receber ´S´para dar um Open na query ,e ´E´ para dar um ExecSql;
- parâmetro 2 : str_sql:
espera receber uma string de um comando sql.
Segue trecho dó código e os respectivos erros:
{
nessa linha dá o erro
[Error] Un_CadTipoProdutos.pas(26):
Unsatisfied forward or external declaration:
´TfrmCadTipoProdutos.PreencheDBGrid´
}
procedure PreencheDBGrid(opt, str_sql: String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmCadTipoProdutos: TfrmCadTipoProdutos;
str_sql, str_select, str_from, str_where, str_order
: String;
implementation
uses DmAuto, Global, Un_CadTipoProdutos2;
{$R *.dfm}
procedure PreencheDBGrid(opt, str_sql: String);
Var Qry : Tquery;
begin
{
Dá erro na p´roxima linha
[Error] Un_CadTipoProdutos.pas(47): Undeclared
identifier: ´self´
}
Qry:=TQuery.Create(self);
Qry.DatabaseName:=´AutoPeças´;
Qry.SQL.Text:= str_sql;
try
if opt <> ´E´ then
Qry.Open
else
Qry.ExecSQL;
frmCadTipoProdutos.ds.DataSet := Qry;
except
on e:exception do
begin
ShowMessage(e.message);
Qry.Free;
end;
end;
end;
procedure
TfrmCadTipoProdutos.ibt_pesquisarClick(Sender:
TObject);
begin
str_select:=´ SELECT *´;
str_from:=´ FROM tb_tipo_produto ´;
if txt_DescTipo.Text <> ´´ then
str_where:=´ WHERE descricao_tipo like
´+#39+txt_DescTipo.text+´¬´39+´´;
str_sql:= str_select+str_from+str_where+str_order;
PreencheDBGrid(´S´,str_sql);
end;
Obrigado pela atenção
Angela
Posts
08/09/2004
Motta
tente query.sql.savetofile (...);
para jogar o sql prum arquivo texto e veja o que gerou
08/09/2004
Angela
08/09/2004
Motta
Dá erro na p´roxima linha
[Error] Un_CadTipoProdutos.pas(47): Undeclared
identifier: ´self´
}
Qry:=TQuery.Create(nil); {<<===}
Qry.DatabaseName:=´AutoPeças´;
Qry.SQL.Text:= str_sql;
try
if opt <> ´E´ then
Qry.Open
...
08/09/2004
Vinicius2k
Não analisei a rotina em si, já q vc está tendo erro de compilação...
Como vc declarou a procedure como sendo do formulário (está dentro da definição de type dele), a implementação precisa referenciar o objeto (form), sendo :
procedure TfrmCadTipoProdutos.PreencheDBGrid(opt, str_sql: String); begin { **** Implementação **** } end;
Isto deve resolver seu problema de compilação..
Espero ter ajudado...
T+
09/09/2004
Angela
Era isso mesmo....obrigada
Aproveito para perguntar qual é a diferença entre nil e self?
Grata
09/09/2004
Vinicius2k
No caso da criação de componentes em Runtime, vc pode usar tanto o [b:d5d5629cd2]Self [/b:d5d5629cd2]quanto o [b:d5d5629cd2]nil[/b:d5d5629cd2] como Owner (dono) do componente...
Nil é um ponteiro de memória nulo e pode ser utilizado como referencia a um outro componente, necessário neste caso.
Self (próprio) é o componente ao qual pertence o procedimento em que vc está contruindo a rotina, no caso, o Form...
Se vc faz :
Componente:= TComponente .Create(Nil);
Vc criou um componente ´sem dono´, que não será destruído quando seu form for destruído... a liberação da memória precisa ser manual. Mas isso, neste caso, não é um problema porque vc, após utilizá-lo já o está destruindo (.Free)... o problema vem quando vc não o destrói... executando várias vezes o mesmo procedimento ou abrindo e fechando várias vezes o mesmo form, vc poderá ter um [i:d5d5629cd2]MemoryLeak[/i:d5d5629cd2] com uma mensagem do tipo [i:d5d5629cd2]´Out Of Memory´[/i:d5d5629cd2].
Se vc faz:
Componente:= TComponente.Create(Self);
que seria o mesmo que :
Componente:= TComponente.Create(MeuFormulario);
Vc criou um componente cujo ´dono´, é o seu form e se, por acaso, ele não for liberado da memória manualmente, quando o Form for liberado ele será também...
Espero ter ajudado e não ter falado nenhuma besteira, confesso que não sou muito ´entendido´ nisso... :roll:
T+
10/09/2004
Angela
A explicação foi 10, vou até percorrer o resto do programa e verificar sobre isso.
Obrigada pela ajuda...esse forum é muito bom!!!
10/09/2004
Ipc$
Clique aqui para fazer login e interagir na Comunidade :)