Question

Est-il possible de définir la police de TDateTimePicker en italique? Je le fais dans ce code

var
  DatEdit : TDateTimePicker;
begin
  //I know Canvas is a stupid name for TPanel
  DatEdit:=TDateTimePicker.Create(Canvas);

  DatEdit.OnEnter := CtrlInputProc;
  DatEdit.OnExit := CtrlExitProc;
  DatEdit.Enabled := false;
  DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic]; //this line creates an exception
  DatEdit.Parent := Canvas;

end;

Et chaque code temporel exécute la dernière ligne, une exception EInvalidOperation est lancée avec un message:

„Control” has no parent window.

Cette fonctionnalité est-Delphi 5, ou que je fais quelque chose de mal?

Était-ce utile?

La solution

Oui, vous faites quelque chose de mal. :)

Certains aspects d'une fenêtre de contrôle à base exigent que le contrôle soit placé sur sa fenêtre conteneur. Cela reflète généralement une certaine exigence dans la classe de la fenêtre sous-jacente elle-même (et non la classe VCL, mais l'objet de la fenêtre MS Windows représentant le contrôle).

Dans ce cas, il suffit de déplacer votre affectation de la propriété Parent de sorte qu'il se produit avant de tenter de changer le Font.Style:

  DatEdit.OnEnter := CtrlInputProc;
  DatEdit.OnExit := CtrlExitProc;
  DatEdit.Enabled := false;
  DatEdit.Parent := Canvas;
  DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic];

Je ne sais pas si la police peut être réglée avec succès en italique de cette manière ou non, mais cela ne devrait au moins répondre à votre exception.

Mise à jour: J'ai confirmé que la police peut être en italique de cette façon, aussi longtemps que vous avez d'abord définir le parent de contrôle. (Je Delphi 2009, mais je serais surpris si cela ne fonctionne pas dans Delphi 5)

Pour votre information:. Je fortement recommander un autre choix de nom pour ce panneau "toile" contrôle

Addendum: -------

Il est l'appel à InvalidateRect () CMFontChanged () gestionnaire de messages qui nécessite une poignée de fenêtre (ce qui exige que le contrôle soit parented).

Si vous devez absolument être en mesure de régler le Parent après modifier Police , vous pouvez obtenir votre propre classe de contrôle de TDateTimePicker et mettre en œuvre une réponse à la CMFontChanged () un message qui supprime le comportement hérité à moins que le contrôle est apparenté:

type
  TMyDateTimePicker = class(TDateTimePicker)
  protected
    procedure CMFontchanged(var Message: TMessage); message CM_FONTCHANGED;
  end;


  procedure TMyDateTimePicker.CMFontchanged(var Message: TMessage);

    procedure AdjustHeight;
    var
      DC: HDC;
      SaveFont: HFont;
      SysMetrics, Metrics: TTextMetric;
    begin
      DC := GetDC(0);
      try
        GetTextMetrics(DC, SysMetrics);
        SaveFont := SelectObject(DC, Font.Handle);
        GetTextMetrics(DC, Metrics);
        SelectObject(DC, SaveFont);
      finally
        ReleaseDC(0, DC);
      end;
      Height := Metrics.tmHeight + (GetSystemMetrics(SM_CYBORDER) * 8);
    end;

  begin
    if HasParent then
      inherited
    else
      AdjustHeight;
  end;

Notez que le adjustheight () procédure est reproduit à partir d'un privé de TDateTimePicker . Si vous ne modifiez le Font.Style vous ne pouvez pas besoin de reproduire ce code et peut le supprimer et l'appel à, mais si vous modifiez d'autres propriétés du Police cela devrait veiller à ce que le contrôle soit correctement dimensionné.

Lorsque vous appelez hérité privé adjustheight () mécanisme est invoquée donc il n'y a pas besoin d'appeler la copie locale de cette procédure dans ce cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top