Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

'Ressource X nicht gefunden' bei eigener Form-Klasse

  Alt 18. Jun 2007, 15:59
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 . 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 (), 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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat