gpt4 book ai didi

delphi - 框架内的焦点控制

转载 作者:行者123 更新时间:2023-12-03 15:34:51 26 4
gpt4 key购买 nike

我希望我能解释一下我正在尝试解决的问题。我有一个包含 3 个面板的表单:1 个用于按钮,1 个用于数据,1 个用于消息。数据面板填充了一些框架(一个用于我需要使用的每个数据库表)。表格详细信息框架和另一个用于在网格中显示记录的框架是通过界面进行操作的。

这里是网格框架:

unit FraEdtList;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.Grids, Vcl.DBGrids;

type
TFraEdtLst = class(TFrame)
grdEditori: TDBGrid;
private
{ Private declarations }
public
{ Public declarations }
end;

implementation

{$R *.dfm}

uses database;

end.

这里是详细框架:

unit FraEdtDetail;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls;

type
TFraEdtDtl = class(TFrame)
lblIdEditore: TLabel;
edtIdEditore: TDBEdit;
lblDscEditore: TLabel;
edtDscEditore: TDBEdit;
private
{ Private declarations }
public
{ Public declarations }
end;

implementation

{$R *.dfm}

uses database;

{ TFraEdtDtl }


{ TFraEdtDtl }

end.

这是接口(interface)单元:

unit Editori;

interface

uses
FraEdtList, FraEdtDetail;

type
IEditori = interface
procedure CreateFraEdtLst();
procedure CreateFraEdtDtl();
end;

TEditori = class(TInterfacedObject, IEditori)
private
FEdtLst: TfraEdtLst;
FEdtDtl: TfraEdtDtl;
procedure CreateFraEdtLst();
procedure CreateFraEdtDtl();
end;

implementation

{ TAutori }

uses Tabelle;

procedure TEditori.CreateFraEdtLst;
begin
FEdtLst := FEdtLst.Create(frmTabelle);
FEdtLst.Parent := frmTabelle.pnlDta;
end;

procedure TEditori.CreateFraEdtDtl;
begin
FEdtDtl := TfraEdtDtl.Create(frmTabelle);
FEdtDtl.Parent := frmTabelle.pnlDta;
end;

end.

我已将“Editori”单元添加到将使用框架的表单中。在本示例中,我没有使用网格,而仅使用了详细信息框架,当用户选择表格时,记录将显示为以下示例:

enter image description here

例如,第一个按钮(带有一张白纸)用于在我的数据库表中插入新记录,第二个按钮用于编辑当前显示的记录等等。

问题是,当用户单击“新建”按钮或“编辑”按钮时,我想聚焦 DBEdit 组件,但我无法找到执行此类操作的方法。

这是使用两个框架(和其他一些框架)的来源

unit Tabelle;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.ExtCtrls, RzPanel, dxBevel, Vcl.Buttons, PngSpeedButton, Autori,
Editori, DBInterface, DbImplementation, MSAccess;

type
TfrmTabelle = class(TForm)
pnlCmd: TRzPanel;
pnlDta: TRzPanel;
pnlMsg: TRzPanel;
bvlCmd: TdxBevel;
bvlNav: TdxBevel;
btnNew: TPngSpeedButton;
btnEdit: TPngSpeedButton;
btnSave: TPngSpeedButton;
btnDelete: TPngSpeedButton;
btnUndo: TPngSpeedButton;
btnPrior: TPngSpeedButton;
btnNext: TPngSpeedButton;
procedure FormCreate(Sender: TObject);
procedure btnNewClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure btnPriorClick(Sender: TObject);
procedure btnNextClick(Sender: TObject);
procedure btnEditClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure btnUndoClick(Sender: TObject);
private
FDBTable: IDBTable;
FAutori: IAutori;
FEditori: IEditori;
public
procedure SetButtonsStatus(stsNew, stsEdit, stsSave, stsDelete, stsUndo, stsPnlDta: Boolean);
procedure SetTableName(Table: TMSTable);
end;

var
frmTabelle: TfrmTabelle;

implementation

{$R *.dfm}

{ TfrmTabelle }

{ Inizializzazione }
procedure TfrmTabelle.FormCreate(Sender: TObject);
begin
FDBTable := TDBtable.Create;
end;

{ Impostazione tabella di lavoro }
procedure TfrmTabelle.SetTableName(Table: TMSTable);
begin
FDBTable.DBTable := Table;
SetButtonsStatus(True, True, False, True, False, False);

// Tabella autori
if Table.TableName = 'Autori' then begin
if not Assigned(FAutori) then begin
FAutori := TAutori.Create;
FAutori.CreateFraAutDtl;
end;
end;

// Tabella editori
if Table.TableName = 'Editori' then begin
if not Assigned(FEditori) then begin
FEditori := TEditori.Create;
FEditori.CreateFraEdtDtl;
end;
end;

end;

{ Impostazione pulsanti }
procedure TfrmTabelle.SetButtonsStatus(stsNew, stsEdit, stsSave, stsDelete, stsUndo, stsPnlDta: Boolean);
var
flgTblEmpty: Boolean;
begin
flgTblEmpty := FDBTable.TableIsEmpty;
btnNew.Enabled := stsNew;
btnEdit.Enabled := stsEdit and not flgTblEmpty;
btnSave.Enabled := stsSave;
btnDelete.Enabled := stsDelete and not flgTblEmpty;
btnUndo.Enabled := stsUndo;
pnlDta.Enabled := stsPnlDta;
end;

{ Inserimento nuovo record }
procedure TfrmTabelle.btnNewClick(Sender: TObject);

begin
if FDBTable.NewRecord then
SetButtonsStatus(False, False, True, False, True, True);
end;

{ Editazione record }
procedure TfrmTabelle.btnEditClick(Sender: TObject);
begin
if FDBTable.EditRecord then
SetButtonsStatus(False, False, True, False, True, True);
end;

{ Salvataggio record }
procedure TfrmTabelle.btnSaveClick(Sender: TObject);
begin
if FDBTable.SaveRecord then
SetButtonsStatus(True, True, False, True, False, False);
end;

{ Cancellazione record }
procedure TfrmTabelle.btnDeleteClick(Sender: TObject);
begin
if FDBTable.DeleteRecord then
SetButtonsStatus(True, True, False, True, False, False);
end;

{ Annulla l'operazione in corso }
procedure TfrmTabelle.btnUndoClick(Sender: TObject);
begin
if FDBTable.UndoRecord then
SetButtonsStatus(True, True, False, True, False, False);
end;



{ Record precedente }
procedure TfrmTabelle.btnPriorClick(Sender: TObject);
begin
if FDBTable.PriorRecord then
SetButtonsStatus(True, True, False, True, False, False);
end;

{ Record successivo }
procedure TfrmTabelle.btnNextClick(Sender: TObject);
begin
FDBTable.NextRecord;
end;

end.

正如您在上面的代码中看到的,数据库也是通过接口(interface)使用的!我希望我的解释很清楚,但我知道这个问题说起来有点复杂。请有人帮助我吗?

最佳答案

例如,要在用户单击 btnEdit 时将焦点集中到 edtIdEditore,请执行以下操作:

{ Editazione record }
procedure TfrmTabelle.btnEditClick(Sender: TObject);
begin
if FDBTable.EditRecord then
SetButtonsStatus(False, False, True, False, True, True);
frmTabelle.edtIdEditore.SetFocus;
end;

或者将 frmTabelle 替换为单元的 var 部分中公开的表单实例的名称,然后将该单元添加到您的 uses 子句中你就完成了。

关于delphi - 框架内的焦点控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30261270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com