Fórum Delphi Form Consulta - Error Acess Violation #613732

08/01/2021

0

Bom dia turma!

Estou com um probleminha bem simples, vamos lá!

Tenho 1 formulário de consulta(Cidade) que é usado por vários outros formulários de cadastro ex: Funcionário, cliente e até mesmo cidade.

Na minha Grid do formulário de consulta(cidade) no evento onkeypress, coloquei para que quando o usuário pressionasse ENTER, o formulário de cadastro recebe as informações e em seguida o formulário de consulta fecha.

Ao chamar o formulário de consulta pelo cadastro de funcionário por exemplo, tenho a seguinte mensagem de erro: Access violation at address 004074d2 in module 'UNILITE.exe'. Write of address 00000000.

Código:

procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
var
nome_cid, cep : string;
begin
nome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
cep := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
if key = #13 then
begin
FrmConsulCidade.Close;
end;
begin
if key = #13 then
begin
FrmCadastroFunc.FDQryFunc.FieldByName('CIDADE').AsString := nome_cid;
FrmCadastroFunc.FDQryFunc.FieldByName('CEP').AsString := cep;
FrmConsulCidade.Close;
end;
begin
if key = #13 then
begin
FrmCadCliente.FDQryCadCliente.FieldByName('CIDADE').AsString := nome_cid;
FrmCadCliente.FDQryCadCliente.FieldByName('CEP').AsString := cep;
FrmConsulCidade.Close;
end;
end;
end;
end;

Usei o seguinte método antes do código nos meus botões de chamada do formulário de consulta(Cidade): Application.CreateForm(TFrmConsulCidade, FrmConsulCidade);

Sei o motivo do erro, no qual estou tentando acessar um formulário que ainda não foi criado. Sei também que é normal programadores passar por este tipo de erro, ainda mais iniciante como eu.

Qualquer ajuda é bem vida!!

Obrigado!!
Jefferson

Jefferson

Responder

Posts

08/01/2021

Emerson Nascimento

não se faz o tratatamento do retorno na tela que foi chamada. se trata o retorno na tela que FEZ a chamada.
isso é abstração: quem chamou não precisa entender o que está sendo executado em quem foi chamado; quem foi chamado não precisa saber quem o chamou.

você não está tratando isto no teu código. você está devolvendo o retorno para todas as telas, estando elas criadas ou não, por isso o ACCESS VIOLATION.

mude a forma como faz a consulta.

a tua tela de consulta não deve fazer referência a nenhuma tela que a utiliza.
retire da uses da consulta todas as referências às telas de cadastro.
daí, na tela de consulta, crie uma classe para os dados de retorno.
no caso:
1
2
3
4
5
type
    TRetCidade: record
        Nome: string;
        CEP: string; // cep???
    end;
ainda na tela de consulta, na declaração public, crie uma função para abrir a tela de consulta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type
    TFrmConsulCidade = class(TForm)
    public
        { Public declarations }
        class function Abre: TRetCidade; // função que deverá ser chamada onde se pretender utilizar a consulta de cidades
    end;
 
var
    FrmConsulCidade: TFrmConsulCidade;
 
{*.res}
 
implementation
 
class function TFrmConsulCidade.Abre: TRetCidade;
var
    FrmConsulta: TFrmConsulCidade;
begin
    FrmConsulta := TFrmConsulCidade.Create(nil);
    if FrmConsulta.ShowModal = mrOk then // se finalizou com Ok
    begin
        Result.Nome := FrmConsulta.DBGridConsulCidade.DataSource.Dataset.FieldByName('CIDADE').AsString;
        Result.CEP := FrmConsulta.DBGridConsulCidade.DataSource.Dataset.FieldByName('CEP').AsString;
    end
    else
    begin
        Result.Nome := EmptyStr;
        Result.CEP := EmptyStr;
    end;
    FreeAndNil(FrmConsulta); // finaliza o objeto e libera a memória utilizada
end;
você precisará alterar a implementação do método KeyPress da consulta:
1
2
3
4
5
procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
    if key = #13 then ModalResult := mkOk; // fecha a tela
end;
se você tiver um botão 'ok' na tela de consulta, altere sua propriedade ModalResult para MrOk; se tiver um botão 'fechar' e/ou 'cancelar', altere sua propriedade ModalResult para mrCancel.
agora acrescente a unit da consulta na uses de todos os formulários que pretendem chamar a consulta de cidades (no teu caso, já deve estar acrescentada).

