Надеюсь, я могу объяснить, что именно проблема, которую я пытаюсь решить. У меня есть форма с тремя папками: 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, когда пользователь нажимает кнопку «новый» или кнопку «Изменить», но я не могу достичь такого способа работы.
Вот источник для тха использовать два фрейма (и некоторые другие)
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.
Как вы можете видеть в приведенном выше коде также база данных используется через интерфейс! Надеюсь, я был ясно из моего объяснения, но я знаю, что вопрос немного усложняется. Может, пожалуйста, кто-нибудь мне поможет?
Что не так с использованием 'edtIdEditore.SetFocus;' или 'ActiveControl: = edIdEditore;'? –
Проблема заключается в том, что элемент управления edtIdEditore находится в кадре, который контролируется интерфейсом, а форма «tabelle» не знает этого элемента управления. – Eros