Bonjour,

Je cherche a tester l'usage des RTTI sur une Form .
Pour cela , j'ai créer une form contenant divers composants et je cherche a modifier si la propriété existe les couleurs .

ceci de cette manière
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
// rtti dans la clause uses
procedure TForm13.ColorButton1Click(Sender: TObject);
var
  ctx: TRttiContext;
  t: TRttiType;
  p: TRttiProperty;
  i : Longint;
begin
  ctx := TRttiContext.Create;
  try
    for I := 0 to ComponentCount - 1 do
    begin
     t:=ctx.GetType(Components[i].ClassInfo);
     p:=t.GetProperty('Color');
     if assigned(p)   then  p.SetValue(Components[i],clGreen);
    end;
  finally
    ctx.Free
  end;
end;
pour une propriété 'simple' pas de soucis

je me suis ensuite laissé aller à mettre des composants plus complexe : des tmsSmoothButtons,tmsSmoothMessageDialog,tmsSmoothExpanderPanel
là les choses se compliquent
pour le tmsSmoothButton pas de soucis , la propriété Color existe , le changement se fait

pour les 2 autres les couleurs sont gérées dans une structure TGDIPFill ( propriété Fill ) et là je ne vois pas comment faire

j'ai rajouté ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
     p:=t.GetProperty('Fill');
     if assigned(p)
         then begin
           if t.Name='TAdvSmoothMessageDialog' then
           begin
           TAdvSmoothMessageDialog(Components[i]).Fill.Color  :=clgreen;
           TAdvSmoothMessageDialog(Components[i]).Fill.ColorTo:=clolive;
           end;
           if t.Name='TAdvSmoothExpanderPanel' then
           begin
             TAdvSmoothExpanderPanel(Components[i]).Fill.Color  :=clgreen;
             TAdvSmoothExpanderPanel(Components[i]).Fill.ColorTo:=clolive;
           end;
Qui est plus qu'inélégant .

Comment faire pour toucher à la propriété Fill et faire d'une pierre 2 coup dans mon cas ?