Mettre à jour les fonts de manière récursive sur un formulaire Delphi

J’essaie d’itérer tous les contrôles d’un formulaire et d’activer le lissage des fonts ClearType. Quelque chose comme ça:

procedure TForm4.UpdateControls(AParent: TWinControl); var I: Integer; ACtrl: TControl; tagLOGFONT: TLogFont; begin for I := 0 to AParent.ControlCount-1 do begin ACtrl:= AParent.Controls[I]; // if ParentFont=False, update the font here... if ACtrl is TWinControl then UpdateControls(Ctrl as TWinControl); end; end; 

Maintenant, existe-t-il un moyen facile de vérifier si ACtrl a une propriété Font pour que je puisse transmettre Font.Handle à quelque chose comme:

 GetObject(ACtrl.Font.Handle, SizeOf(TLogFont), @tagLOGFONT); tagLOGFONT.lfQuality := 5; ACtrl.Font.Handle := CreateFontIndirect(tagLOGFONT); 

Merci d’avance.

Vous utilisez l’unité TypInfo, plus spécifiquement les méthodes IsPublishedProp et GetOrdProp.

Dans votre cas, ce serait quelque chose comme:

 if IsPublishedProp(ACtrl, 'Font') then ModifyFont(TFont(GetOrdProp(ACtrl, 'Font'))) 

Un fragment d’une de mes bibliothèques qui devrait vous mettre sur la bonne voie:

 function ContainsNonemptyControl(controlParent: TWinControl; const requiredControlNamePrefix: ssortingng; const ignoreControls: ssortingng = ''): boolean; var child : TControl; iControl: integer; ignored : TSsortingngList; obj : TObject; begin Result := true; if ignoreControls = '' then ignored := nil else begin ignored := TSsortingngList.Create; ignored.Text := ignoreControls; end; try for iControl := 0 to controlParent.ControlCount-1 do begin child := controlParent.Controls[iControl]; if (requiredControlNamePrefix = '') or SameText(requiredControlNamePrefix, Copy(child.Name, 1, Length(requiredControlNamePrefix))) then if (not assigned(ignored)) or (ignored.IndexOf(child.Name) < 0) then if IsPublishedProp(child, 'Text') and (GetStrProp(child, 'Text') <> '') then Exit else if IsPublishedProp(child, 'Lines') then begin obj := TObject(cardinal(GetOrdProp(child, 'Lines'))); if (obj is TSsortingngs) and (Unwrap(TSsortingngs(obj).Text, child) <> '') then Exit; end; end; //for iControl finally FreeAndNil(ignored); end; Result := false; end; { ContainsNonemptyControl } 

Il n’est pas nécessaire d’utiliser RTTI pour cela. Chaque descendant de TControl possède une propriété Font. Au niveau de TControl, sa visibilité est protégée mais vous pouvez utiliser cette solution pour y accéder:

 type THackControl = class(TControl); ModifyFont(THackControl(AParent.Controls[I]).Font); 

Une autre chose à mentionner. Chaque contrôle a une propriété ParentFont, qui, si elle est définie, permet au choix de la police du formulaire de se propager à chaque contrôle. J’ai tendance à faire en sorte que ParentFont soit mis à jour autant que possible, ce qui facilite également le thème des formes en fonction du système d’exploitation actuel.

De toute façon, vous ne devriez certainement pas avoir à faire quoi que ce soit pour activer le lissage ClearType? Cela devrait arriver automatiquement si vous utilisez une police TrueType et que l’utilisateur a activé “l’effet” Cleartype.

Voici un exemple de C ++ Builder de la réponse de TOndrej :

 struct THackControl : TControl { __fastcall virtual THackControl(Classes::TComponent* AOwner); TFont* Font() { return TControl::Font; }; }; for(int ControlIdx = 0; ControlIdx < ControlCount; ++ControlIdx) { ((THackControl*)Controls[ControlIdx])->Font()->Color = clRed; }