daí, para chamar a consulta, faça assim (supondo que está na tela de cadastro de funcionários):
1
2
3
4
5
6
7
8
9
10
var
    RetCidade: UnitDaTelaDeConsultaDeCidades.TRetCidade;
begin
    RetCidade := TFrmConsulCidade.Abre; // abre a tela de consulta.
    if RetCidade.Nome <> EmptyStr then // quer dizer que a tela de consulta foi 'confirmada'
    begin
        FDQryFunc.FieldByName('CIDADE').AsString := RetCidade.Nome;
        FDQryFunc.FieldByName('CEP').AsString := RetCidade.CEP;
    end;
end;

basta fazer este procedimento em todas as telas que fazem consulta ao cadastro de cidades, efeutando as alterações pertinentes (tabelas/datasets, campos e o que mais for necessário).

desta forma apresentada, ao criar uma nova tela que precise consultar uma cidade, não será necessário alterar a tela de consulta (como era necessário da forma como você desenvolveu).

OBS.: pode haver algum erro de sintaxe porque não tenho Delphi instalado. fiz tudo diretamente aqui no fórum.
Responder

Gostei + 0

10/01/2021

Jefferson

Boa noite!
Não conseguir Emerson, Tenho um alerta de erro ai inserir a classe e a função.


Meu código completo:

unit UnitConsulCidade;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Imaging.pngimage, Vcl.ExtCtrls,
Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids;

type
TFrmConsulCidade = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
DBGridConsulCidade: TDBGrid;
SpeedButton1: TSpeedButton;
EdtConsultaCidade: TEdit;
Image1: TImage;
Label1: TLabel;
procedure SpeedButton1Click(Sender: TObject);
procedure DBGridConsulCidadeDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure EdtConsultaCidadeChange(Sender: TObject);
procedure DBGridConsulCidadeKeyPress(Sender: TObject; var Key: Char);
procedure DBGridConsulCidadeDblClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure EdtConsultaCidadeKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
nome_cid, cep : string;

public
{ Public declarations }
end;


var
FrmConsulCidade: TFrmConsulCidade;

implementation

{$R *.dfm}

uses UnitDataModule, UnitCadCidade, UnitCadastroFuncionario, UnitCadCliente;

procedure TFrmConsulCidade.DBGridConsulCidadeDblClick(Sender: TObject);
begin
FrmConsulCidade.Close;
end;

procedure TFrmConsulCidade.DBGridConsulCidadeDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if not odd(FrmCadasCidade.FDQryCidade.RecNo) then
if not (gdSelected in State) then
begin
DBGridConsulCidade.Canvas.Brush.Color := clGradientInactiveCaption;
DBGridConsulCidade.Canvas.FillRect(Rect);
DBGridConsulCidade.DefaultDrawDataCell(rect,Column.Field,state);
end;
end;

procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
nome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
cep := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
if key = #13 then
begin
FrmConsulCidade.Close;
end;
begin
if key = #13 then
begin
FrmCadastroFunc.FDQryFunc.FieldByName('CIDADE').AsString := nome_cid;
FrmCadastroFunc.FDQryFunc.FieldByName('CEP').AsString := cep;
FrmConsulCidade.Close;
end;
begin
if key = #13 then
begin
FrmCadCliente.FDQryCadCliente.FieldByName('CIDADE').AsString := nome_cid;
FrmCadCliente.FDQryCadCliente.FieldByName('CEP').AsString := cep;
FrmConsulCidade.Close;
end;
end;
end;
end;


procedure TFrmConsulCidade.EdtConsultaCidadeChange(Sender: TObject);
begin
FrmCadasCidade.FDQryCidade.close;
FrmCadasCidade.FDQryCidade.sql.clear;
FrmCadasCidade.FDQryCidade.sql.add('select * from cidade where nome_cid like ''%'+ EdtConsultaCidade.text+'%''');
FrmCadasCidade.FDQryCidade.open;
end;

procedure TFrmConsulCidade.EdtConsultaCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
begin
DBGridConsulCidade.SetFocus;
end;
end;

procedure TFrmConsulCidade.FormShow(Sender: TObject);
begin
EdtConsultaCidade.SetFocus;
end;

procedure TFrmConsulCidade.SpeedButton1Click(Sender: TObject);
begin
FrmCadasCidade.FDQryCidade.Active := true;
end;

