heute meine Frage ist (wieder) über Delphi Frames. Ich habe eine Anwendung mit einem Hauptformular und einer Schnittstelle, die zwei Frames verwendet: das erste zum Anzeigen einer Liste von Datensätzen in einem DBGrid und das zweite zum Anzeigen und Bearbeiten des Details des ausgewählten Datensatzes. Hier die Liste Rahmen innerhalb der Hauptform:Delphi Frames schließen Formular
und hier im Detail Rahmen:
hier ist die Schnittstelle Code:
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.
ich kann‘ Ich weiß nicht, wie man etwas macht. Wenn sich der Benutzer im Detailrahmen befindet und das Hauptformular schließt, wird er geschlossen, aber ich möchte in diesem Fall das Formular nicht schließen, sondern den Listenrahmen anzeigen. Hier
ist die Quelle der Liste Rahmen:
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.
und hier ist die Quelle des Detail Rahmen:
Einheit 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.
Wie Sie sehen können, verwende ich Nachrichten, um zwischen Frames zu kommunizieren; zum Beispiel für die Detailrahmen aus der Liste zeigt ein:
SendMessage(frmTabelle.Handle, WM_DTL_RECORD, 0, 0)
Es gibt einen Weg, um den Formschluss und stattdessen zeigt die Liste Rahmen zu vermeiden, wenn der Benutzer auf dem feld ist?
Neben: Senden von Nachrichten scheint seltsam. Warum nicht eine Methode aufrufen? –
Ich bin immer noch Anfänger von Schnittstellen, so dass ich nicht weiß, sie sehr zu verwenden. Zum Beispiel weiß ich nicht, wie man eine Methode in der Schnittstelle zum Abfangen des Doppelklicks auf das DBGrid wie im Rahmen "FraAutList" erstellt. – Eros