Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EResNotFound bei von TForm abgeleiteter Komponente? (https://www.delphipraxis.net/202260-eresnotfound-bei-von-tform-abgeleiteter-komponente.html)

DualCoreCpu 14. Okt 2019 19:40

EResNotFound bei von TForm abgeleiteter Komponente?
 
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.

.

hoika 15. Okt 2019 04:58

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Hallo,
ich wūrde ein Interface benutzen.

freimatz 15. Okt 2019 07:01

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Gibt es eine *.dfm? Steht in der *.pas noch ein "{*.res} drin?
Dann vielleicht beides mal weg.

DualCoreCpu 15. Okt 2019 10:58

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Zitat:

Zitat von freimatz (Beitrag 1449638)
Gibt es eine *.dfm? Steht in der *.pas noch ein "{*.res} drin?
Dann vielleicht beides mal weg.

Nein, es gibt keine .dfm Datei und auch keine *.res Datei hierzu.

Ich habe eine neue leere Unit erzeugt und dort den Code für den Basisdialog reingeschrieben. Alles Laufzeitcode, Designer wurde dazu nicht verwendet.

freimatz 15. Okt 2019 12:08

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Hm, ich denke das kann so nicht gehen. Ich verstehe auch nicht was der Sinn sein soll.
Entweder ist
a) TMeinNeuerDialog ein Formular, dann benötigt er halt Ressourcen wenn Du ihn erzeugst.
oder
b) es ist eine Basis, dann erzeugst Du nicht die Basis, sondern ein abgeleitetes Formular. Dann sind die Ressourcen in der Ableitung
oder
c) ich habe Dich falsch verstanden ;-)

Uwe Raabe 15. Okt 2019 12:19

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Zitat:

Zitat von DualCoreCpu (Beitrag 1449614)
Wie kann ich die Basisklasse für meinen späteren speziellen Dialog erstellen.

Ich denke, hier liegt der Denkfehler. Was ist denn der Grund, warum du eine Instanz der Basisklasse erstellen willst?

peterbelow 15. Okt 2019 12:33

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Zitat:

Zitat von DualCoreCpu (Beitrag 1449614)
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.

DualCoreCpu 15. Okt 2019 21:51

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Danke, wie verrückt, @peterbelow! So funktioniert mein Vorhaben. :thumb:

@Uwe Raabe, @freimatz:

Ich will halt eine Basisklasse haben, von der ich alle Dialoge in Zukunft ableite. DIese Basisklasse soll alle in jedem Dialog nötigen Methoden bereits enthalten. Nur
speziellere Funktionalität und halt die grafische Ausgabe kommt dann in die Nachfolgedialoge passend für meine konkrete Aufgabe.

Controls haben schließlich auch ihre Basisklasse TCustomControl -> TWinControl -> TMySpecialControl (TEdit, TButton, etc.)

Uwe Raabe 15. Okt 2019 22:32

AW: EResNotFound bei von TForm abgeleiteter Komponente?
 
Zitat:

Zitat von DualCoreCpu (Beitrag 1449724)
Ich will halt eine Basisklasse haben, von der ich alle Dialoge in Zukunft ableite. DIese Basisklasse soll alle in jedem Dialog nötigen Methoden bereits enthalten. Nur
speziellere Funktionalität und halt die grafische Ausgabe kommt dann in die Nachfolgedialoge passend für meine konkrete Aufgabe.

Controls haben schließlich auch ihre Basisklasse TCustomControl -> TWinControl -> TMySpecialControl (TEdit, TButton, etc.)

Dagegen spricht ja auch gar nichts. Die Frage ware:
Zitat:

Was ist denn der Grund, warum du eine Instanz der Basisklasse erstellen willst?
Auf dein Analogon zu TCustomControl übertragen würde das zu: Was ist denn der Grund, warum du eine Instanz von TCustomControl/TWinControl erstellen willst?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 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