end.

Responder

Gostei + 0

10/01/2021

Jefferson

Seria viável eu criar um formulário de consulta para cada cadastro?

Obs: Formulário de consulta(cidade) usa o data source do formulário cadastro cidade.
Responder

Gostei + 0

11/01/2021

Emerson Nascimento

a tela de consulta deveria ser assim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
unit UnitConsulCidade;
 
interface
 
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, FireDAC.Stan.Intf,
    FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
    FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
    FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Imaging.pngimage, Vcl.ExtCtrls,
    Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids;
 
type
    TRetCidade: record
        Nome: string;
        CEP: string;
    end;
 
    TFrmConsulCidade = class(TForm)
        FNome_cid: string; // retorna o nome da cidade
        FCEP: string; // retorna o CEP da cidade
        Panel1: TPanel;
        Panel2: TPanel;
        DBGridConsulCidade: TDBGrid;
        SpeedButton1: TSpeedButton;
        EdtConsultaCidade: TEdit;
        Image1: TImage;
        Label1: TLabel;
        procedure SpeedButton1Click(Sender: TObject);
        procedure DBGridConsulCidadeDrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure EdtConsultaCidadeChange(Sender: TObject);
        procedure DBGridConsulCidadeKeyPress(Sender: TObject; var Key: Char);
        procedure DBGridConsulCidadeDblClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure EdtConsultaCidadeKeyPress(Sender: TObject; var Key: Char);
    private
        { Private declarations }
    public
        { Public declarations }
        class function Abre: TRetCidade; // função que deverá ser chamada onde se pretender utilizar a consulta de cidades
    end;
 
// não precisa declarar a variável abaixo. todo o tratamento será feito pelo médoto Abre (class function Abre)
//var
//  FrmConsulCidade: TFrmConsulCidade;
 
implementation
 
{$R *.dfm}
 
// abaixo deveria ter somente a UnitDataModule, porque o dataset deveria estar na própria tela de consulta
// ** a tela de consulta precisa ser auto-suficiente, precisando somente do datamodulo **
uses
    UnitDataModule, UnitCadCidade;
 
class function TFrmConsulCidade.Abre: TRetCidade;
var
    FrmConsulta: TFrmConsulCidade;
begin
    FrmConsulta := TFrmConsulCidade.Create(nil);
    if FrmConsulta.ShowModal = mrOk then // se finalizou com Ok
    begin
        Result.Nome := FrmConsulta.FNome_Cid;
        Result.CEP := FrmConsulta.FCEP;
    end
    else
    begin
        Result.Nome := EmptyStr;
        Result.CEP := EmptyStr;
    end;
    FreeAndNil(FrmConsulta); // finaliza o objeto e libera a memória utilizada
end;
 
procedure TFrmConsulCidade.FormCreate(Sender: TObject);
begin
    // inicializa os campos de retorno com conteúdo vazio
    FNome_cid := EmptyStr;
    FCep := EmptyStr;
end;
 
procedure TFrmConsulCidade.DBGridConsulCidadeDblClick(Sender: TObject);
begin
//  FrmConsulCidade.Close;
    ModalResult := mrCancel; // fecha a tela com Cancel - poderia ser com Ok
end;
 
procedure TFrmConsulCidade.DBGridConsulCidadeDrawColumnCell(Sender: TObject;
 const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if not odd(FrmCadasCidade.FDQryCidade.RecNo) then
        if not (gdSelected in State) then
        begin
            DBGridConsulCidade.Canvas.Brush.Color := clGradientInactiveCaption;
            DBGridConsulCidade.Canvas.FillRect(Rect);
            DBGridConsulCidade.DefaultDrawDataCell(rect,Column.Field,state);
        end;
end;
 
procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
 var Key: Char);
begin
    if key = #13 then
    begin
        // o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
        FNome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
        FCEP := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
        ModalResult := mrOk; // fecha a tela com Ok
    end;
end;
 
 
procedure TFrmConsulCidade.EdtConsultaCidadeChange(Sender: TObject);
begin
    // o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
    FrmCadasCidade.FDQryCidade.close;
    FrmCadasCidade.FDQryCidade.sql.clear;
    FrmCadasCidade.FDQryCidade.sql.add('select * from cidade where nome_cid like ''%'+ EdtConsultaCidade.text+'%''');
    FrmCadasCidade.FDQryCidade.open;
