AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein ClassGroup TPersistent in abgeleitetem TDataModule
Thema durchsuchen
Ansicht
Themen-Optionen

ClassGroup TPersistent in abgeleitetem TDataModule

Ein Thema von Incocnito · begonnen am 10. Nov 2020 · letzter Beitrag vom 10. Nov 2020
Antwort Antwort
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
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: ClassGroup TPersistent in abgeleitetem TDataModule

  Alt 10. Nov 2020, 10:14
9) Ändere die Vererbung der Klasse Default2 von "TdmDefault2 = class(TDataModule)"
auf "TdmDefault2 = class(TdmDefault1)"
In so einem Fall musst du zusätzlich noch in der DFM das object in ein inherited ändern. Das gilt für alle Design-Klassen, die von TForm, TFrame oder TDataModule abgeleitet sind. Leider gibt es in der IDE noch keinen bequemen Mechanismus, der eine Veränderung der Ableitungshierarchie solcher Design-Klassen unterstützt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Incocnito

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

AW: ClassGroup TPersistent in abgeleitetem TDataModule

  Alt 10. Nov 2020, 10:40
Danke Uwe!
Das war die Lösung!

Aber ...
a) Wo erfährt man sowas?
b) Default1 ist doch von TDataModule geerbt, das ist zwar Delphi-Source,
aber das darf doch keinen Unterscheid machen!
Wo ist denn bitte der Unterschied, ob ich jetzt von TDataModule erbe,
oder von meiner eigenen Unit, welche wiederum von TDataModule erbt!?

Ich bin erleichtert eine Lösung zu haben, aber im gleichen Maße verwirrt.

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: ClassGroup TPersistent in abgeleitetem TDataModule

  Alt 10. Nov 2020, 12:23
Der offizielle Weg, eine Ableitung von einem abgeleiteten TDataModule zu erstellen, geht über Datei - Neu - Weitere - Delphi-Projekte - Vererbbare Elemente. Dort sollten alle Forms, Frames und Datamodules des aktuellen Projekts aufgelistet sein. Leider gibt es keinen offiziellen Weg, eine von TDataModule abgeleitete Klasse auf einen anderen Class-Parent umzubiegen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 13:37 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