Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponente vor der Erzeugung der 1. Form aktivieren? (https://www.delphipraxis.net/3167-komponente-vor-der-erzeugung-der-1-form-aktivieren.html)

APP 26. Feb 2003 16:48


Komponente vor der Erzeugung der 1. Form aktivieren?
 
Hallo,

Endlich habe ich den Prototypen meiner Exception-Handler-Komponente fertig, schon habe ich wieder ein (für mich) unlösbares Problem:

Ich 'klebe' meine Komponente auf das Hauptformular, in meiner Kompo steht:
Delphi-Quellcode:
PROCEDURE TFlappError.Loaded;
BEGIN
   IF Active THEN Application.OnException := onFlappException; // globalen Exception-Handler aktivieren
END;
und alles funktioniert soweit.

Nun habe ich aber eine Applikation, wo im onCreate-Ereignis Ini-Dateien, Oracle-Db Anmeldungen u.ä. verarbeitet werden. Tritt nun dort ein Fehler auf, (sozusagen bevor die Form fertig erstellt wurde) ist auch meine Exception-Kompo machtlos, da sie ja auch noch nicht erstellt wurde.

Meine Frage ist nun, kann ich eine Komponente vor dem Erzeugen der allerersten Form aktivieren, oder ist meine ganze Arbeit umsonst bzw. mein Ansatz falsch?

Ich habe auch beim Jedi Projekt nachgeschaut, dort gibt es eine Unit Namens "ExceptDlg.pas" die in den Projektquelltext eingebunden wird.
Mir ist das mit meiner Kompo nicht gelungen, außerdem wollte ich ja eine Kompo und keine Unit.

Vielleicht weiß jemand Rat?
:cry:
Armin

MadMason 27. Feb 2003 13:19

poste ma den source mit dem du sie im projektquelltext eingebunden hast und wo der fehler auftritt.

APP 28. Feb 2003 15:09

@MadMason,
danke für Dein Angebot, aber die ganze Kompo posten würde den Rahmen dieses Forums wohl sprengen.

Die Kernfrage meines ersten Postings war eigentlich ob es möglich sei, eine Komponente vor dem 1. Formular zu erzeugen/aktivieren.

Ich habe mich nun intensiver mit der Jedi-Library beschäftigt und werde wohl die Unit "ExceptDlg.pas" benutzen und ggf. erweitern und die Arbeit an meiner Kompo als "Lehrstück" betrachten.

Armin

sakura 28. Feb 2003 15:12

Du kannst Komponenten auch ausserhalb Deines Forms erstellen, allerdings, können die dann nicht im Form sein. Dass heisst, eigentlich würde es auch eine "stinknormalle" Klasse tun, da die Komponente manuell im Code erstellt und zerstört werden muss. (Zwischen Application.Initialize; und Application.CreateForm(...);)

...:cat:...

Christian Seehase 28. Feb 2003 18:22

Moin Armin,

wenn die Kompo Bestandteil des Formulares ist, dann ist sie im FormCreate bereits vorhanden (sonst könnte man dort ja auch keine Eigenschaften der Komponenten einstellen).

Du könntest auch mal versuchen die Kompo (wenn sie ausserhalb des Formulares ist) in der Projektdatei zu erzeugen, oder im initialization Abschnitt der Formular Unit (Freigabe nicht vergessen ;-) )

APP 1. Mär 2003 09:36

Hallo Christian,
genau das ist mein Probblem, irgendwie habe ich im Moment keine Idee wie der Code aussehen muß :oops: :

Delphi-Quellcode:
PROGRAM Compo_test;

uses
  Forms,
  FlappError,                      // Meine Komponente
  uMain in 'uMain.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Flapp_Utils in 'Flapp_Utils.pas';
{$R *.res}

BEGIN
  Application.Initialize;
 
  ???? :-)

  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
END.
Armin

Christian Seehase 1. Mär 2003 13:16

Moin Armin,

hier mal zwei Möglichkeiten:
Beide setzen allerdings voraus, dass sich die Kompo nicht auf einem der Formulare befindet.

Delphi-Quellcode:
// Variante 1

PROGRAM Compo_test;

uses
  Forms,
  FlappError,                      // Meine Komponente
  uMain in 'uMain.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Flapp_Utils in 'Flapp_Utils.pas';
{$R *.res} 

var
  leWork : TFlappError;

BEGIN
  Application.Initialize;
 
  leWork := TFlappError.Create;
  try
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    Application.Run;
  finally
    FreeAndNil(leWork);
  end;
END.


// Variante 2

Unit Unit1;

interface

//...


var
  leWork : TFlappError;

//...

implementation

//...

initialization
begin
  leWork := TFlappError.Create;
end;

finalization
begin
  FreeAndNil(leWork);
end;

APP 2. Mär 2003 17:42

Chris,
es funktioniert (wie üblich nach Deiner Lösung),
vielen Dank!
:bounce2:

Armin

p.s. Das Naheliegende kann oft sehr weit weg sein...


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