![]() |
Eigenschaften unterschiedlicher Objekte ändern
Hallo,
ich möchte zur Laufzeit die Eigenschaften (readonly und color) unterschiedlicher Objekte ändern. Das betrifft bspw. TEdit, TMemo, TCombobox,TListbox, TJvListbox und TJvCombobox. Mein Ansatz bisher war:
Delphi-Quellcode:
Leider hänge ich ein wenig an der markierten Stelle, und hoffe ihr könnt mir meinen Fehler ein wenig deutlich machen.
for i := 0 to Mainform.ComponentCount - 1 do
Begin if ((Mainform.Components[i] is TEdit) or (Mainform.Components[i] is TMemo) or (Mainform.Components[i] is TListbox) or (Mainform.Components[i] is TJvListbox) or (Mainform.Components[i] is TJvComboBox) or (Mainform.Components[i] is TCombobox)) and (((Mainform.Components [i]).tag=1)) then Begin with (Mainform.Components [i]) do readonly:=true; //mag er nicht : Undefinierter Bezeichner end; End;end; MFG Steffen |
Re: Eigenschaften unterschiedlicher Objekte ändern
Mainform.Components [i] ist nur ein Zeiger, deshalb weiß der Compiler nicht, wen er da vor sich hat. Du brauchst etwas wie
Delphi-Quellcode:
Ungetestet, müsste aber etwa so gehen.
if Mainform.Components[i] is TEdit then
begin with if Mainform.Components[i] as TEdit do begin ReadOnly := true; end; Grüße, Messie |
Re: Eigenschaften unterschiedlicher Objekte ändern
Sicher, dass das zweite if da rein gehört?
|
Re: Eigenschaften unterschiedlicher Objekte ändern
Wenn die Komponenten nicht denselben Vorfahren aufweisen, der genau die von dir zu veränderden Eigenschaften besitzt wirst du so nicht weiterkommen.
Eine TListBox hat keine Eigenschaft, die das beschreiben durch Benutzereingabe erluabt oder nicht erlaubt, ich weiss nicht was du dabei vorhast.
Delphi-Quellcode:
for i := 0 to Mainform.ComponentCount - 1 do Begin if ((Mainform.Components[i] is TCustomEdit) then TCustomEdit(Mainform.Components[i]).ReadOnly := True else if (Mainform.Components[i] is TCustomComboBox) then TCustomComboBox(Mainform.Components[i]).Style := csDropDownList; End;end; |
Re: Eigenschaften unterschiedlicher Objekte ändern
RTTI ist das Zauberwort. Genau so wie auch die VCL/RTL aus den DFM-Ressourcen die Komponenten wieder herstellt.
Hier ein Beispiel zum setzen eines Boolean-Properties:
Delphi-Quellcode:
uses
TypInfo; procedure MySetPropertyBool(Component: TComponent; const PropName: String; const Value: Boolean); var PropInfo: PPropInfo; begin if (Component <> nil) then begin PropInfo := GetPropInfo(Component.ClassInfo, PropName); if (PropInfo <> nil) then begin if (PropInfo^.PropType^.Kind in [tkEnumeration]) then SetEnumProp(Component, PropInfo, BooleanIdents[Value]); end; end; end; |
Re: Eigenschaften unterschiedlicher Objekte ändern
@Tyrael Y.:Klar, mein Fehler. Würde man nur die Eigenschaft color betrachten, wie könnte man den Code im ersten Beitrag entsprechend Korrigieren? Bin auf der suche nach einer kurzen "eleganten" Lösung. Andererseits, sofern ich einigen Komponenten ein readonly geben möchte, werde ich wohl den längeren Weg gehen müssen.
Ich ging davon aus, dass die Komponenten von TObject abstammen und somit
Delphi-Quellcode:
möglich wäre. Funktioniert aber irgendwie auch nicht. Möchte erreichen, dass ich nicht für jedes Objekt eine extra Abfrage laufen lassen muss.
for i := 0 to Mainform.ComponentCount - 1 do
Begin if ((Mainform.Components[i] is TEdit) or (Mainform.Components[i] is TMemo)) and (((Mainform.Components [i]).tag=1)) then Begin with (Mainform.Components [i]) as TObject do readonly:=true; end; End;end; @Bernhard: das muss ich erstmal "sacken" lassen.... MFG Steffen |
Re: Eigenschaften unterschiedlicher Objekte ändern
Du musst nicht jede Komponente einzeln behandeln.
Guck mal bitte nochmal meinen Code an. Du musst den gemeinsamen Vorfahren finden bei der diese von dir gesuchte Eigenschaft definiert wird. Somit erschlägts du in einem Schritt ganz viele Komponenten. Edit: Die Eigenschaft Color wird in TControl definiert.
Delphi-Quellcode:
for i := 0 to Mainform.ComponentCount - 1 do Begin if ((Mainform.Components[i] is TCustomEdit) then TCustomEdit(Mainform.Components[i]).ReadOnly := True else if (Mainform.Components[i] is TCustomComboBox) then TCustomComboBox(Mainform.Components[i]).Style := csDropDownList; if (Mainform.Components[i] is TControl) then TControl(Mainform.Components[i]).Color := clGreen; End;end; |
Re: Eigenschaften unterschiedlicher Objekte ändern
Zitat:
Grüße, Messie |
Re: Eigenschaften unterschiedlicher Objekte ändern
@Tyrael Y.:
TControl schein es nicht zu sein, oder aber ich habe eine Fehler im Code:
Delphi-Quellcode:
(Die zweite Abfrage könnte man auch mit der ersten Verbinden, hier soll jedoch noch mehr rein....)for i := 0 to Mainform.ComponentCount - 1 do Begin if (Mainform.Components [i]).tag=1 then Begin if (Mainform.Components[i] is TControl) then TControl(Mainform.Components[i]).Color :=cl3DLight; //undefinierter Bezeichner Color end; //if end; MFG Steffen |
Re: Eigenschaften unterschiedlicher Objekte ändern
Hab es jetzt grade mal geprüft.
Color ist in TControl definiert, ist aber protected. Die meisten Controls machen die Eigenschaft erst beim eigentlich benutztem Nachfahren published oder public. Tja da musst du jetzt genau gucken, welchen Controls du die Color Eigenschaft zuweisen möchtest und für jeden von denen nach einem gemeinsamen Vorfahren mit Color published bzw publich suchen. z.B bei TEdit ist es TEdit selbst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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