Chamando um Form de Pesquisa- DBEDIT
Olá boa noite!
Há alguns dias estou com um probleminha, espero que me ajudem como sempre...
Seguinte: Tenho Form1(Cadastro Produto) e Form2(Consulta Categoria Produto)
Ao digitar qualquer caractere no dbeditcategoria do form1 a aplicação chama o form2 de consulta, até então ok.
No evento onkeypress (Tecla Enter) da minha dbgrid do form 2, no código eu mando que assim que eu selecionar a categoria desejada o form2 fecha, e em seguida o dbeditcategoria do form1 recebe os dados.
Codigo no evento onkeypress dbgrid:
procedure TFrmConsulFabricante.DBGridConsulIndustriaKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
begin
FrmCadFabricante.DBEdit1.Text := FrmCadFabricante.FDQryFabricante.FieldByName('ID').AsString;
FrmCadFabricante.DBEdit2.Text := FrmCadFabricante.FDQryFabricante.FieldByName('DESCRICAO').AsString;
FrmCadFabricante.DBEdit3.Text := FrmCadFabricante.FDQryFabricante.FieldByName('DTA_CADASTRO').AsString;
FrmConsulFabricante.Close;
end;
O problema e que o form1 recebe os dados, mais o primeiro caractere digitado continua no dbedit. Ex: CCATEGORIATESTE
Código no evento onkeypress do dbedit:
procedure TFrmCadProdutos.DBEditDescCategoriaKeyPress(Sender: TObject;
var Key: Char);
begin
if AnsiUpperCase(Key)[1] in ['0'..'9','A'..'Z'] then
begin
Application.CreateForm(TFrmConsulCategoria,FrmConsulCategoria);
with FrmConsulCategoria.EdtConsultaCategoria do
begin
Text := key;
end;
FrmConsulCategoria.ShowModal;
end;
end;
Agradeço!
Há alguns dias estou com um probleminha, espero que me ajudem como sempre...
Seguinte: Tenho Form1(Cadastro Produto) e Form2(Consulta Categoria Produto)
Ao digitar qualquer caractere no dbeditcategoria do form1 a aplicação chama o form2 de consulta, até então ok.
No evento onkeypress (Tecla Enter) da minha dbgrid do form 2, no código eu mando que assim que eu selecionar a categoria desejada o form2 fecha, e em seguida o dbeditcategoria do form1 recebe os dados.
Codigo no evento onkeypress dbgrid:
procedure TFrmConsulFabricante.DBGridConsulIndustriaKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
begin
FrmCadFabricante.DBEdit1.Text := FrmCadFabricante.FDQryFabricante.FieldByName('ID').AsString;
FrmCadFabricante.DBEdit2.Text := FrmCadFabricante.FDQryFabricante.FieldByName('DESCRICAO').AsString;
FrmCadFabricante.DBEdit3.Text := FrmCadFabricante.FDQryFabricante.FieldByName('DTA_CADASTRO').AsString;
FrmConsulFabricante.Close;
end;
O problema e que o form1 recebe os dados, mais o primeiro caractere digitado continua no dbedit. Ex: CCATEGORIATESTE
Código no evento onkeypress do dbedit:
procedure TFrmCadProdutos.DBEditDescCategoriaKeyPress(Sender: TObject;
var Key: Char);
begin
if AnsiUpperCase(Key)[1] in ['0'..'9','A'..'Z'] then
begin
Application.CreateForm(TFrmConsulCategoria,FrmConsulCategoria);
with FrmConsulCategoria.EdtConsultaCategoria do
begin
Text := key;
end;
FrmConsulCategoria.ShowModal;
end;
end;
Agradeço!
Jefferson
Curtidas 0
Respostas
Emerson Nascimento
19/10/2020
Quem sou eu pra dizer qual é a forma certa para desenvolver um sistema, mas dando minha sugestão mesmo não solicitada...
Esta não é a melhor forma de fazer isto.
Normalmente este tipo de procedimento deve gerar um retorno, e quem chamou é que decide o que fazer com o retorno.
No teu caso, a tela de pesquisa está manipulando a tela que a chamou, e isto não é boa prática.
Além do mais, a tela de pesquisa deve ter seu próprio dataset, não compartilhado com mais nenhum form.
Assim...
Crie uma unit para as classes do sistema. Essa unit terá, entre outras, a classe de retorno de pesquisas (neste caso é apenas um record).
Por exemplo:
No teu form de pesquisa, crie, na seção public do form, a seguinte class function (class function e class procedure ficam disponíveis mesmo antes de instanciar o form):
a implementação será assim:
lembrando que o form de consulta deve ter seu próprio dataset. faça isto para manter os dados independentes entre os forms.
agora é necessário 'consumir' essa pesquisa.
seguindo o que você passou:
será necessário incluir a unit ClassesSistema em todos as units que utilizarem a pesquisa (inclusive na própria unit de pesquisa).
a unit de pesquisa não precisa mais ter na sua uses as units que a utilizam. no caso acredito que você tenha a unit de cadastro na uses da unit de pesquisa. não é necessário.
dessa forma a tela de pesquisa de categoria de produto se torna auto suficiente pode ser chamada de qualquer ponto do sistema, porque têm seu próprio dataset e porque o tratamento do retorno será feito por quem a chamou, não por ela mesma.
agora, se não quiser seguir nada do que foi dito, basta fazer:
é possível que haja algum erro de sintaxe. estou sem Delphi, então fiz tudo no bloco de notas.
Esta não é a melhor forma de fazer isto.
Normalmente este tipo de procedimento deve gerar um retorno, e quem chamou é que decide o que fazer com o retorno.
No teu caso, a tela de pesquisa está manipulando a tela que a chamou, e isto não é boa prática.
Além do mais, a tela de pesquisa deve ter seu próprio dataset, não compartilhado com mais nenhum form.
Assim...
Crie uma unit para as classes do sistema. Essa unit terá, entre outras, a classe de retorno de pesquisas (neste caso é apenas um record).
Por exemplo:
unit ClassesSistema; interface type // classe para retorno de pesquisas (supondo que sempre retornará ID, Descrição e Data de Cadastro) TRetornoPesquisa = record ID: integer; Descricao: string; DataCadastro: TDateTime; end; implementation end.
No teu form de pesquisa, crie, na seção public do form, a seguinte class function (class function e class procedure ficam disponíveis mesmo antes de instanciar o form):
type TFrmConsulCategoria = class(TForm) [] private [] public class function PesquisaCategoriaProduto(ValorInicial: string = ''): TRetornoPesquisa; end;
a implementação será assim:
class function TFrmConsulCategoria.PesquisaCategoriaProduto( ValorInicial: string = ''): TRetornoPesquisa; var FrmPesquisa: TForm6; begin Result.ID := -1; Result.Descricao := ''; Result.DataCadastro := nil; Application.CreateForm(TFrmConsulCategoria, FrmPesquisa); FrmPesquisa.EdtConsultaCategoria.Text := Categoria; // se o usuário confirmou a tela de pesquisa if FrmPesquisa.ShowModal = mrOk then begin Result.ID := FrmPesquisa.DatasetPesquisa.FieldByName('ID').AsInteger; Result.Descricao := FrmPesquisa.DatasetPesquisa.FieldByName('Descricao').AsString; Result.DataCadastro := FrmPesquisa.DatasetPesquisa.FieldByName('DtaCadastro').AsDateTime; end; FreeAndNil(FrmPesquisa); end;
agora é necessário 'consumir' essa pesquisa.
seguindo o que você passou:
procedure TFrmCadProdutos.DBEditDescCategoriaKeyPress(Sender: TObject; var Key: Char); var Retorno: TRetornoPesquisa; begin if AnsiUpperCase(Key)[1] in ['0'..'9','A'..'Z'] then begin Retorno := PesquisaCategoriaProduto( key ); // abre a tela de pesquisa. é assim mesmo. não precisa criar o form de pesquisa. if Retorno.ID > 0 then // se houve retorno, faz as atribuições begin FrmCadFabricante.DBEdit1.Text := Retorno.ID; FrmCadFabricante.DBEdit2.Text := Retorno.Descricao; FrmCadFabricante.DBEdit3.Text := Retorno.DataCadastro; key := #0; // anula o que foi digitado pelo usuário end; end; end;
será necessário incluir a unit ClassesSistema em todos as units que utilizarem a pesquisa (inclusive na própria unit de pesquisa).
a unit de pesquisa não precisa mais ter na sua uses as units que a utilizam. no caso acredito que você tenha a unit de cadastro na uses da unit de pesquisa. não é necessário.
dessa forma a tela de pesquisa de categoria de produto se torna auto suficiente pode ser chamada de qualquer ponto do sistema, porque têm seu próprio dataset e porque o tratamento do retorno será feito por quem a chamou, não por ela mesma.
agora, se não quiser seguir nada do que foi dito, basta fazer:
procedure TFrmCadProdutos.DBEditDescCategoriaKeyPress(Sender: TObject; var Key: Char); begin if AnsiUpperCase(Key)[1] in ['0'..'9','A'..'Z'] then begin Application.CreateForm(TFrmConsulCategoria,FrmConsulCategoria); FrmConsulCategoria.EdtConsultaCategoria.Text := key; FrmConsulCategoria.ShowModal; // anula o que o usuário digitou, mas precisa de tratamento, // porque a tela de consulta pode ter sido cancelada key := #0; end; end;
é possível que haja algum erro de sintaxe. estou sem Delphi, então fiz tudo no bloco de notas.
GOSTEI 0
Emerson Nascimento
19/10/2020
Quem sou eu pra dizer qual é a forma certa para desenvolver um sistema, mas dando minha sugestão mesmo não solicitada...
Esta não é a melhor forma de fazer isto.
Normalmente este tipo de procedimento deve gerar um retorno, e quem chamou é que decide o que fazer com o retorno.
No teu caso, a tela de pesquisa está manipulando a tela que a chamou, e isto não é boa prática.
Além do mais, a tela de pesquisa deve ter seu próprio dataset, não compartilhado com mais nenhum form.
Assim...
Crie uma unit para as classes do sistema. Essa unit terá, entre outras, a classe de retorno de pesquisas (neste caso é apenas um record).
Por exemplo:
No teu form de pesquisa, crie, na seção public do form, a seguinte class function (class function e class procedure ficam disponíveis mesmo antes de instanciar o form):
a implementação será assim:
lembrando que o form de consulta deve ter seu próprio dataset. faça isto para manter os dados independentes entre os forms.
agora é necessário 'consumir' essa pesquisa.
seguindo o que você passou:
será necessário incluir a unit ClassesSistema em todos as units que utilizarem a pesquisa (inclusive na própria unit de pesquisa).
a unit de pesquisa não precisa mais ter na sua uses as units que a utilizam. no caso acredito que você tenha a unit de cadastro na uses da unit de pesquisa. não é necessário.
dessa forma a tela de pesquisa de categoria de produto se torna auto suficiente pode ser chamada de qualquer ponto do sistema, porque têm seu próprio dataset e porque o tratamento do retorno será feito por quem a chamou, não por ela mesma.
agora, se não quiser seguir nada do que foi dito, basta fazer:
é possível que haja algum erro de sintaxe. estou sem Delphi, então fiz tudo no bloco de notas.
Esta não é a melhor forma de fazer isto.
Normalmente este tipo de procedimento deve gerar um retorno, e quem chamou é que decide o que fazer com o retorno.
No teu caso, a tela de pesquisa está manipulando a tela que a chamou, e isto não é boa prática.
Além do mais, a tela de pesquisa deve ter seu próprio dataset, não compartilhado com mais nenhum form.
Assim...
Crie uma unit para as classes do sistema. Essa unit terá, entre outras, a classe de retorno de pesquisas (neste caso é apenas um record).
Por exemplo:
unit ClassesSistema; interface type // classe para retorno de pesquisas (supondo que sempre retornará ID, Descrição e Data de Cadastro) TRetornoPesquisa = record ID: integer; Descricao: string; DataCadastro: TDateTime; end; implementation end.
No teu form de pesquisa, crie, na seção public do form, a seguinte class function (class function e class procedure ficam disponíveis mesmo antes de instanciar o form):
type TFrmConsulCategoria = class(TForm) [] private [] public class function PesquisaCategoriaProduto(ValorInicial: string = ''): TRetornoPesquisa; end;
a implementação será assim:
class function TFrmConsulCategoria.PesquisaCategoriaProduto( ValorInicial: string = ''): TRetornoPesquisa; var FrmPesquisa: TFrmConsulCategoria; begin Result.ID := -1; Result.Descricao := ''; Result.DataCadastro := nil; Application.CreateForm(TFrmConsulCategoria, FrmPesquisa); FrmPesquisa.EdtConsultaCategoria.Text := Categoria; // se o usuário confirmou a tela de pesquisa if FrmPesquisa.ShowModal = mrOk then begin Result.ID := FrmPesquisa.DatasetPesquisa.FieldByName('ID').AsInteger; Result.Descricao := FrmPesquisa.DatasetPesquisa.FieldByName('Descricao').AsString; Result.DataCadastro := FrmPesquisa.DatasetPesquisa.FieldByName('DtaCadastro').AsDateTime; end; FreeAndNil(FrmPesquisa); end;
agora é necessário 'consumir' essa pesquisa.
seguindo o que você passou:
procedure TFrmCadProdutos.DBEditDescCategoriaKeyPress(Sender: TObject; var Key: Char); var Retorno: TRetornoPesquisa; begin if AnsiUpperCase(Key)[1] in ['0'..'9','A'..'Z'] then begin Retorno := PesquisaCategoriaProduto( key ); // abre a tela de pesquisa. é assim mesmo. não precisa criar o form de pesquisa. if Retorno.ID > 0 then // se houve retorno, faz as atribuições begin FrmCadFabricante.DBEdit1.Text := Retorno.ID; FrmCadFabricante.DBEdit2.Text := Retorno.Descricao; FrmCadFabricante.DBEdit3.Text := Retorno.DataCadastro; key := #0; // anula o que foi digitado pelo usuário end; end; end;
será necessário incluir a unit ClassesSistema em todos as units que utilizarem a pesquisa (inclusive na própria unit de pesquisa).
a unit de pesquisa não precisa mais ter na sua uses as units que a utilizam. no caso acredito que você tenha a unit de cadastro na uses da unit de pesquisa. não é necessário.
dessa forma a tela de pesquisa de categoria de produto se torna auto suficiente pode ser chamada de qualquer ponto do sistema, porque têm seu próprio dataset e porque o tratamento do retorno será feito por quem a chamou, não por ela mesma.
agora, se não quiser seguir nada do que foi dito, basta fazer:
procedure TFrmCadProdutos.DBEditDescCategoriaKeyPress(Sender: TObject; var Key: Char); begin if AnsiUpperCase(Key)[1] in ['0'..'9','A'..'Z'] then begin Application.CreateForm(TFrmConsulCategoria,FrmConsulCategoria); FrmConsulCategoria.EdtConsultaCategoria.Text := key; FrmConsulCategoria.ShowModal; // anula o que o usuário digitou, mas precisa de tratamento, // porque a tela de consulta pode ter sido cancelada key := #0; end; end;
é possível que haja algum erro de sintaxe. estou sem Delphi, então fiz tudo no bloco de notas.
GOSTEI 0
Jefferson
19/10/2020
Obrigado!! Vou tentar aqui.
GOSTEI 0