end;
 
procedure TFrmConsulCidade.EdtConsultaCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
    if key = #13 then
        DBGridConsulCidade.SetFocus;
end;
 
procedure TFrmConsulCidade.FormShow(Sender: TObject);
begin
    EdtConsultaCidade.SetFocus;
end;
 
procedure TFrmConsulCidade.SpeedButton1Click(Sender: TObject);
begin
    // o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
    FrmCadasCidade.FDQryCidade.Open;
end;
 
end.


o uso desta tela deveria ser assim, a partir do cadastro de funcionários:
(precisa colocar UnitConsulCidade na uses do cadastro de funcionários)
1
2
3
4
5
6
7
8
9
10
11
procedure TFrmCadastroFunc.ButtonConsultaCidadeClick(Sender: TObject);
var
    RetCidade: UnitConsulCidade.TRetCidade;
begin
    RetCidade := TFrmConsulCidade.Abre; // abre a tela de consulta.
    if RetCidade.Nome <> EmptyStr then // quer dizer que a tela de consulta foi 'confirmada'
    begin
        FDQryFunc.FieldByName('CIDADE').AsString := RetCidade.Nome;
        FDQryFunc.FieldByName('CEP').AsString := RetCidade.CEP;
    end;
end;
Responder

Gostei + 0

12/01/2021

Jefferson

Bom dia Emerson!

Tive que colocar na cadeia de variável (Private) as variáveis (FNome_cid: string, FCEP: string), pois estava dando erro ao copilar o projeto.
E no evento Double click da grid da tela de consulta coloque pra executar a mesma função do evento onkeypress, pois quero que o usuário utilize as duas opções.

Estou analisando cada linha do código, ainda sou leigo, mais através de pesquisas estou entendendo melhor.

E vou rever a questão sobre o data set está ligado na tela de consulta, deve ser uma ótima ideia, obrigado pelo conselho.

Código:

unit UnitConsulCidade;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Imaging.pngimage, Vcl.ExtCtrls,
Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids;

type
TRetCidade = record
Nome: string;
CEP: string;
end;

TFrmConsulCidade = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
DBGridConsulCidade: TDBGrid;
SpeedButton1: TSpeedButton;
EdtConsultaCidade: TEdit;
Image1: TImage;
Label1: TLabel;
procedure SpeedButton1Click(Sender: TObject);
procedure DBGridConsulCidadeDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure EdtConsultaCidadeChange(Sender: TObject);
procedure DBGridConsulCidadeKeyPress(Sender: TObject; var Key: Char);
procedure DBGridConsulCidadeDblClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EdtConsultaCidadeKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FNome_cid: string; // retorna o nome da cidade
FCEP: string; // retorna o CEP da cidade
public
{ Public declarations }
class function Abre: TRetCidade; // função que deverá ser chamada onde se pretender utilizar a consulta de cidades
end;

// não precisa declarar a variável abaixo. todo o tratamento será feito pelo médoto Abre (class function Abre)
//var
// FrmConsulCidade: TFrmConsulCidade;

implementation

{$R *.dfm}

// abaixo deveria ter somente a UnitDataModule, porque o dataset deveria estar na própria tela de consulta
// ** a tela de consulta precisa ser auto-suficiente, precisando somente do datamodulo **
uses
UnitDataModule, UnitCadCidade;

class function TFrmConsulCidade.Abre: TRetCidade;
var
FrmConsulta: TFrmConsulCidade;
begin
FrmConsulta := TFrmConsulCidade.Create(nil);
if FrmConsulta.ShowModal = mrOk then // se finalizou com Ok
begin
Result.Nome := FrmConsulta.FNome_Cid;
Result.CEP := FrmConsulta.FCEP;
end
else
begin
Result.Nome := EmptyStr;
Result.CEP := EmptyStr;
end;
FreeAndNil(FrmConsulta); // finaliza o objeto e libera a memória utilizada
end;

procedure TFrmConsulCidade.FormCreate(Sender: TObject);
begin
// inicializa os campos de retorno com conteúdo vazio
FNome_cid := EmptyStr;
FCep := EmptyStr;
end;

procedure TFrmConsulCidade.DBGridConsulCidadeDblClick(Sender: TObject);
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FNome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
FCEP := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
ModalResult := mrOk; // fecha a tela com Ok
end;

