Seleção de dados de um FORM para outro FORM

MySQL

Delphi

Banco de Dados

ADO

27/01/2019

Boa noite,

estou aprendendo a criar um sistema de vendas simples, mas me deparei com um problema que não consigo achar uma resposta que me ajude.
Quero trazer o valor de um form para outro form, exatamente em 2 campos dbedit. no primeiro form1 criei um botão pra chamar o form2 que contém um dbgrid.
quero selecionar a informação do dbgrid com duplo click e logo após selecionar quero que feche o form2. Porém, quando o form2 fecha o valor selecionado não fica salvo no dbedit do form1.

estou usando esses códigos:

procedure Tform2.DBGrid1DblClick(Sender: TObject);
begin

form1.DBEdit5.Text := DBGrid1.Fields[0].AsString;
form1.DBEdit11.Text := DBGrid1.Fields[1].AsString;
close;
end;
Gilson

Gilson

Curtidas 0

Melhor post

Hélio Devmedia

Hélio Devmedia

27/01/2019

Gilson, tudo bem?

é necessário mudar um pouco a lógica que você está utilizando.

A forma que você fez é muito clara mas os DBEdits não aceitam bem isso. o correto é

procedure Tform2.DBGrid1DblClick(Sender: TObject);
begin
   form1.DBEdit5.field.asstring := Dataset.fieldbyName('Nome do campo 1').AsString;
   form1.DBEdit11.field.asstring := Dataset.fieldbyName('Nome do campo 2').AsString
   close;
end;

pra jogar o valor diretamente no Field do DataSet e não no texto somente do dbedit porque apaga...

Isso já deve resolver, mas para ajudar você nos seus próximos projetos, gostaria de dizer que também não é correto puxar os dados direto do dbgrid, a gente puxa direto do dataset que você colocou no Datasource do dbgrid:

procedure Tform2.DBGrid1DblClick(Sender: TObject);
begin
   form1.DBEdit5.field.asstring    := Dataset.fieldbyName('Nome do campo 1').AsString;
   form1.DBEdit11.field.asstring := Dataset.fieldbyName('Nome do campo 2').AsString
   close;
end;


A ultima coisa que eu gostaria de lhe informar é que existe uma forma baseada em melhores prática pra fazer isso que você quer...

procedure Tform1.ButtonClick(Sender: TObject);
begin
   frm2.showmodal;
   DBEdit5.field.asstring    := frm2.Dataset.fieldbyName('Nome do campo 1').AsString;
   DBEdit11.field.asstring := frm2.Dataset.fieldbyName('Nome do campo 2').AsString
end;


O código acima diz que quando apertar o botão ele chama o form2. no duplo click do dbgrid para selecionar o registro, você ó manda fechar o formulário, só isso, mas sem fechar o dataSet. Então a programação volta para o código do botão, e no código do botão você chama os dados do formulário 2 que fechou mas ainda está na memória.



GOSTEI 1

Mais Respostas

Gilson

Gilson

27/01/2019

Gilson, tudo bem?

é necessário mudar um pouco a lógica que você está utilizando.

A forma que você fez é muito clara mas os DBEdits não aceitam bem isso. o correto é

procedure Tform2.DBGrid1DblClick(Sender: TObject);
begin
   form1.DBEdit5.field.asstring := Dataset.fieldbyName('Nome do campo 1').AsString;
   form1.DBEdit11.field.asstring := Dataset.fieldbyName('Nome do campo 2').AsString
   close;
end;

pra jogar o valor diretamente no Field do DataSet e não no texto somente do dbedit porque apaga...

Isso já deve resolver, mas para ajudar você nos seus próximos projetos, gostaria de dizer que também não é correto puxar os dados direto do dbgrid, a gente puxa direto do dataset que você colocou no Datasource do dbgrid:

procedure Tform2.DBGrid1DblClick(Sender: TObject);
begin
   form1.DBEdit5.field.asstring    := Dataset.fieldbyName('Nome do campo 1').AsString;
   form1.DBEdit11.field.asstring := Dataset.fieldbyName('Nome do campo 2').AsString
   close;
end;


A ultima coisa que eu gostaria de lhe informar é que existe uma forma baseada em melhores prática pra fazer isso que você quer...

procedure Tform1.ButtonClick(Sender: TObject);
begin
   frm2.showmodal;
   DBEdit5.field.asstring    := frm2.Dataset.fieldbyName('Nome do campo 1').AsString;
   DBEdit11.field.asstring := frm2.Dataset.fieldbyName('Nome do campo 2').AsString
end;


O código acima diz que quando apertar o botão ele chama o form2. no duplo click do dbgrid para selecionar o registro, você ó manda fechar o formulário, só isso, mas sem fechar o dataSet. Então a programação volta para o código do botão, e no código do botão você chama os dados do formulário 2 que fechou mas ainda está na memória.



Hélio tudo bem?

Então tentei o que você falou, joguei o código em um botão:

procedure Tfvendas.Button3Click(Sender: TObject);
var frmPesqCli : Tfconprodutos;
begin

frmPesqCli := Tfconprodutos.Create(Application);
frmPesqCli.ShowModal;
DBEdit5.field.asstring:= frmPesqCli.ADOQuery1.fieldbyName('CODIGO').AsString;
DBEdit11.field.asstring:= frmPesqCli.ADOQuery1.fieldbyName('NOME').AsString;

FreeAndNil(frmPesqCli);
end;

ele abre o form2, aparece os dados no DBGRID, mas quando seleciono cliente que desejo ele não passa os dados para DBEdit do form 1.


DBGrid está conectado ao DataSource e um AdoQuery, verifica essa imagem pra você ver como eu quero que fique.
https://1drv.ms/u/s!AnhnCHSbQS3RlTdEYJXCMCLnys8F

Meu objetivo é criar um form de vendas ainda estou aprendendo, pretendo que quando eu clicar no botão localizar, ele abra um popup para procurar o cliente e quando encontra o cliente eu der um duplo clique ou apertar em botão para selecionar e jogar no form principal no DBEdit 5 e 11 pra que grave na tabela venda. E funcione apenas quando tiver no estado de insert e edit.

OBS.: Estou aprendendo, então se deixar o mais claro possível eu agradeço!
GOSTEI 0
POSTAR