まずは、これをご覧ください。
TOpenTextFileDialog を開いたところです。
みんな、VCL スタイルを使ってないのかな……
いや! HTML5 Builder を作った時に気づいてるハズなんだが!
……まあそれはそれとして、これを何とかしなくてはなりません。
前回の記事と同様に、拡張 RTTI を使ってコントロールから Style を取り除くコードを書きました。
unit uStyleUtils;interfaceprocedure ClearStyles(const iObj: TObject);implementationusesSystem.Rtti, System.TypInfo, Vcl.Controls;procedure ClearStylesSub(const iControl: TControl);vari: Integer;beginif (iControl <> nil) then beginif (iControl is TWinControl) thenwith TWinControl(iControl) dofor i := 0 to ControlCount - 1 doClearStylesSub(Controls[i]);iControl.StyleElements := [];end;end;procedure ClearStyles(const iObj: TObject);varContext: TRttiContext;Fields: TArray<TRttiField>;Field: TRttiField;RttiType: TRttiType;Obj: TObject;beginContext := TRttiContext.Create;trytryFields := Context.GetType(iObj.ClassType).GetFields;for Field in Fields do beginRttiType := Field.FieldType;if(RttiType = nil) or (RttiType.TypeKind <> tkClass) or(Field.Name = 'FOwner') or (Field.Name = 'FParent')thenContinue;tryObj := Field.GetValue(iObj).AsObject;exceptObj := nil;end;if (Obj <> nil) and (Obj is TControl) thenClearStylesSub(TControl(Obj));end;exceptend;finallyContext.Free;end;end;end.
全文引用しても、この程度の長さのものです。
使い方は
procedure TForm1.FormCreate(Sender: TObject);beginClearStyles(OpenTextFileDialog1);end;
と最初に一回呼ぶだけです。
これで、キレイに表示できるようになりました。
0 件のコメント:
コメントを投稿