procedure TFrmConsulCidade.DBGridConsulCidadeDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if not odd(FrmCadasCidade.FDQryCidade.RecNo) then
if not (gdSelected in State) then
begin
DBGridConsulCidade.Canvas.Brush.Color := clGradientInactiveCaption;
DBGridConsulCidade.Canvas.FillRect(Rect);
DBGridConsulCidade.DefaultDrawDataCell(rect,Column.Field,state);
end;
end;

procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FNome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
FCEP := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
ModalResult := mrOk; // fecha a tela com Ok
end;
end;


procedure TFrmConsulCidade.EdtConsultaCidadeChange(Sender: TObject);
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FrmCadasCidade.FDQryCidade.close;
FrmCadasCidade.FDQryCidade.sql.clear;
FrmCadasCidade.FDQryCidade.sql.add('select * from cidade where nome_cid like ''%'+ EdtConsultaCidade.text+'%''');
FrmCadasCidade.FDQryCidade.open;
end;

procedure TFrmConsulCidade.EdtConsultaCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
DBGridConsulCidade.SetFocus;
end;

procedure TFrmConsulCidade.FormShow(Sender: TObject);
begin
EdtConsultaCidade.SetFocus;
end;

procedure TFrmConsulCidade.SpeedButton1Click(Sender: TObject);
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FrmCadasCidade.FDQryCidade.Open;
end;

end.


Cara você me ajudou demais, Muito obrigado!!!

Que Deus te pague...
Responder

Gostei + 0

12/01/2021

Emerson Nascimento

já que o evento KeyPress e DblClick da DBGridConsulCidade terão a mesma função, altere a implementação do evento KeyPress:
1
2
3
4
5
6
procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
  if key = #13 then
    DBGridConsulCidadeDblClick(Sender); // chama o evento DblClick
end;
Responder

Gostei + 0

12/01/2021

Emerson Nascimento

Está fácil voce resolver a questão do dataset.
Basta copiar o FDQryCidade - e seu datasource, se for o caso - para a tela de consulta. Daí fazer as ligações de grades e/ou dbedits (componentes data-aware) nesse novo conjunto dataset/datasource (terão até os mesmos nomes).
Com tudo pronto, basta apagar todas as referências à FrmCadasCidade da tela de consulta de cidades, inclusive a declaração na uses.
Responder

Gostei + 0

14/01/2021

Jefferson

Só mais uma pergunta Emerson, eu queria que no evento onkeypress do DbGrid, somente chamasse o formulário, quando a tecla enter fosse pressionada. Tentei aqui só que acho que vou ter que mudar a estrutura do código da tela de consulta , pois espera uma expressão do tipo true ou false. Poderia me dá uma dica de como posso fazer?




Responder

Gostei + 0

14/01/2021

Emerson Nascimento

de qual dbGrid? da tela de consulta?
1
2
3
4
5
6
7
8
9
procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
  if key = #13 then
  begin
    DBGridConsulCidadeDblClick(Sender); // chama o evento DblClick
    key = #0; // limpa a tecla, para que a ação não seja propagada
  end;
end;
Responder

Gostei + 0

14/01/2021

Jefferson

Exemplo:

procedure TFrmCadastroFunc.DBEditCidFuncKeyPress(Sender: TObject;
var Key: Char);
var
RetCidade: UnitConsulCidade.TRetCidade;
begin
RetCidade := TFrmConsulCidade.Abre; // abre a tela de consulta.
if key = # 13 then
begin
RetCidade.Nome <> EmptyStr then // quer dizer que a tela de consulta foi 'confirmada'
FDQryFunc.FieldByName('CIDADE').AsString := RetCidade.Nome;
FDQryFunc.FieldByName('CEP').AsString := RetCidade.CEP;
DBEditCepFunc.SetFocus;
end;
end;


Só exemplo, sei que a logica está errada.

No caso assim que eu pressionasse enter no dbedit o fomulário de consulta será chamado.
Responder

Gostei + 0

14/01/2021

Jefferson

Fiz da seguinte forma:

procedure TFrmCadastroFunc.DBEditCidFuncKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
begin
SbConsultaCidadFunc(sender);
end;
end;

No formulário também tem um botão que ao ser clicado possibilita que o usuário faça a chamada da tela de consulta.

E no botão contém o código no qual você me passou, não sei se é correto, mais enfim, está funcionando.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar