![]() |
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: ![]() 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. |
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 |
Re: Komponenten Eigenschaft in gesamter Anwendung ändern
Zitat:
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 :( |
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 |
Re: Komponenten Eigenschaft in gesamter Anwendung ändern
Zitat:
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. |
Re: Komponenten Eigenschaft in gesamter Anwendung ändern
Zitat:
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:
Nun muss wohl nen paar Nächte drüber schlafen, denn genau auf der Leitung sitze ich gerade. Oder schuppst mich jemand runter :lol: |
Re: Komponenten Eigenschaft in gesamter Anwendung ändern
Zitat:
|
Re: Komponenten Eigenschaft in gesamter Anwendung ändern
Schau Dir doch mal die
![]() |
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:
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.
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; Gruß oki |
Re: Komponenten Eigenschaft in gesamter Anwendung ändern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz