Leitfaden für die Umstellung eines Dialogs auf Commons Detail
Zu implementieren:
///\<summary\>
///Dialog CPA\_DetailDialog
///\</summary\>
///\<remarks\>
///(C) Copyright 2019, CP Solutions \- All Rights Reserved.
///\</remarks\>
unit CPA\_Dialog;
interface
uses
CLR\_System,
CLRBridgeCore,
//CPA\_Common
DPlus\_Common\_Modul,
CPA\_CommonDlgIntf,
CPA\_CommonDetail,
CPA\_OmModul;
{$M+}
type
///\<summary\>
///Dialog Form1
///\</summary\>
\[NetFrameDialog('GUID', CPA\_DialogName)\]
TfrmCPA\_Dialog \= class(TfrmCommonDetail, ICPA\_DialogInterface, ICPA\_DetailDlg)
{$REGION 'TfrmCommonDetail'}
protected
procedure OnBeforeLoadData; override;
procedure OnLoadData; override;
procedure OnAfterLoadData; override;
function OnBeforeSaveData: Boolean; override;
function OnSaveData: Boolean; override;
function OnAfterSaveData: Boolean; override;
{$ENDREGION}
end;
implementation
{$R \*.dfm}
{TfrmCPA\_Dialog}
procedure TfrmCPA\_Dialog.frmDesignDialogCreate(Sender: TObject);
begin
OnDialogCreate(TCLROmModul.modulName, Hauptdatenmenge);
end;
{$REGION 'TfrmCommonDetail'}
procedure TfrmCPA\_Dialog.OnBeforeLoadData;
begin
inherited;
//TODO: Befüllung von Comboboxen, etc.
end;
procedure TfrmCPA\_Dialog.OnLoadData;
begin
//TODO: Laden der Hauptdatenmenge \+ sonstige Datenmengen
end;
procedure TfrmCPA\_Dialog.OnAfterLoadData;
begin
inherited;
if FDataState \= dsNewMode then
begin
//TODO: Comboboxen auf Standardwerte setzen
end;
end;
function TfrmCPA\_Dialog.OnBeforeSaveData: Boolean;
begin
Result := inherited;
//TODO: Dinge die geschehen sollen bevor gespeichert werden kann
end;
function TfrmCPA\_Dialog.OnSaveData: Boolean;
begin
//TODO: Daten speichern
end;
function TfrmCPA\_Dialog.OnAfterSaveData: Boolean;
begin
Result := inherited;
if FDataState \= dsNewMode then
begin
FDataState := dsEditMode;
end;
//TODO: Dinge die nach erfolgreichem Speichern geschehen sollen
end;
{$ENDREGION}
end.
NICHT zu implementieren:
Es gibt keine Eigenschaften PE_ID, PI_ID, KR_ID, etc….
Die ID (Primärschlüssel) des Datensatzes wird über die Eigenschaft PrimaryKey an den Dialog übergeben. Sämtliche weiteren Zuordnungen (für Vorbefüllung von Verknüpfungen bei neuen Datensätzen) werden über die Eigenschaft Zuordnungen geschleust. D.h. im Allgemeinen kann ein CommonDetail-Dialog geöffnet werden, ohne dass spezifische Eigenschaften + Getter + Setter implementiert werden müssen.
Die Variable DataState ist ebenfalls in der Basisklasse definiert und muss nicht nochmal deklariert werden.
Laden und Speichern
LoadData() und SaveData() sind in der Basisklasse implementiert und dürfen nicht im Dialog redeklariert werden.
LoadData() führt hintereinander OnBeforeLoadData(), OnLoadData() und OnAfterLoadData() aus.
SaveData() führt hintereinander OnBeforeSaveData(), OnSaveData() und OnAfterSaveData() aus. Die jeweils nächste Funktion wird hier nur ausgeführt wenn der vorherige Aufruf TRUE zurück lieferte.
Feldprotokoll und Pflichtfelder
Das Mitschreiben von Änderungen übernimmt die Basisklasse (hängt jeweils im OnAfterLoadData() und OnAfterSaveData()). Es ist nicht nötig, irgendetwas auszuprogrammieren.Selbiges gilt für die Plichtfeld-Logik
URL Injection / Popup-Menü bei Maus-Rechtsklick
Sofern im jeweiligen Modul das UrlInjection-Flag auf true gestellt ist, erscheint das entsprechende Kontextmenü bei rechtem Mausklick automatisch.
Auch für das Feldprotokoll muss im Dialog nichts implementiert werden
Dialog Injections
- Injection.BeforeLoad()
- Injection.AfterLoad()
- Injection.BeforeSave()
- Injection.AfterSave()
Wird alles in der Basisklasse abgehandelt und muss nicht implementiert werden