Frage

Ist es möglich, TDATETIMEPICKER -Schriftart auf eine kursive Schrift zu setzen? Ich mache es in diesem 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;

Und jedes Mal, wenn der Code die letzte Zeile ausführt, wird eine Ein -Validoperations -Ausnahme mit einer Nachricht ausgeliefert:

„Control” has no parent window.

Ist diese Delphi 5 -Funktion oder mache ich etwas falsch?

War es hilfreich?

Lösung

Ja, du machst etwas falsch. :)

Einige Aspekte eines Fensterbasis erfordern, dass die Steuerung im Containerfenster platziert wird. Dies spiegelt normalerweise eine gewisse Anforderungen in der zugrunde liegenden Fensterklasse selbst wider (nicht in der VCL -Klasse, sondern in dem MS -Fensterfenster, das die Steuerung darstellt).

Bewegen Sie in diesem Fall einfach Ihre Zuordnung der übergeordneten Eigenschaft so, dass sie auftritt, bevor Sie versuchen, die Schriftart zu ändern.

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

Ich weiß nicht, ob die Schriftart auf diese Weise erfolgreich auf eine kursive Einstellung gesetzt werden kann, aber dies sollte zumindest Ihre Ausnahme ansprechen.

AKTUALISIEREN: Ich habe bestätigt, dass die Schriftart auf diese Weise ITALIC gemacht werden kann, solange Sie das Steuereltern zuerst festgelegt haben. (Ich habe Delphi 2009 verwendet, aber ich wäre überrascht, wenn es in Delphi 5 nicht funktioniert hätte)

Zu Ihrer Information: Ich würde stark Empfehlen Sie eine andere Auswahl des Namens für diese Steuerung von "Canvas".

Addendum: -------

Es ist der Anruf zu Invalysect () in dem CmfontChanged () Nachrichtenhandler, für den ein Fenstergriff erforderlich ist (was wiederum erfordert, dass das Steuerelement überlagert wird).

Wenn Sie unbedingt in der Lage sein müssen, das festzulegen Elternteil nach Ändern der Schriftart, Sie können Ihre eigene Kontrollkurs abgeben TdatetimePicker und implementieren Sie eine Antwort auf die CmfontChanged () Nachricht, die das ererbte Verhalten unterdrückt, es sei denn, die Kontrolle wird unterteilt:

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;

Notiere dass der AdjuTheight () Verfahren wird von a reproduziert Privatgelände Methode von TdatetimePicker. Wenn Sie das nur ändern Schriftstil Möglicherweise müssen Sie diesen Code nicht reproduzieren und können ihn und den Anruf daran entfernen, aber wenn Sie andere Eigenschaften der Schriftart Dies sollte sicherstellen, dass die Kontrolle korrekt groß ist.

Wenn du anrufst vererbt Das private AdjuTheight () Der Mechanismus wird aufgerufen, sodass in diesem Fall nicht die lokale Kopie dieses Verfahrens aufgerufen werden muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top