Einzelnen Beitrag anzeigen

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 6. Jul 2011, 08:19
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.
Widerlegung:
Delphi-Quellcode:
procedure TMyCustomForm.MyDBEditClick(Sender: TObject);
begin
  if MyDBEdit.DataSource = nil then
    Exit;
  Showmessage(MyDBEdit.DataSource.Owner.ClassName); // Rückgabe: "TMyDM"
end;
Die IDE nimmt einfach nur den Klassennamen des DataModules und streicht das T weg.
Das habe ich mir auch so zusammengereimt. Das, was dann dabei rauskommt + Name der DS kann man im OI in die Eigenschaft DataSource eintragen. Dann hat man mein Verhalten.
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 ?
Die Bezeichner, die ich hier verwende sind beispielhaft gewählt (wer hätte das vermutet?). Das Originalprojekt besteht aus hunderttausenden Quelltextzeilen. Es gibt ein Grundprogramm, in das verschiedene Projekte integriert werden. In jedem Projekt gibt es ein DM und ein ProjektForm. Es ist immer nur ein Projekt instanziert, lassen wir auch die Projekt-DMs nicht automatisch bei Programmstart erzeugen. In das ProjektForm werden mehrere Frames geladen, die mehrere Seiten ergeben (das wäre dann der Inhalt des Projekts). Ein Projekt besteht aus 10.000-15.000 Quelltextzeilen. Beim Anlegen neuer Projekte wird ein altes Projekt kopiert und entsprechend der Anforderungen des neuen Projekts abgeändert. Bitte diskutiert jetzt nicht über das Design der Anwendung, das steht seit vielen Jahren fest und kann nicht problemlos geändert werden. Diskussionen darüber sind daher zwecklos.

Früher haben wir mit den globalen Variablen gearbeitet, die Delphi uns vorgegeben hat. Das hatte zur Folge, dass das DM in jedem Projekt unter anderem Namen erreichbar war. D.h. bei jeder Übernahme von Quelltextpassagen aus anderen Projekten musste jede Referenz auf das DM per Suchen und Ersetzen ausgetauscht werden. In einem ersten Schritt haben wir also die Variable einheitlich genannt (ProjektDM). Wir haben uns nix weiter dabei gedacht und es funktioniert prima.

Nun habe ich eine projektübergreifende Superklasse für das DM und das ProjektForm entworfen. Das entspricht nun genau meinem komplexeren Beispiel, über das hier nun diskutiert wird.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat