2012年11月8日木曜日

TCommnDialog と Style


まずは、これをご覧ください。



TOpenTextFileDialog を開いたところです。
みんな、VCL スタイルを使ってないのかな……
いや! HTML5 Builder を作った時に気づいてるハズなんだが!

……まあそれはそれとして、これを何とかしなくてはなりません。
前回の記事と同様に、拡張 RTTI を使ってコントロールから Style を取り除くコードを書きました。

unit uStyleUtils;
 
interface
 
procedure ClearStyles(const iObj: TObject);
 
implementation
 
uses
System.Rtti, System.TypInfo, Vcl.Controls;
 
procedure ClearStylesSub(const iControl: TControl);
var
i: Integer;
begin
if (iControl <> nil) then begin
if (iControl is TWinControl) then
with TWinControl(iControl) do
for i := 0 to ControlCount - 1 do
ClearStylesSub(Controls[i]);
 
iControl.StyleElements := [];
end;
end;
 
procedure ClearStyles(const iObj: TObject);
var
Context: TRttiContext;
Fields: TArray<TRttiField>;
Field: TRttiField;
RttiType: TRttiType;
Obj: TObject;
begin
Context := TRttiContext.Create;
try
try
Fields := Context.GetType(iObj.ClassType).GetFields;
 
for Field in Fields do begin
RttiType := Field.FieldType;
 
if
(RttiType = nil) or (RttiType.TypeKind <> tkClass) or
(Field.Name = 'FOwner') or (Field.Name = 'FParent')
then
Continue;
 
try
Obj := Field.GetValue(iObj).AsObject;
except
Obj := nil;
end;
 
if (Obj <> nil) and (Obj is TControl) then
ClearStylesSub(TControl(Obj));
end;
except
end;
finally
Context.Free;
end;
end;
 
end.

全文引用しても、この程度の長さのものです。
使い方は

procedure TForm1.FormCreate(Sender: TObject);
begin
ClearStyles(OpenTextFileDialog1);
end;

と最初に一回呼ぶだけです。
これで、キレイに表示できるようになりました。


0 件のコメント:

コメントを投稿