AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert es?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von RSE · begonnen am 4. Jul 2011 · letzter Beitrag vom 7. Jul 2011
Antwort Antwort
Seite 1 von 3  1 23      
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, 15: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 14:19 Uhr) Grund: tippfehlerbereinigt (Sichtbarkeiten und Bezeichner)
  Mit Zitat antworten Zitat
RSE

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

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 11:25
Zum Hintergrund der Frage: Ich möchte wissen, ob das nur zufällig funktioniert und vielleicht irgendwann nicht mehr geht oder gar Zugriffsverletzungen verursacht.

Ich habe zu dem Thema im Vorfeld versucht zu suchen, es ist mir aber nicht gelungen Suchwörter zu finden, die zu einer Erklärung dieses Sachverhaltes führten. Sollte der oben beschriebene Sachverhalt schon anderweitig beschrieben sein, dann bitte ich um einen kurzen Wegweiser dorthin.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#3

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 11:29
Delphi-Quellcode:
Unit UMyCustomDataModule;
type
  TMyCustomDM = class(TDataModule)
    MyDS: TDataSource;
  end;
Keine Angabe der Sichtbarkeit wird mit public gleichgesetzt. Das sollte also immer funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 11:30
War es nicht sogar published? Ich meine, in einer Fehlermeldung stand mal sowas.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 11:31
hm, da ich nicht soo viel visuell arbeite, ist mir das eigentlich gleich
  Mit Zitat antworten Zitat
RSE

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

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 14:09
Keine Sichtbarkeitsangabe = published, ist für alle visuell erzeugten Komponenten Standard. Wer Zugriff auf eine Instanz der Klasse TMyDM hat, der hat auch Zugriff auf MyDS. So weit, so klar. Die Frage ist: Woher kennt die Komponente MyDBEdit die Adresse meiner Instanz von TMyDM? Diese Steckt ja in der Eigenschaft MyDM des Parents (Instanz der Klasse TMyForm) von MyDBEdit, aber das sage ich dem DBEdit ja zur Designtime nicht... MyDBEdit kennt nur "MyCustomDM.MyDS" - kein Hinweis auf Parent.MyDM.MyDS
"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 14:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 14:36
Ich habe mal versucht zu folgen...
Evtl. gehst Du von etwas falschen Voraussetzungen aus (wenn das jetzt nicht auf mich selbst zutrifft ).

Zur Designtime muss nicht die DBEdit die anzubindendenden Komponenten kennen bzw. finden, sondern ein Eigenschaftseditor, der auf die im Projekt eingebundenen Units direkt zugreift. Also muss die IDE die vorhandenen DataModule kennen, nicht die DBEdit. Die wartet nur stumpf, ob Ihr irgend etwas (von der IDE) zugewiesen wird.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
RSE

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

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 14:59
Zur Laufzeit muss das DBEdit ja wissen, woher es seine Anzeige lesen und wohin es seinen geänderten Text schreiben soll, dazu kann ich zur Designtime die Eigenschaften "DataSource" und "DataField" angeben. Diese werden dann zur Laufzeit benutzt, um auf die Datasource zuzugreifen und das Feld aus "DataField" zu lesen bzw. zu schreiben. D.h. aufgrund des Wertes in "DataSource" muss es zur Laufzeit möglich sein, die Instanz der Datasource zu finden. Die Property "DataSource" ist vom Typ TDatasource (also ein "Pointer" auf die Instanz einer Datasource). Da es zur Designtime schlecht möglich ist einen Pointer auf die Adresse zu hinterlegen, in der zur Laufzeit einmal das Objekt stehen wird, wird zur Designtime lediglich der Text "MyCustomDM.MyDS" hinterlegt, welcher dann beim Laden der Komponente MyDBEdit zur Laufzeit in einen Zeiger verwandelt werden muss. Die Frage ist, wie findet die Komponente unter Zuhilfenahme welcher weiteren Informationen das Objekt?
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
bhenker

Registriert seit: 10. Dez 2005
Ort: Plauen
8 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 15:30
Wenn ich mich richtig erinnere werden diese Komponenten beim Laden der DFM zugewiesen.
Einfach mal nach FixupReferences in der Classes.pas suchen.
Wird so auf eine Datenquelle in einem externen Datenmodul verwiesen, wird das über die globale Variable des Datenmodule in der jeweiligen Unit aufgelöst.
Deshalb sollte diese Variable zur Laufzeit auch belegt sein. Das wird in der Regel im Project mit "Application.CreateForm(MyDataModule, DMyDataModule)" auch erledigt.
Wenn mann das globale Erstellen dieser Module nicht durchführt, muß man schon selbst dafür sorgen das es erstellt wird.
  Mit Zitat antworten Zitat
RSE

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

AW: Wie kommt ein TDBEdit an die Instanz meines DataModules? Warum/Wie funktioniert e

  Alt 5. Jul 2011, 15:51
Wie geschrieben, gibt es diese globale Variable bei mir nicht. Das Datenmodul wird "von Hand" im Konstruktor von MyForm erzeugt. Deswegen wundere ich mich ja, wie es trotz allem noch funktioniert.

FixupReferences gibt es dort einige, und ich verstehe nur Bahnhof...
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz