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 Komponenten Eigenschaft in gesamter Anwendung ändern (https://www.delphipraxis.net/131254-komponenten-eigenschaft-gesamter-anwendung-aendern.html)

Pichel 21. Mär 2009 11:41


Komponenten Eigenschaft in gesamter Anwendung ändern
 
Hiho, bin mal wieder am verzweifeln (glaub ich werde alt ^^)

Ich wollte einfach mal schnell nen Funktion basteln um im Form (oder besser gleich gesamten Anwendung) in allen Komponenten eine Eigenschaft zu ändern.

Im konkreten Beispiel wollte ich die Eigenschaft "Charset" von TFont global ändern.
Hab natürlich gesucht und am effektivsten war das:
http://www.delphipraxis.net/internal...t.php?t=114143

Funktioniert auch, sofern die Komponenten die Eigenschaft Font direkt haben. nimmt man nun als Beispiel den VirtualStringTree versteckt sich auch ein Font in Komponente.Header.Font und wer weis wo noch alles.

Mein Ansatz: also müsste ich bei jeder Komponente per GetPropList nach Typ TFont durchsuchen und Eigenschaften die wiederum Unter-Eigenschaften haben ebenfalls durchsuchen nach TFont.

Und genau diesbezüglich sitz ich jetzt schon stundenlang auf der Leitung und hoffe auf Eure Hilfe.

thkerkmann 21. Mär 2009 12:33

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Hi,

wenn alle Komponenten den gleichen Font haben (nehme ich mal jetzt an), dann haben sie ja die Eigenschaft ParentFont auf true gesetzt. Das bedeutet, man muss doch nur die Font Eigenschaft der Form ändern, und "wuppdi".....

oder nicht :?:

Gruss

Pichel 21. Mär 2009 12:42

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Zitat:

Zitat von thkerkmann
wenn alle Komponenten den gleichen Font haben (nehme ich mal jetzt an), dann haben sie ja die Eigenschaft ParentFont auf true gesetzt. Das bedeutet, man muss doch nur die Font Eigenschaft der Form ändern, und "wuppdi".....

Leider nicht, sonst wäre ich ja nicht so "kopflos" :?
Zum einen sind einige Fonts (TFont war nur mein Beispiel und es sollte ja auch für ander Typen funktionieren) nicht auf ParentFont und zum anderen gibt es auch Komponenten die nicht nur die Font-Eigentschaft haben sondern darüber hinaus auch zb Eigenschaften wie "HeaderFont" oder ähnlichem welche aber auch vom Typ TFont sind.

Also müsste ich alles nach dem Type durchsuchen und auf der Leitung sitze ich leider :(

thkerkmann 21. Mär 2009 16:09

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Achso,

dann werf ich mal die Begriffe RTTI und HasProperty in den Raum. Mit deren Hilfe und der Forumssuche sollte es dir gelingen die richtigen Ansätze zu finden. Eine fertige Lösung hab ich leider nicht für dich.

Gruss

Bernhard Geyer 21. Mär 2009 16:16

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Zitat:

Zitat von Pichel
Im konkreten Beispiel wollte ich die Eigenschaft "Charset" von TFont global ändern.

Und in diesem konkreten Fall sage ich dir das eine auf Charset basierte internationalisierung einer anwendung mist ist und an diesersen Stellen einfach nicht funktioniert. Für diesen Fall empfehle ich dir entweder D2009, ElPack oder TNTWare-Controls.

Für das allgemeine Problem ist eine eigene Basis-Formularklasse hilfreich in der du (in Zusammenarbeit mit der RTTI) im Form-Konstruktor die entsprechenden Properties auf passende Werte setzt. Beim Einsatz des ElPack hättest du auch mit Hilfe eines CSS-Ähnlichen-Systems das auch noch zur Laufzeit dynamisch durch zu führen.

Pichel 21. Mär 2009 17:00

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Zitat:

Zitat von Bernhard Geyer
Und in diesem konkreten Fall sage ich dir das eine auf Charset basierte internationalisierung einer anwendung mist ist und an diesersen Stellen einfach nicht funktioniert. Für diesen Fall empfehle ich dir entweder D2009, ElPack oder TNTWare-Controls.

Durchschaut :oops:
nun, D2009 ist nicht gerade mal so eben angeschafft vorallem da ich mit D7 Prof. sehr zufrieden bin.
ElPack ist schon günstiger und TNT ist wirklich günstig nur diesbezüglich, was mach ich mit Komponenten welche da nicht vorhanden sind, zB aus Jedi Sammlung oder mein lieb gewonnener VST.

Zitat:

Zitat von Bernhard Geyer
Für das allgemeine Problem ist eine eigene Basis-Formularklasse hilfreich in der du (in Zusammenarbeit mit der RTTI) im Form-Konstruktor die entsprechenden Properties auf passende Werte setzt

Also wie mein bisheriger Ansatz über die Components und per GetPropList(Components[k], PropList) die Eigenschaften durchlaufen.

Nun muss wohl nen paar Nächte drüber schlafen, denn genau auf der Leitung sitze ich gerade. Oder schuppst mich jemand runter :lol:

Bernhard Geyer 21. Mär 2009 17:12

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Zitat:

Zitat von Pichel
ElPack ist schon günstiger und TNT ist wirklich günstig nur diesbezüglich, was mach ich mit Komponenten welche da nicht vorhanden sind, zB aus Jedi Sammlung oder mein lieb gewonnener VST.

Umbauen oder beim VST ist dies ja nicht nötig (auch wenn es bei Elpack ähnlichel Control gibt), da ja VST auch Unicode-Enabled ist.

alzaimar 21. Mär 2009 17:45

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Schau Dir doch mal die TsiLang-Suite an

oki 21. Mär 2009 17:48

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Hi Pichel,

warum soll das mit der PropList nicht gehen. Du iterierst durch die Properties und immer wenn ein Prop vom Typ tkClass ist holst du dir deren Propertys. Das geht rekursiv sehr gut und du findest alle Fonts und alle Charsets.
Delphi-Quellcode:
procedure ChangeCharset(APropObj : TObject; ACharset : TFontCharset);
var PropList : PPropList;
    Counter : Integer;
    PropName : String;
    SubObj: TObject;
begin
  if not Assigned(APropObj) then
    Exit;

  PropCount := GetPropList(APropObj.ClassInfo, PropList);
  for Counter := 0 to PropCount - 1 do begin
    isClass := False;
    PropValue := '';
    SubObj := nil;
    PropName := PropList[Counter]^.Name;
    if PropName = 'Charset' then
      SetOrdProp(APropObj, ACharset);
    if PropList[Counter]^.PropType^.Kind in [tkClass] then begin
      // neue Unterklasse
      SubObj := GetObjectProp(APropObj, PropName);
      if Assigned(SubObj) then
        AddPropsinTree(SubObj, ACharset);
    end;
  end;
end;
Ich hab das jetzt mal stückweise aus meinem Code rauskopiert und ungeprüft geändert. Also keine Garantie. Das Prinzip sollte aber stimmen. Du hast ja geschrieben, dass du alle Komponenten deiner Anwendung suchst. Jedesmal, wenn du eine gefunden hast übergibst du diese incl. deinem neuen Charset dieser Methode und es sollte alles gesetzt werden.

Gruß oki

Pichel 22. Mär 2009 12:23

Re: Komponenten Eigenschaft in gesamter Anwendung ändern
 
Zitat:

Zitat von Bernhard Geyer
Und in diesem konkreten Fall sage ich dir das eine auf Charset basierte internationalisierung einer anwendung mist ist...

... habe das jetzt nochmal "sacken" lassen ;-) und bin eigentlich der Meinung, daß es doch tragbar ist, wenn es einfach nur darum geht, zB "Spanisch" als Spache zu unterstützen da es dort nur um wenige Sonderzeichen geht und nicht gleich der komplette Unicode Zeichensatz benötigt wird.


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