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
RSE

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

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

  Alt 5. Jul 2011, 13: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 13:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

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

  Alt 5. Jul 2011, 13: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
 
#3

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

  Alt 5. Jul 2011, 13: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
 
#4

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

  Alt 5. Jul 2011, 14: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
 
#5

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

  Alt 5. Jul 2011, 14: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
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

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

  Alt 5. Jul 2011, 19:57
Das ganze könnte man als Bug bezeichnen, denn wenn du dir zur Laufzeit mal anschaust, ob MyDBEdit.DataSource assigned ist, wirst du feststellen, dass dies nicht der Fall ist. Die IDE nimmt einfach nur den Klassennamen des DataModules und streicht das T weg.

Wenn du mal händisch den Namen der globalen DataModule variable änderst, wirst du feststellen, dass dies dann auch passiert.
Korrektur: Das lag bei mir nur daran, dass ich dann keine Instanz des DataModules hatte - siehe meinen Post weiter unten.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 6. Jul 2011 um 10:18 Uhr)
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

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

  Alt 6. Jul 2011, 02:28
hm, da ich nicht soo viel visuell arbeite, ist mir das eigentlich gleich
Was hat visuell mit Sichtbarkeiten von Variablen + Co. zu tun ? Obwohl, vom Wort her könte man das eventuell schon vermuten.

Zur Frage an sich : das geht schon sehr, sehr tief in die Eingeweide von Delphi rein. Solche Fragen werden sich hier kaum lösen lassen. Zumindest, wenn man mal folgendes bedenkt : die einzige mir bekannte Quelle, wo das Verhalten, IDE/Laufzeit in punkto DB-Komponenten näher erläutert wird, das sind Marco Cantus Bücher. Und sogar der braucht ca. 10-50 Buchseiten, je nachdem wo man anfängt.

Das Datenmodul wird "von Hand" im Konstruktor von MyForm erzeugt. Deswegen wundere ich mich ja, wie es trotz allem noch funktioniert.
Warum wird das denn überhaupt von Hand erzeugt ? Welchen Sinn macht das denn ? Ich erzeuge etliches zur Laufzeit, aber auf die Idee, ein Datamodul so zu erzeugen bin ich noch nicht gekommen, das macht einfach nur Ärger. Siehe diesen Thread hier.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz