Thema: Delphi Datenmodul

Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Datenmodul

  Alt 22. Dez 2013, 14:15
Das Datenmodul meint das das Formular PatientFrm Nil ist warum?
Wozu benötigst du im Datenmodul eine Referenz auf deine Form-Unit? Ich gestehe, ich habe das früher, als ich's noch nicht besser wußte, auch so gemacht, um z.B. die Statusbar in der Hauptform (UnitMain) aktualisieren zu können, wenn sich der Datensatzzeiger eines Queries ändert. Dazu hatte ich die UnitMain in die Uses-Klausel des Datenmoduls aufgenommen, und zwar im Implementationsabschnitt. Das hat dann zwar funktioniert, ist aber ganz schlechter Stil. Heute mache ich das so:

1. Das Datenmodul erhält im Interface-Abschnitt eine neue Typ-Deklaration.
2. Unter PRIVATE wir eine Variable dieses neuen Typs deklariert.
3. Unter PUBLIC wird ein neues Property deklariert.
4. In der Ereignisbehandlung AfterScroll wird nun das Ereignis ausgelöst.
5. In der MainForm wird nun in OnActivate festgelegt, was beim ausgelösten Ereignis zu geschehen hat.

Delphi-Quellcode:
UNIT UnitData;

INTERFACE

USES
  SysUtils, Classes, DB, DBAccess, IBC, MemDS, Dialogs;

// 1. neue Typ-Deklaration
TYPE TUpdateStatusbarEvent = Procedure of Object;

TYPE
  TDatMod = CLASS(TDataModule)
    ConMain : TIBCConnection;
    ...

    Procedure Qset_ArbeitgeberAfterScroll(DataSet: TDataSet);

  PRIVATE { Private-Deklarationen }
    Var
// 2. Variable des neuen Typs
      fUpdateStatusbar : TUpdateStatusbarEvent;

  PUBLIC { Public-Deklarationen  }
    Function Verbinden_Datenbank : Boolean;
    ...

// 3. neues Property
    Property OnUpdateStatusbar : TUpdateStatusbarEvent Read fUpdateStatusbar Write fUpdateStatusbar;
  END;

Var
  DatMod: TDatMod;

IMPLEMENTATION

...

Procedure TDatMod.Qset_ArbeitgeberAfterScroll(DataSet: TDataSet);
begin
  BTab.Firma_ID := Qset_Arbeitgeber.FieldByName('ID_ARBEITGEBER').AsInteger;
// 4. Ereignis auslösen
  IF Assigned(fUpdateStatusbar) THEN fUpdateStatusbar;
end;

...

// 5. In der MainForm wird nun in OnActivate festgelegt, was beim ausgelösten Ereignis zu geschehen hat
Procedure TFormMain.FormActivate(Sender: TObject);
begin
  ...

  // Die private Methode StatusBarAktualisieren wird aufgerufen, wenn das Ereignis eintritt
  DatMod.OnUpdateStatusbar := StatusBarAktualisieren;

  ...
end;
  Mit Zitat antworten Zitat