今日私の質問は(再び)デルファイフレームについてです。 私はメインフォームと2つのフレームを使用するインターフェイスを持つアプリケーションを持っています。最初はDBGridのレコードの一覧を表示し、もう1つは選択したレコードの詳細を表示して編集するためのものです。 メインフォーム内のここでリストフレーム:デルファイフレーム閉じるフォーム
、ここで詳細フレーム:ここ
は、インタフェースコードです:
unit TblInterface;
interface
uses
System.TypInfo, Vcl.Forms, RzPanel, Winapi.Windows, Winapi.Messages,
UserMessages, Vcl.Dialogs;
type
TFrameClass = class of TFrame;
ITabella = interface
['{D21924F9-BB41-493B-B06D-0908C0CA73D8}']
procedure CreateLstFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
procedure CreateDtlFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
procedure DestroyLstFrame;
procedure DestroyDtlFrame;
procedure BringFrameToFront(FrameType: string);
procedure OnEditRecord;
end;
TTabella = class(TInterfacedObject, ITabella)
private
FLst: TFrame;
FDtl: TFrame;
procedure CreateLstFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
procedure CreateDtlFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
procedure DestroyLstFrame;
procedure DestroyDtlFrame;
procedure BringFrameToFront(FrameType: string);
procedure OnEditRecord;
end;
implementation
{ TTabella }
{ Creazione foglio lista }
procedure TTabella.CreateLstFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
begin
FLst := Frame.Create(ParentPanel);
FLst.Parent := ParentPanel;
end;
{ Creazione form dettaglio }
procedure TTabella.CreateDtlFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
begin
FDtl := Frame.Create(ParentPanel);
FDtl.Parent := ParentPanel;
end;
{ Gestione inserimento/modifica record }
procedure TTabella.OnEditRecord;
begin
SendMessage(FDtl.Handle, WM_EDT_RECORD, 0, 0)
end;
{ Distruzione frame lista }
procedure TTabella.DestroyLstFrame;
begin
FLst.Free;
end;
{ Distruzione frame dettaglio }
procedure TTabella.DestroyDtlFrame;
begin
FDtl.Free;
end;
procedure TTabella.BringFrameToFront(FrameType: string);
begin
if FrameType = 'lst' then
FLst.BringToFront;
if FrameType = 'dtl' then
FDtl.BringToFront;
end;
end.
私ができます」ものを作る方法を実現しない。ユーザーが詳細フレーム上にあり、メインフォームを閉じると、閉じますが、この場合はフォームを閉じるのではなく、リストフレームを表示したいと思います。ここ
リストフレームの送信元である:
unit FraAutList;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.Grids, Vcl.DBGrids, UserMessages;
type
TfraAutLst = class(TFrame)
grdAutori: TDBGrid;
procedure grdAutoriDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
uses database, Tabelle;
procedure TfraAutLst.grdAutoriDblClick(Sender: TObject);
begin
SendMessage(frmTabelle.Handle, WM_DTL_RECORD, 0, 0)
end;
end.
、ここでは、詳細フレームの送信元である:
ユニットFraAutDetail。
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, UserMessages;
type
TFraAutDtl = class(TFrame)
lblIdAutore: TLabel;
edtIdAutore: TDBEdit;
lblCognome: TLabel;
edtCognome: TDBEdit;
lblNome: TLabel;
edtNome: TDBEdit;
private
procedure OnEditRecord(var Msg: TMessage); message WM_EDT_RECORD;
public
{ Public declarations }
end;
implementation
{$R *.dfm}
uses database;
{ TfraAutDtl }
procedure TFraAutDtl.OnEditRecord(var Msg: TMessage);
begin
edtCognome.SetFocus;
end;
end.
ご覧のとおり、フレーム間のコミニケーションを行うためにメッセージを使用しています。例えば、リスト1の詳細フレームを示すために:
SendMessage(frmTabelle.Handle, WM_DTL_RECORD, 0, 0)
ユーザーが詳細フレームにあるときに、リストの枠を表示代わりに、フォームの閉鎖を回避し、方法はありますか?
脇:送信メッセージが奇妙に見えます。なぜメソッドを呼び出さないのですか? –
私はまだインタフェースの初心者ですので、あまり使用することは知らないです。たとえば、 "FraAutList"フレームで行うように、DBGridのダブルクリックをインターセプトするためのインターフェイスでメソッドを作成する方法がわかりません。 – Eros