AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein EResNotFound bei von TForm abgeleiteter Komponente?

EResNotFound bei von TForm abgeleiteter Komponente?

Ein Thema von DualCoreCpu · begonnen am 14. Okt 2019 · letzter Beitrag vom 15. Okt 2019
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 14. Okt 2019, 20:40
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.

.

Geändert von DualCoreCpu (14. Okt 2019 um 20:42 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.834 Beiträge
 
Delphi XE4 Professional
 
#2

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 05:58
Hallo,
ich wūrde ein Interface benutzen.
Heiko

Geändert von hoika (15. Okt 2019 um 06:37 Uhr)
  Mit Zitat antworten Zitat
freimatz
Online

Registriert seit: 20. Mai 2010
888 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 08:01
Gibt es eine *.dfm? Steht in der *.pas noch ein "{*.res} drin?
Dann vielleicht beides mal weg.
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#4

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 11:58
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.
  Mit Zitat antworten Zitat
freimatz
Online

Registriert seit: 20. Mai 2010
888 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 13:08
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.991 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 13:19
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
372 Beiträge
 
Delphi 10.3 Rio
 
#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
DualCoreCpu
(Gast)

n/a Beiträge
 
#8

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 22:51
Danke, wie verrückt, @peterbelow! So funktioniert mein Vorhaben.

@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.)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.991 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: EResNotFound bei von TForm abgeleiteter Komponente?

  Alt 15. Okt 2019, 23:32
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Alt 16. Okt 2019, 03:59     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf