AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wird Komponente aus DFM geladen?

Ein Thema von himitsu · begonnen am 3. Feb 2011 · letzter Beitrag vom 3. Feb 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#1

Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 10:11
Morschn ,

ob eine Komponente "gerade" aus der DFM geladen wird, soll man ja "angeblich" über Delphi-Referenz durchsuchenTComponent.ComponentState rausbekommen, siehe csLoading und csReading.

Warum gibt es das aber noch nicht im Constructor?
OK, das kann ich mir schon fast denken, also wie kann man dieses dort dennoch mitbekommen?

Grund: Am Ende des Constructor, bzw. in AfterConstruction wird eine Aktion gestartet, welche aber erst anlaufen soll, wenn das Laden fertig ist, falls es über die DFM geschieht.
Dafür stellt die VCL ja Delphi-Referenz durchsuchenTComponent.Loaded bereit, wo ich das machen könnte, also würde ich das Starten nun dahin verschieben.

> Problem gelöst?

Leider nicht, denn die Aktion soll ja auch anlaufen, wenn die Komponente manuell/dynamisch erzeugt wird.
In diesem Fall wird Loaded aber nicht aufgerufen und ich müßte dennoch im Constructor/AfterConstruction starten ... nur leider bekomm ich da nicht mit, ob die Komponente manuell/dynamisch oder über die VCL erstellt wurde, da ComponentState dort immer leer ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 10:56
Ich habe gerade mal alle denkbaren Methoden überladen und eine Message ausgeben lassen, ich habe nichts sinnvolles gefunden was nach Loaded ausgeführt wird.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 11:50
Nur mal ne Vermutung:
Wenn du eine Form zur laufzeit erstellst, und sie bereits vorher einmal erstellt wurde, bezweifle ich, dass er wieder auf die File zugreift. Schätze eher, dass er die DFM direkt beim programmstart initialisiert oder nur einmal ab dem zeitpunkt wo sie benötigt wird.(bei ersterem wäre auch beim erstmaligen dynamischen erstellen kein 'Loaded' fällig)



Aber nur seeeehr wage gvermutungen, weil ich da keine ahnung habe^^"

MFG
Memnarch

