Zitat von
himitsu:
Und ich bleibe dann wohl doch beim alten (kommt ja bei mir selten genug vor),
da weiß/sehe ich wenigstens noch besser was dort passieren soll.
Hi himitsu,
ich habe meine ad hoc-Lösung ein bisschen überarbeitet
Delphi-Quellcode:
type
TTypeKinds = set of TTypeKind;
procedure SetPropIfPossible(const AnInstance: TObject;
const APropName: string; const ANeededTypes: TTypeKinds;
const AValue: Variant); overload;
begin
Assert( Assigned(AnInstance) );
if IsPublishedProp(AnInstance, APropName) and
(PropType(AnInstance, APropName) in ANeededTypes) then
SetPropValue(AnInstance, APropName, AValue);
end;
procedure SetPropIfPossible(const AnInstance: TObject;
const APropName, AValue: string); overload;
begin
SetPropIfPossible(AnInstance, APropName, [tkWChar, tkLString, tkWString],
AValue);
end;
procedure SetPropIfPossible(const AnInstance: TObject;
const APropName: string; const AValue: Boolean); overload;
begin
SetPropIfPossible(AnInstance, APropName, [tkEnumeration], AValue);
end;
procedure SetPropIfPossible(const AnInstance: TObject;
const APropName: string; const AValue: Integer); overload;
begin
SetPropIfPossible(AnInstance, APropName, [tkInteger], AValue);
end;
so dass man die Lösung relativ simpel anwenden kann (vielleicht will sich jmd mal die Mühe machen, das ganze zu erweitern und in die Code-Library zu stellen?)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
SetPropIfPossible(Sender, '
Width', 200);
SetPropIfPossible(Sender, '
Enabled', False);
SetPropIfPossible(Sender, '
Caption', '
What about RTTI?');
end;
Ich muss sagen, dass ich die Lösung deutlich Übersichtlicher finde, als zB diese:
Delphi-Quellcode:
If Sender.ClassType = TButton
Then Begin
TButton(Sender).Enabled := True;
TButton(Sender.Width:= 200;
Tbutton(Sender).Caption:= '
What about RTTI?';
End Else If Sender.ClassType = TBitBtn
Then Begin
TBitBtn(Sender).Enabled := True;
TBitBtn(Sender.Width:= 200;
TBitBtn(Sender).Caption:= '
What about RTTI?';
End Else If Sender.ClassType = TEdit
Then Begin
TEdit(Sender).Enabled := True;
TEdit(Sender).Width:= 200;
End Else If Sender.ClassType = TMemo
Then Begin
TMemo(Sender).Enabled := True;
TMemo(Sender).Width:= 200;
End;
Darüber hinaus funktioniert sie mit
jeder Delphi-Komponente, die im
OI die entsprechenden Eigenschaften besitzt...