Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#7

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 13:33
Hallo,

ich habe einen Dialog von TForm abgeleitet. Nun habe ich einen alten vor mehreren Jahren mal mit dem FormDesigner erstellten Dialog der einst von TForm vererbt war, von diesem neuen Dialog abgeleitet. So hier:

Delphi-Quellcode:
TMeinNeuerDialog = class(TForm)
end;

TMeinALterDialog = class(TForm)
end;
Nun habe ich aber TMeinALterDialog von TMeinNeuerDialog abgeleitet.

So hier

Delphi-Quellcode:
TMeinNeuerDialog = class(TForm)
end;

TMeinALterDialog = class(TMeinNeuerDialog)
end;
TMeinNeuerDialog umfasst nun Methoden, die in jedem Dialog immer wieder vokommen. TMeinAlterDialog soll dagegen nur spezifische Methoden für den konkreten Dialog enthalten. TMeinNeuerDialog soll also eine Basisklasse werden für alle meine zukünftig zu entwickelnden Dialoge.

Nun erhalte ich aber eine EResNotFound-Exception bei TMeinNeuerDialog, da ich den zur Laufzeit erstelle, weil dieser noch keine grafischen Eingabecontrols enthält. Dennoch will Delphi nun eine Ressource haben, die es aber nicht gibt.

Wie kann ich die Basisklasse für meinen späteren speziellen Dialog erstellen. Diese Basisklasse könnte zum Beispiel die Execute Methode enthalten oder auch das Schreiben von Konfigurationsdateien bzw. die Initialisierung einer Stringliste, in die die späteren Optionen dann geschrieben werden.

.
Form, frames und datamodules sind halt nicht nur Code sondern immer eine Kombination von Code-Unit und designer-Daten (dfm-File), die als Resource eingebunden werden. Der Constructor für diese VCL-Klassen enthält daher Kode, um diese Resource zu laden. Es gibt aber noch einen anderen Constructor namens CreateNew, der tut das nicht und ist daher die beste Methode, z. B. ein Form zu erzeugen, das alle Componenten zur Laufzeit erzeugt.

Ansonsten sollte man von diesen Designerklassen abgeleitete Klassen immer von der IDE erzeugen lassen, dafür gibt es "visual form inheritance". In deinem Fall wäre TMeinNeuerDialog ein normal im Designer erstelltes Form, auch wenn es leer sein sollte. Um davon ein neuesw Form abzuleiten wähle aus dem IDE Menu Datei --> Neu --> Weitere. Das ruft den Repository-Dialog auf. Links in der Baumansicht gibt es einen Knoten "vererbbare Elemente". Die zugehörige Seite rechts listet alle zum Projekt gehörigen Designerklassen; wählte dort TMeinNeuerDialog und klick OK. Die IDE erzeugt pas und dfm File für die neue Klasse; ändere Name-Property auf was Sinnvolles und speichere die Unit unter einem Namen deiner Wahl.

Falls Du ein schon existierendes Form auf eine andere Basisklasse "umhängen" willst erfordert das mehrere Schritte:
  1. Öffne das form und ändere seine Name-Property, speichere die Unit unter dem neuen Namen
  2. Ändere die Basisklasse im Kode auf den gewünschten Vorfahren.
  3. Füge dessen Unit zur Uses-Klausel (nach Interface) hinzu.
  4. Wechsle in die Designer-Ansicht (F12)
  5. Wechsle über das Kontextmenu in die Text-Ansicht.
  6. Ändere das erste "object" in "inherited". Das ist der kritisch Unterschied zwischen normalen und abgeleiteten Designerklassen.
  7. Gehe zurück in die Form-Ansicht und speichere deine Änderungen.
Peter Below
  Mit Zitat antworten Zitat