Ошибка при установке tdateTimepicker.font.style на курсив в Delphi 5

StackOverflow https://stackoverflow.com/questions/1324376

Вопрос

Можно ли установить шрифт TdateTimepicker на курсив? Я делаю это в этом коде

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;

И каждый раз, когда код выполняет последнюю строку, исключение Einvalidoperation бросается с сообщением:

„Control” has no parent window.

Эта функция Delphi 5, или я делаю что -то не так?

Это было полезно?

Решение

Да, вы делаете что -то не так. :)

Некоторые аспекты управления на основе окна требуют, чтобы элемент управления был размещен в окне контейнера. Обычно это отражает некоторые требования в самом классе базового окна (не класс VCL, а объект Windows Windows MS, представляющий элемент управления).

В этом случае просто перенесите свое назначение родительского имущества, чтобы оно произошло, прежде чем вы попытаетесь изменить шрифт.

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

Я не знаю, может ли шрифт быть успешно устанавливать курсив таким или нет, но это должно хотя бы решить ваше исключение.

ОБНОВИТЬ: Я подтвердил, что шрифт может быть курсивным таким образом, если вы сначала установили контрольного родителя. (Я использовал Delphi 2009, но я был бы удивлен, если бы он не сработал в Delphi 5)

К вашему сведению: я бы сильно Рекомендуйте другой выбор имени для этого управления панелью «холст».

Приложение: -------

Это призыв Invalidaterect () в Cmfontchanged () Обработчик сообщений, который требует рукоятки окна (что, в свою очередь, требует, чтобы элемент управления был родился).

Если вам абсолютно необходимо установить Родительский после Изменение Шрифт, вы можете получить свой собственный контрольный класс из TdateTimepicker и реализовать ответ на Cmfontchanged () Сообщение, которое подавляет унаследованное поведение, если контроль не родится:

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;

Обратите внимание, что Adjustehight () процедура воспроизводится из частный метод TdateTimepicker. Анкет Если вы меняете только Стиль шрифта Возможно, вам не понадобится воспроизводить этот код и вы можете удалить его и вызов, но если вы измените другие свойства Шрифт Затем это должно убедиться, что элемент управления правильно размером.

Когда вы звоните унаследован Частный Adjustehight () Механизм вызывается, поэтому в этом случае нет необходимости вызывать локальную копию этой процедуры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top