Geändert von Memnarch ( 3. Feb 2011 um 11:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 12:36
If csLoading in Owner.ComponentState then ... ;
Das könnte im Create helfen
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 12:43
@Deep-Sea: Das ist ja mein Problem ... dieses Flag vurde von der VCL einfach vergessen.
siehe "im Programm von VCL aus DFM laden"

Ach ja, Delphi XE ... wo anders hab ich's noch nicht probiert.

Es handelt sich um eine Serverkomponente mit Autostartfunktion und dieses Autostart macht mir grad Sorgen ... also wann ich den Server Starte, wenn Autostart=true, da dieses standardmäßig auf True steht.



Hab mal schnell eine Demo erstellt.
Code:
in Formdesigner einbinden:

TMyTestComponent.Create(459394672) [csDesigning]
TMyTestComponent.AfterConstruction(459394672) [csDesigning]

in Formdesigner laden/anzeigen:

TMyTestComponent.Create(459394192) [csDesigning]
TMyTestComponent.AfterConstruction(459394192) [csDesigning]
TMyTestComponent.SetText(459394192) = "abcdef" [csLoading,csReading,csDesigning]
* TMyTestComponent.Loaded(459394192) [csDesigning]

im Programm von VCL aus DFM laden

Debug-Ausgabe: TMyTestComponent.Create(18795632) []
Debug-Ausgabe: TMyTestComponent.AfterConstruction(18795632) []
Debug-Ausgabe: TMyTestComponent.SetText(18795632) = "abcdef" [csLoading,csReading]
* Debug-Ausgabe: TMyTestComponent.Loaded(18795632) []

dynamisch erzeugen (Button1)

Debug-Ausgabe: TMyTestComponent.Create(18796112) []
Debug-Ausgabe: TMyTestComponent.AfterConstruction(18796112) []
* fehlt
Debug-Ausgabe: TMyTestComponent.SetText(18796112) = "123456" []
Das * zeigt, wo ich spätestens meine Aktion ausführen möchte.
fehlt: hätte es ja gerne in Create/AfterConstruction gemacht, aber da gibt es ja kein csLoading, woran ich mich orientieren kann, ob jetzt oder erst in Loaded.

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
  C: TMyTestComponent;
begin
  C := TMyTestComponent.Create(Self);
  C.Text := '123456';
end;
Delphi-Quellcode:
unit MyTestComponent;

interface

uses
  Windows, SysUtils, Classes, Controls, ExtCtrls, Dialogs, TypInfo;

type
  TMyTestComponent = class(TPaintBox)
  private
    { Private-Deklarationen }
    FText: String;
    function Conv(C: TComponentState): String;
    procedure SetText(Value: String);
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    procedure AfterConstruction; override;
    procedure Loaded; override;
  published
    { Published-Deklarationen }
    property Text: String read FText write SetText;
  end;

procedure Register;

implementation

function TMyTestComponent.Conv(C: TComponentState): String;
begin
  Result := SetToString(PTypeInfo(TypeInfo(TComponentState)), Word(C), True)
end;

procedure TMyTestComponent.SetText(Value: String);
begin
  OutputDebugString(PChar(Format('TMyTestComponent.SetText(%d) = "%s" %s',
    [Integer(Self), Value, Conv(ComponentState)])));
  MessageBox(0, PChar(Format('TMyTestComponent.SetText(%d) = "%s" %s',
    [Integer(Self), Value, Conv(ComponentState)])), nil, 0);
end;

constructor TMyTestComponent.Create(AOwner: TComponent);
begin
  inherited;
  FText := 'abcdef';
  OutputDebugString(PChar(Format('TMyTestComponent.Create(%d) %s',
    [Integer(Self), Conv(ComponentState)])));
  MessageBox(0, PChar(Format('TMyTestComponent.Create(%d) %s',
    [Integer(Self), Conv(ComponentState)])), nil, 0);
end;

procedure TMyTestComponent.AfterConstruction;
begin
  inherited;
  OutputDebugString(PChar(Format('TMyTestComponent.AfterConstruction(%d) %s',
    [Integer(Self), Conv(ComponentState)])));
  MessageBox(0, PChar(Format('TMyTestComponent.AfterConstruction(%d) %s',
    [Integer(Self), Conv(ComponentState)])), nil, 0);
end;

procedure TMyTestComponent.Loaded;
begin
  inherited;
  OutputDebugString(PChar(Format('TMyTestComponent.Loaded(%d) %s',
    [Integer(Self), Conv(ComponentState)])));
  MessageBox(0, PChar(Format('TMyTestComponent.Loaded(%d) %s',
    [Integer(Self), Conv(ComponentState)])), nil, 0);
end;

procedure Register;
begin
  RegisterComponents('himitsu', [TMyTestComponent]);
end;

end.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Feb 2011 um 12:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 12:47
Also ich hab es vorher getestet: Bei mir geht es. Aber vlt. verstehe ich nur nicht ganz, was du willst.
Aber zum Hinweis: In dem Beispiel prüfe ich auf OWNER.ComponentState, und nicht auf den eigenen.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 13:11
und eine Q&D, Loaded aufrufen wenn Du es zur Laufzeit erzeugst....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#8

AW: Wird Komponente aus DFM geladen?

  Alt 3. Feb 2011, 13:17
Ah, das Owner hab ich übersehn.

Hmm, stimmt, da steht es drin ... nur eben nicht im Eigenen.
Wobei das ja mit csDesigning klappt und es überall richtig drinsteht ... nur eben nicht beim cdLoading kommt es erst so spät.

@Bummi: Sowas vergißt man ja schnell mal.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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