![]() |
'Ressource X nicht gefunden' bei eigener Form-Klasse
Moinmoin zum 2. heut!
Ich habe mir eine eigene Formularklasse von TCustomForm abgeleitet, die ich statt der automatisch erzeugten (bei Datei->Neu->Formular) nachher im Code setze. Funktioniert wunderbar. Diese neue Klasse wuselt OnCreate nun ein wenig in Datenbanken herum, und daher möchte ich gerne ein kleines Fenster anzeigen, dass Auskunft darüber gibt. Folgende Variante klappte:
Delphi-Quellcode:
Da allerdings unterschiedliche Aktionen vorkommen, wollte ich eine weitere Formularklasse machen, der ich eine Caption und eine Message übergebe, so dass das Setzen der Größe, Schrift, Position usw. nur ein mal Passieren.
procedure TKATGraphForm.BuildKATComponentArray; // wird bei TKATGraphForm.OnCreate aufgerufen
var i : Integer; obj: TKATGraphObject; f : TForm; begin f := TForm.Create(nil); Width := 300; Height := 80; Font.Name := 'Arial'; Font.Size := 12; Font.Color := clBlack; Position := poScreenCenter; BorderStyle := bsToolWindow; FormStyle := fsStayOnTop; BorderIcons := []; Caption := 'blabla'; OnPaint := PaintArrayBuild; f.Show; f.Refresh; // Datenbankkrams... f.Hide; f.Free; end; procedure TKATGraphForm.PaintArrayBuild(Sender: TObject); var x, y: Integer; f: Form; const s = 'Konfiguration wird geladen.'; begin f := TForm(Sender); x := (f.ClientWidth - f.Canvas.TextWidth(s)) div 2; y := (f.ClientHeight - f.Canvas.TextHeight(s)) div 2; f.Canvas.TextOut(x, y, s); end; Im "inherited Create" dieser neuen Klasse jedoch bekomm ich im Titel genannte Exception, wobei X dann der Name der neuen Formularklasse ist. Leider wird die Exception ausgelöst, aufgrund eines Funktionsaufrufs der False ergibt, der Code aber nie in diese Funktion springt :shock:. Haltepunkte innerhalb dieser Funktion werden sogar deaktiviert. Der Code mit der neuen Fensterklasse:
Delphi-Quellcode:
Und so wirds bislang aufgerufen:
// Die neue Fensterklasse
TLoadStatusForm = class(TCustomForm) private FMsg: String; protected procedure Paint; override; public constructor Create(ACaption: String; Msg: String); reintroduce; end; implementation { TLoadStatusForm } constructor TLoadStatusForm.Create(ACaption: String; Msg: String); begin inherited Create(nil); Width := 300; Height := 80; Font.Name := 'Arial'; Font.Size := 12; Font.Color := clBlack; Position := poScreenCenter; BorderStyle := bsToolWindow; FormStyle := fsStayOnTop; BorderIcons := []; Caption := ACaption; FMsg := Msg; end; procedure TLoadStatusForm.Paint; var x, y: Integer; begin inherited; x := (ClientWidth - Canvas.TextWidth(FMsg)) div 2; y := (ClientHeight - Canvas.TextHeight(FMsg)) div 2; Canvas.TextOut(x, y, FMsg); end;
Delphi-Quellcode:
procedure TKATGraphForm.BuildKATComponentArray;
var f: TLoadStatusForm; begin f := TLoadStatusForm.Create('bla', 'blubb'); // Hier gibts die Exception, bzw. beim inherited Create in TLoadStatusForm.Create f.Show; f.Refresh; // Datendankkrams... f.Hide; f.Free; end; Da mein Durchsteppen ja wie gesagt leider in einer Funktion endete, die nie durchlaufen wird*, und trotzdem ein Ergebnis liefert (:stupid:), bin ich recht ratlos, und für jede Hilfe im Höchstmaß empfänglich, und sogar dankbar :) (Vor allem: Warum klappt das mit der einen eigenen Formularklasse, mit der anderen in dieser aber nicht mehr?) *besagt Funktion ist "Classes.InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;" Gruss, Fabian PS: Ich weiss, dass jegliche Ressourcenschutzblöcke fehlen. Erstmal bin ich froh wenn es überhaupt tut ;) |
Re: 'Ressource X nicht gefunden' bei eigener Form-Klasse
Hallo,
ein Nachfahre von TCustomForm möchte immer eine *.dfm Datei, um die Form-Eigenschaften zu laden. Fehlt diese Ressource, kommt die Fehlermeldung. Also einfach ein leeres Formular anlegen und dieses verwenden. Übrigens kannst Du die ganzen Einstellungen noch besser verpacken, indem Du eine class function verwendest:
Delphi-Quellcode:
Aufruf:
type
TLoadStatusForm = class(TForm) private FMsg: String; protected procedure Paint; override; public class function ShowStatus(const ACaption, Msg: String): TLoadStatusForm; end; var LoadStatusForm: TLoadStatusForm; implementation {$R *.dfm} { TLoadStatusForm } procedure TLoadStatusForm.Paint; var x, y: Integer; begin inherited; x := (ClientWidth - Canvas.TextWidth(FMsg)) div 2; y := (ClientHeight - Canvas.TextHeight(FMsg)) div 2; Canvas.TextOut(x, y, FMsg); end; class function TLoadStatusForm.ShowStatus(const ACaption, Msg: String): TLoadStatusForm; var f: TLoadStatusForm; begin f := TLoadStatusForm.Create(nil); f.Width := 300; f.Height := 80; f.Font.Name := 'Arial'; f.Font.Size := 12; f.Font.Color := clBlack; f.Position := poScreenCenter; f.BorderStyle := bsToolWindow; f.FormStyle := fsStayOnTop; f.BorderIcons := []; f.Caption := ACaption; f.FMsg := Msg; f.Show; f.Refresh; Result := f; end;
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject);
var f: TLoadStatusForm; begin f := TLoadStatusForm.ShowStatus('bla', 'blubb'); // Hier gibts die Exception, bzw. beim inherited Create in TLoadStatusForm.Create // Datendankkrams... f.Hide; f.Free; end; xaromz |
Re: 'Ressource X nicht gefunden' bei eigener Form-Klasse
:wall: Das ist allerdings etwas, worauf man erst kommen muss. Klar, dass es bei dem anderen Formular dann geht, da dafür ja gleichnamige .dfm da sind. Unschönes Verhalten, aber wenn man es weiss, immerhin lösbar :). Danke dir!
Die Sache mit der class Function wäre dann nach Factory Pattern. Bin ich prinzipiell ein Freund von, in diesem Fall werd ich es aber denke ich nicht so machen. Letztlich kommts ja auf das selbe raus. Danke nochmals! |
Re: 'Ressource X nicht gefunden' bei eigener Form-Klasse
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz