Einzelnen Beitrag anzeigen

Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#1

ClassGroup TPersistent in abgeleitetem TDataModule

  Alt 10. Nov 2020, 09:36
Hi Zusammen,

ich habe ein etwas größeres Projekt, wo ich ein bes**** Verhalten der Delphi IDE habe.
Ich versuche daher das Problem auf das Minimum zu beschränken damit ihr es nachvollziehen könnt.
(Die Namen sind natürlich egal und dienen nur zur besseren Orientierung.)

1) Neues Projekt erstellen (Hauptunit-Name = "Main")
2) Neue Unit vom Typ TDataModule hinzufügen (Name "Default1")
Typ auf "System.Classes.TPersistent" wechseln, weil es soll unter FMX und VCL laufen
3) Neue Unit vom Typ TDataModule hinzufügen (Name "Default2")
Typ auf "System.Classes.TPersistent" wechseln, weil es soll unter FMX und VCL laufen
4) In Default2 eine Private-Variable "InfoListe : TStringList" hinzufügen
5) Default2 um Create und Destroy erweitern um Objekt zu erstellen und zu verwerfen
6) Im Create von Default2 auch gleich irgendwas in die InfoListe eintragen.
5) Zweites TDataModule Default2 eine Funktion hinzufügen ("GetInfo() : String")
6) In "Main" nun ein Button hinzufügen "Mach was", dort Objekt vom Typ "Default2" erstellen,
Ein einfaches "ShowMessage(dmDefault2.GetInfo());" hinzufügen (und Objekt natürlich freigeben).

Jetzt kann man das Ganze starten und es läuft wunderbar.

7) Verschiebe InfoListe in den protected-Bereich von Default1
8) Verschiebe Create und Free in Default1
9) Ändere die Vererbung der Klasse Default2 von "TdmDefault2 = class(TDataModule)"
auf "TdmDefault2 = class(TdmDefault1)"

Ab hier fängt der Spaß an. Teils kann ich dann noch einmal erzeugen und es läuft noch,
aber spätestestens wenn es einmal lief und ich irgendwas im Quelltext von Default2
ändere wird die DFM von Default2 um nicht vorhandene Felder erweitert.

Richtig:
Delphi-Quellcode:
object dmDefault2: TdmDefault2
  Left = 0
  Top = 0
end
Falsch:
Delphi-Quellcode:
object dmDefault2: TdmDefault2
  Left = 0
  Top = 0
  ClientHeight = 201
  ClientWidth = 304
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = True
  PixelsPerInch = 96
  TextHeight = 13
end
Wenn ich dann den Button betätige, fliegt er raus mit der Meldung
"Fehler beim Lesen von dmDefault2.ClientHeight: Eigenschaft ClientHeight existiert nicht.".

Ich habe das Problem unter Delphi 10.3.2 und Delphi 10.4.1, weitere Versionen habe ich jetzt nicht zum Testen.

Das Projekt habe ich mal in den Anhang gepackt.
So kann man es erzeugen und starten.
Ändert man aber irgendetwas in Default2 (beispielsweise einen Kommentar hinzufügen),
so fliegt er mit besagter Fehlermeldung raus.

Die Fragen sind also:
- Wer kann das nachvollziehen und bestätigen? (Oder auch, wer hat das Problem nicht?)
- Wie sieht das in anderen Delphi-Versionen aus? (Gibt es einen Patch dafür?)
- Habe ich an dem Projekt etwas falsch gemacht, was zu diesem Verhalten führt?
- Gibt es eine Möglichkeit das Problem zu umgehen, so dass ich nicht jedes mal die DFM
öffnen muss mit TextPad, um den falschen Teil zu löschen?

Vielen Dank schonmal für die Zeit und Mühe.

Liebe Grüße
Incocnito
Angehängte Dateien
Dateityp: zip DFM_Test2.zip (6,5 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat