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 Globale Styles (https://www.delphipraxis.net/68860-globale-styles.html)

lizardking 6. Mai 2006 22:05


Globale Styles
 
Hallo zusammen,

wahrscheinlich bin ich nur nicht auf die richtigen Stichworte zur Suche nach meiner Frage gekommen. Mich wuerde mal interessieren, wie manche Komponenten den Style einer Anwendung aendern, nur wenn man sie auf dir Form zieht.

Beispiel: Ich habe ein bereits fertiges Form mit einigen Controls und setze dann die Komponente XY darauf, die dafuer sorgt, dass saemtliche Controls auf einmal im Style Flat sind.

Wie macht man sowas ? Meine Idee waere ja im Create saemtliche Controls des Parents durchzugehen und auf Flat zu setzen. Aber dafuer muesste ich sicher sein, dass meine Komponente ganz zuletzt erstellt wird.

Wenn jemand Bescheid weiss, bin ich fuer jede Hilfe dankbar :)

Gruesse,

Lizzy

DGL-luke 7. Mai 2006 00:05

Re: Globale Styles
 
Du könntest die komponente ja auch beim onshow aktiv werden lassen bzw. die komponenten explizit in eine liste eintragen, die dein manager dann stylen soll.

SirThornberry 7. Mai 2006 08:18

Re: Globale Styles
 
Alle von TComponent abgeleiteten Komponenten/Objecte haben im Protected die Methode Notification. Diese wird unter anderem aufgerufen wenn ein neues Control aufs Form gepackt wird.

lizardking 7. Mai 2006 09:45

Re: Globale Styles
 
Zitat:

Zitat von SirThornberry
Alle von TComponent abgeleiteten Komponenten/Objecte haben im Protected die Methode Notification. Diese wird unter anderem aufgerufen wenn ein neues Control aufs Form gepackt wird.

Ahhhhhhh ! :mrgreen: Danke, das ist schonmal ein guter Ansatz. Jetzt hab ich nur ein Problem. Wenn ich Folgendes in Notification mache, bekomme ich 'ne AV:

Delphi-Quellcode:
procedure TMyClass.Notification(AComponent: TComponent;
  Operation: TOperation);

begin
  inherited;
  if (FInit) and (Operation = opInsert) then
    if AComponent is TEdit then
      (AComponent as TEdit).Text := 'abc';
end;
FInit setze ich am Ende meines Constructors auf true, so dass die Notification erst dann bearbeitet wird, wenn meine Komponente vollstaendig initialisiert ist. Wenn AComponent wirklich ein TEdit ist, dann tritt die AV genau beim Setzen von Text auf. Setze ich hingegen z.B. Ctl3d auf false, gibt's keine AV, aber das Edit ist immer noch ein 3D-Control.

Fuer mich sieht das so aus, als ob dieses Notify irgendwie mitten im Create der neuen Komponente aufgerufen wird. Sie ist schon so weit kreeirt, dass ich mittels "is" erkennen kann, dass es ein TEdit ist, aber doch nocht nicht so weit da, dass ich die Properties setzen kann. :gruebel:

Merkwuerdig...

Aber Danke schonmal fuer den Denkansatz :)

Gruesse,

Lizzy


EDIT:

Es ist genau so, wie vermutet :( Wenn ich in der Notification-Methode alle Components vom Owner meiner Komponente durchgehe und wenn das Component ein TEdit ist die Property setze UND das in einem try...except-Block mache, dann funktioniert es "einigermassen".
"Einigermassen", weil : Ich setze meine Komponente auf eine Form. Dann setze ich darauf ein TEdit mit Namen Edit1. Dann passiert gar nix. Jetzt setze ich noch ein TEdit auf die Form. Dann aendert sich der Text von Edit1 in "abc", Edit2 bleibt unveraendert. Setze ich danach irgendeine Komponente auf die Form, hat auch Edit2 den Text "abc".

Aaalso : Notification wird aufgerufen BEVOR die neue Komponente wirklich komplett initialisiert ist. Wenn ich das Projekt im Debugger starte, dann bekomme ich auch 'ne AV, ohne Debugger laeuft das Projekt genau wie gewuenscht. Arrghh... gibt's keine Methode, die aufgerufen wird NACHDEM eine neue Kompo komplett in die Form eingefuegt wurde ?


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