AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi [gelöst] TForm ableiten -> EResNotFound Exception
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] TForm ableiten -> EResNotFound Exception

Ein Thema von silver-moon-2000 · begonnen am 22. Apr 2012 · letzter Beitrag vom 22. Apr 2012
Antwort Antwort
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

[gelöst] TForm ableiten -> EResNotFound Exception

  Alt 22. Apr 2012, 12:02
Hallo zusammen,

sorry, dass ich Euch wegen so einem einfachen Problem stören muss, aber ich weiß nicht weiter.
Das kann damit zusammenhängen, dass ich seit gestern 20:00 Uhr ununterbrochen vor dem Bildschirm sitze (wenn einen der Programmiereifer packt ), aber (oder vielleicht gerade deswegen ) ich sehe zurzeit den Wald vor lauter Bäumen nicht mehr.

Problem:
Zwei Forms, die eine von TForm abgeleitet, die andere von der bereits abgeleiteten nochmals abgeleitet.

Die TBaseForm soll bereits alle Elemente enhalten, die davon abgeleitete Forms ebenfalls benötigen (in diesem Fall den Button btStart).

In den von TBaseForm abgeleiteten Klassen kommen neue Komponenten hinzu (in diesem Fall ein Button btEnd)

Delphi-Quellcode:
unit uProgramHandlerForms;

type TBaseForm = class(TForm)
  private
    btStart : TButton;
  public
    constructor Create; virtual;
end;

type TComplexForm =class(TBaseForm)
  private
    btEnd : TButton;
  public
    constructor Create; override;
end;

implementation


constructor TBaseForm.Create;
begin
  inherited Create(nil); //<-- hier bleibe ich immer mit der Exception (siehe unten) hängen
  btStart := TButton.Create(self);
  btStart.Parent := self;
  btStart.Top := 20;
  btStart.Left := 20;
  btStart.Visible := True;

  Height := 300;
  Width := 300;
  Caption := 'BaseForm';
  Visible := True;
end;


constructor TComplexForm.Create;
begin
  inherited Create;
  btEnd := TButton.Create(self);
  btEnd.Parent := self;
  btEnd.Top := 100;
  btEnd.Left := 20;
  btEnd.Visible := True;

  Caption := 'ComplexForm';
end;
MainUnit:

Delphi-Quellcode:
type
  TFrmMain = class(TForm)
    BtTest: TButton;
    procedure BtTestClick(Sender: TObject);
  private
    cf : TBaseForm;
  public
    { Public declarations }
  end;

[...]

procedure TFrmMain.BtTestClick(Sender: TObject);
begin
  cf := TComplexForm.Create;
end;
Wenn ich nun auf meiner Hauptform den Button btTest drücke, kommt die wunderhübsche Fehlermeldung
Zitat:
Project ProgramHandlerTest.exe raised exception class EResNotFound with message 'Resource TComplexForm not found'
Ich hoffe, dass jemand hier mal den Funken überspringen lassen könnte, der dann die Bäume abfackelt, sodass ich den Wald wieder sehen kann.
Tobias
Bitte nicht hauen , ich weiß es nicht besser

Geändert von silver-moon-2000 (22. Apr 2012 um 13:04 Uhr) Grund: Titel geändert -> [gelöst]
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: TForm ableiten -> EResNotFound Exception

  Alt 22. Apr 2012, 12:06
Hast Du denn auch eine *.dfm zu Deinem Formular? Ansonsten könntest Du auch mit der Objektablage versuchen.

[edit] Da fällt mir ein: evtl. hilft Dir Delphi-Referenz durchsuchenTCustomForm.CreateNew weiter (selbst noch nie benutzt, liest sich aber, aber sei das die Lösung). [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (22. Apr 2012 um 12:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: TForm ableiten -> EResNotFound Exception

  Alt 22. Apr 2012, 12:44
Delphi-Quellcode:
type TBaseForm = class(TForm)
  private
    btStart : TButton;
  public
    constructor Create; virtual;
end;
Dein Konstruktor ist schon mal falsch.
Ab der Klasse TComponent gibt es einen virtuellen Konstruktor.
Wenn man möchte, dass die VCL in Bezug auf Persistenz (als Laden von DFM Resourcen) richtig funktioniert muss man sich an das halten, was die VCL vorgibt.
Delphi-Quellcode:
type TBaseForm = class(TForm)
  private
    btStart : TButton;
  public
    constructor Create(AOwner:TComponent); override;
end;

constructor TBaseForm.Create(AOwner:TComponent);
begin
  inherited Create(AOwner); // darf auf keinen Fall fehlen!
  // ab hier eigener Code
end;
Alle Klassen, die von TComponent abgeleitet sind haben sozusagen die Freiheit aufgegeben, eigene Konstruktoren zu deklarieren zu dürfen.
Nur noch folgender Konstruktor ist zulässig:
constructor Create(AOwner:TComponent); override; Im Gegenzug werden alle published Properties auf den DFM-Resourcen gelesen.
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#4

AW: TForm ableiten -> EResNotFound Exception

  Alt 22. Apr 2012, 13:03
Hast Du denn auch eine *.dfm zu Deinem Formular? Ansonsten könntest Du auch mit der Objektablage versuchen.
Ab der Klasse TComponent gibt es einen virtuellen Konstruktor.
Wenn man möchte, dass die VCL in Bezug auf Persistenz (als Laden von DFM Resourcen) richtig funktioniert muss man sich an das halten, was die VCL vorgibt.
[...]
Alle Klassen, die von TComponent abgeleitet sind haben sozusagen die Freiheit aufgegeben, eigene Konstruktoren zu deklarieren zu dürfen.
[...]
Im Gegenzug werden alle published Properties auf den DFM-Resourcen gelesen.
Nein, eine *.dfm habe ich natürlich nicht. Die wird ja nicht erstellt, wenn ich eine Form nur per Code erstelle/ableite.
Wie konnte ich denn ahnen, dass TForm hier einen "Sonderweg" geht

Aber dank Euch habe ich jetzt meinen Gedankenknoten durchbrechen können:
Die TBaseForm wird nun einfach einmalig visuell, d.h. in der IDE (über File->New->Form) erzeugt (dabei also wird auch die DFM erstellt) und gespeichert. Und diese Form kann dann ja problemlos abgeleitet und erweitert werden, auch ohne Objektablage -> Problem gelöst

Die Objektablage wollte ich eigentlich nicht verwenden, da ich das Formular nur für dieses eine Projekt brauche und ich eigentlich keine Lust habe, dass diese Form dann auf alle Ewigkeit ungenutzt in der Ablage herumgammelt.

Hätte mich ungefähr 10 Sekunden gekostet, mal zu googeln, aber daran habe ich natürlich nicht gedacht
Ach was, ein Blick in die Hilfe hätte ausgereicht, dass es so nicht geht, wie ich es mir gedacht hatte.
Zitat von OH: TCustomForm.Create:
For descendants of TCustomForm that are not TForm objects, use CreateNew instead. Calling Create for a TCustomForm descendant that is not a TForm will raise an exception

Hätte mir viel vergebliches Nachdenken und eine dumme (schon vielfach beantwortete) Frage erspart.
Aber nach 3 Litern T400 habe ich nicht mehr so weit gedacht.

So, ich geh' jetzt erst mal schlafen. Danke nochmals.
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: [gelöst] TForm ableiten -> EResNotFound Exception

  Alt 22. Apr 2012, 13:05
Siehe mein Edit
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 15:59 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