Delphi 帧中的焦点控制

Delphi 帧中的焦点控制,delphi,interface,Delphi,Interface,我希望我能解释这是我试图解决的问题。 我有一个包含3个papnel的表单:1个用于按钮,1个用于数据,1个用于消息。数据面板中填充了一些框架(我需要使用的每个数据库表对应一个框架)。 表格细节框架和另一个用于在网格中显示记录的框架通过界面进行操作 此处是网格框架: unit FraEdtList; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Class

我希望我能解释这是我试图解决的问题。 我有一个包含3个papnel的表单: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.
以下是接口单元:

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”单元添加到将使用框架的表单中。 对于本例,我没有使用网格,只使用了细节框架,当用户选择一个表时,记录显示为以下示例:

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

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

以下是使用这两个框架(以及其他一些框架)的原因

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

例如,要在用户单击
btnEdit
时关注
edtiteditore
,请执行以下操作:

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

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

需要扩展接口IEditori,以便为外部控制表单提供一种通知接口所需内容的方式。例如,接口可以有AddingRecord、SavingRecord、ValidateRecord等方法。这样,父窗体就不需要知道框架上的各个控件,但可以通过设置聚焦控件来告诉框架发生了什么,并做出正确的反应。您可能还需要对新记录执行其他操作,如默认值或设置附加状态


有时,您可以通过直接从表(如OnNewRecord)处理事件来解决问题,但当您传递一个表时,您需要确保不涉及其他位置设置的事件。

使用
edtiteditore.SetFocus
ActiveControl:=edideditor?问题是edtIdEditore控件位于一个由接口控制的帧中,而表单“tabelle”不知道该控件。
{ Editazione record }
procedure TfrmTabelle.btnEditClick(Sender: TObject);
begin
  if FDBTable.EditRecord then
    SetButtonsStatus(False, False, True, False, True, True);
  frmTabelle.edtIdEditore.SetFocus;
end;