Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 'Ressource X nicht gefunden' bei eigener Form-Klasse (https://www.delphipraxis.net/94238-ressource-x-nicht-gefunden-bei-eigener-form-klasse.html)

dizzy 18. Jun 2007 15:59


'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:
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;
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.
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:
  // 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;
Und so wirds bislang aufgerufen:
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 ;)

xaromz 18. Jun 2007 16:24

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:
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;
Aufruf:
Delphi-Quellcode:
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;
Gruß
xaromz

dizzy 18. Jun 2007 16:31

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!

shmia 18. Jun 2007 16:40

Re: 'Ressource X nicht gefunden' bei eigener Form-Klasse
 
Zitat:

Zitat von xaromz
ein Nachfahre von TCustomForm möchte immer eine *.dfm Datei, um die Form-Eigenschaften zu laden. Fehlt diese Ressource, kommt die Fehlermeldung.

Oder man verwendet der Konstruktor CreateNew.


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