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:
- Öffne das form und ändere seine Name-Property, speichere die Unit unter dem neuen Namen
- Ändere die Basisklasse im Kode auf den gewünschten Vorfahren.
- Füge dessen Unit zur Uses-Klausel (nach Interface) hinzu.
- Wechsle in die Designer-Ansicht (F12)
- Wechsle über das Kontextmenu in die Text-Ansicht.
- Ändere das erste "object" in "inherited". Das ist der kritisch Unterschied zwischen normalen und abgeleiteten Designerklassen.
- Gehe zurück in die Form-Ansicht und speichere deine Änderungen.