Fehler beim Einstellen von tdatetimePicker.font.style auf italisch in Delphi 5
-
19-09-2019 - |
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?
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.