2015-05-15 3 views
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. 

Вот модуль интерфейса:

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. 

Как вы можете видеть в приведенном выше коде также база данных используется через интерфейс! Надеюсь, я был ясно из моего объяснения, но я знаю, что вопрос немного усложняется. Может, пожалуйста, кто-нибудь мне поможет?

+0

Что не так с использованием 'edtIdEditore.SetFocus;' или 'ActiveControl: = edIdEditore;'? –

+0

Проблема заключается в том, что элемент управления edtIdEditore находится в кадре, который контролируется интерфейсом, а форма «tabelle» не знает этого элемента управления. – Eros

ответ

0

Интерфейс IEditori необходимо развернуть, чтобы обеспечить внешнюю управляющую форму способом информирования интерфейса о том, что необходимо. Например, интерфейс может иметь такие методы, как AddingRecord, SavingRecord, ValidateRecord и т. Д. Затем родительская форма не обязательно должна знать об отдельных элементах управления в кадре, но кадр может быть проинформирован о том, что происходит, и отреагировать правильно, установив сфокусированное управление. Могут быть другие вещи, которые вы хотите сделать для новой записи, например, значения по умолчанию или установки дополнительного состояния.

Вы можете иногда разбираться в событиях непосредственно из таблицы, таких как OnNewRecord, но когда вы проходите таблицу вокруг, вам нужно убедиться, что вы не наступаете на события, которые были установлены в другом месте.

1

Например, чтобы передать фокус edtIdEditore, когда пользователь нажимает btnEdit сделать следующее:

{ 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, и все готово.

Смежные вопросы