Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Feststellen ob Komponente zur Laufzeit erstellt wurde (https://www.delphipraxis.net/3290-feststellen-ob-komponente-zur-laufzeit-erstellt-wurde.html)

APP 5. Mär 2003 09:28


Feststellen ob Komponente zur Laufzeit erstellt wurde
 
Hallo,

ich möchte im Create Ereignis meiner (visuellen) Komponente feststellen,
ob diese erst zur Laufzeit oder schon beim Design erstellt wurde.

(Ich versuchte es schon mal mit GetChildParent u.ä. aber irgendwie funkte das nicht so recht...)

Hat jemand eine Idee?


Armin

APP 5. Mär 2003 10:07

Lösung gefunden!
 
Habe die Lösung gefunden!

Delphi-Quellcode:
CONSTRUCTOR TFlappError.Create(Owner: TComponent);
BEGIN
  INHERITED Create(Owner);                      
  ...
  IF ComponentState = [csInline] THEN
    BEGIN

    END
  ELSE
    BEGIN
      IF FIniFileName = '' THEN FIniFileName := ChangeFileExt(Application.ExeName, '.INI');
      SetFlappErrorProp(Self);                
    END;
END;
p.s. Wie sagte schon ein Freund zu mir: "Wer das Help-File lesen kann, hat mehr vom Leben!"
:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

janjan 5. Mär 2003 10:20

Du kannst ja deine Signatur ergänzen:

Code:
BEGIN
  real programmers are using C/C++ - smart developers Delphi;
  the smartest of them are reading the fu***** manual;
END;
;)

[edit=Daniel B]Habe mal ein Wort Zensiert. Man könnte auch "Read the fine manual" sagen. ;) MfG Daniel B.[/edit]

APP 5. Mär 2003 12:09

Tja, das mit der Signatur ist gut,
aber leider langt es bei mir scheinbar mit dem Lesen nicht, da meine Kompo nicht Funktioniert!

Delphi-Quellcode:
  IF ComponentState = [csInline] THEN       // Komponente ist zur Designtime erstellt worden
    BEGIN
      IF FIniFileName <> '' THEN SetFlappErrorProp(Self); // Wenn Inidatei vorhanden ist, dann lesen
    END
  ELSE                                           // Komponente ist zur Runtime erstellt worden
    BEGIN
      Application.OnException := onFlappException;
//      FActive := TRUE;
      IF FIniFileName = '' THEN FIniFileName := ChangeFileExt(Application.ExeName, '.INI');
      SetFlappErrorProp(Self);                   // InI Lesen
    END;
ComponentState bleibt leer, ich habe keinen blassen Schimmer was ich machen muß damit ComponentState korrekt funktioniert?!

Hilfe! :bounce1:

janjan 5. Mär 2003 12:43

Ich glaube es müsste heißen:

Delphi-Quellcode:
if csInline in ComponentState then       // Komponente ist zur Designtime erstellt worden
  begin
    if FIniFileName <> '' then SetFlappErrorProp(Self); // Wenn Inidatei vorhanden ist, dann lesen
  end
else                                           // Komponente ist zur Runtime erstellt worden
  begin
    Application.OnException := onFlappException;
//      FActive := true;
    if FIniFileName = '' then FIniFileName := ChangeFileExt(Application.ExeName, '.INI');
      SetFlappErrorProp(Self);                   // InI Lesen
  end;
ComponentState ist eine Menge, kuck dir die handhabung in der Hilfe mal genauer an.

APP 5. Mär 2003 13:01

@JanJan :oops: da hast Du natürlich Recht :oops:

ABER: wenn ich meinen Source durch-debugge, sehe ich, dass ComponentState leer ist!

Ich denke, ich muß ComponentState in meiner Komponenten-Deklaration irgendwie (als Property?) mit einbinden (Ist meine 1. Kompo, daher bin ich unsicher).

Ich 'bestehe' auch nicht auf ComponentState, es kann auch eine andere Lösung sein um festzustellen ob die Kompo zur Laufzeit erstellt wurde oder nicht.

janjan 5. Mär 2003 13:20

Es kann sein das csInline nicht das ist, wofür du es benutzen willst.

Aus der Hilfe:
Zitat:

csInline
Wird gesetzt, wenn die Komponente eine Komponente der obersten Ebene darstellt, die zur Laufzeit geändert und in ein Formular eingebettet werden kann. Dieses Flag wird zur Identifizierung von verschachtelten Frames während des Ladens und Speicherns verwendet.
Der letzte Satz läßt darauf schließen das das was sehr spezielles ist. Auch Google hilft da nicht viel weiter...


Das ComponentState bei dir leer ist kann gut sein, kuck dir mal die Flags genauer an. Normalerweise sollte da keiner gesetzt sein...

sakura 5. Mär 2003 14:55

Hier der Code
Delphi-Quellcode:
...
if csDesigning in ComponentState then
begin
  // Design-Time Aktion!
end else begin
  // Run-Time Aktion!
end;
// All-Time Aktionen :)
...:cat:...

janjan 5. Mär 2003 16:57

@APP
Hm, ich glaub ich hab dich falsch verstanden, :oops: ich dachte du wolltest wissen wie man feststellen kann ob eine Komponente per Drag and Drop oder dynamisch per TKomponente.Create erzeugt wurde...

Wenn du nur wissen wolltest ob sich die Komponente im Design-Modus befindet oder nicht, dann musst du es natürlich so machen wie Sakura es vorgeschlagen hat.

APP 5. Mär 2003 19:49

@janjan
Zitat:

Hm, ich glaub ich hab dich falsch verstanden, ich dachte du wolltest wissen wie man feststellen kann ob eine Komponente per Drag and Drop oder dynamisch per TKomponente.Create erzeugt wurde...
Du hast es erfasst, genau das ist mein Problem!

Ich möchte im Constructor Create feststellen wann/wie die Kompo erstellt wurde, da ich, wenn die Kompo zur RunTime erstellt wurde,
den ExceptionHandler automatisch zuweisen möchte (und bei Bedarf Daten aus einer Ini-Datei laden). Ist die Kompo schon zur Designzeit aktiv, wird (zumindest habe ich das mit dem Debugger festgestellt) Loaded durchlaufen, hier kann ich die Kompo über die Eigenschaft Active ein/ausschalten (hier benötige ich die Daten aus der INI-Datei NICHT).

Delphi-Quellcode:
CONSTRUCTOR TFlappError.Create(Owner: TComponent);
BEGIN
   INHERITED Create(Owner);
   ...
   IF csDesigning IN ComponentState THEN         // Komponente ist zur Designtime (=DragDrop) erstellt worden
      BEGIN
         ...
      END
   ELSE                                          // Komponente ist zur Runtime (=dynamisch) erstellt worden
      BEGIN
         Application.OnException := onFlappException;
         ...
      END;
END;
Delphi-Quellcode:
PROCEDURE TFlappError.Loaded;
BEGIN
   INHERITED Loaded;
   IF Active THEN Application.OnException := onFlappException;
END;
Leider funktioniert ComponentState nicht. :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
Seite 1 von 2  1 2      

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