Einzelnen Beitrag anzeigen

RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert es?

  Alt 4. Jul 2011, 14:39
Hallo,

Standardfall:
In einer Unit MyDataModule ist die Klasse TMyDM = class(TDataModule) definiert. In dieser Klasse gibt es die DataSource MyDS. Zusätzlich gibt es in dieser Unit eine globale Variable MyDM: TMyDM. Nun kann in einer anderen Unit im Formdesigner in dem TDBEdit im Feld DataSource eingetragen werden "MyDM.MyDS".
Zur Laufzeit kann nun das DBEdit auf die Instanz der MyDS zugreifen. Ich habe mir nie den Kopf zerbrochen, wie das funktioniert - wird wohl irgendwie über die globale Variable funktionieren.

Komplizierterer Fall:
MyDs ist in TMyCustomDM definiert. Es gibt keine globale Variable MyCustomDM: TMyCustomDM. TMyCustomDM ist durch Visual Inheritance zu TMyDM abgeleitet und erbt damit MyDS. Es gibt auch keine globale Variable MyDM: TMyDM.
Nun gibt es eine Superklasse TMyCustomForm, auf der ein MyDBEdit: TDBEdit liegt. In TMyCustomForm gibt es eine public Eigenschaft DM: TMyCustomDM read FMyDM. TMyCustomForm ist durch Visual Inheritance zu TMyForm abgeleitet. In TMyForm wir die Eigenschaft DM verdeckt durch eine gleichnamige Eigenschaft DM: TMyDM read GetMyDM, wobei MyDM lediglich eine Typumwandlung durchführt: Result := TMyDM(FMyDM); Im Konstruktor von TMyForm wird das Datenmodul erzeugt: FMyDM := TMyDM.Create(Self); Die Instanz vom Typ TMyDM steckt also in TMyCustomForm.MyDM.
Nun kann ich im FormDesigner in TMyCustomForm.MyDBEdit in der Eigenschaft DataSource "MyCustomDM.MyDS" eintragen.
Auch in diesem Fall funktioniert MyDBEdit wie es soll. Ich kann mir nun aber beim besten Willen nicht mehr vorstellen, wie MyDBEdit an die Instanz des Datenmoduls kommt.

Zur Übersicht Auszüge aus den Units des komplizierteren Falls:
Delphi-Quellcode:
Unit UMyCustomDataModule;
type
  TMyCustomDM = class(TDataModule)
    MyDS: TDataSource;
  end;
Delphi-Quellcode:
Unit UMyDataModule;
type
  TMyDM = class(TMyCustomDM)
  end;
Delphi-Quellcode:
Unit UMyCustomForm;
type
  TMyCustomForm = class(TForm)
    MyDBEdit: TDBEdit;
  protected
    FMyDM: TMyCustomDM;
  public
    property MyDM: TMyCustomDM read FMyDM;
  end;
Delphi-Quellcode:
Unit UMyForm;
type
  TMyForm = class(TMyCustomForm)
  private
    function GetMyDM: TMyDM;
  public
    constructor Create(AOwner: TComponent); override;
    property MyDM: TMyDM read GetMyDM;
  end;
implementation

constructor TMyForm.Create(AOwner: TComponent);
begin
  FMyDM := TMyDM.Create(Self);
  inherited;
end;

function TMyForm.GetMyDM: TMyDM;
begin
  Result := TMyDM(FMyDM);
end;
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."

Geändert von RSE ( 5. Jul 2011 um 13:19 Uhr) Grund: tippfehlerbereinigt (Sichtbarkeiten und Bezeichner)
  Mit Zitat antworten Zitat