Кто рисует TTimer во время разработки?

Кто рисует TTimer во время разработки?

При использовании дизайнера форм Delphi IDE, когда вы опускаете TTimer на форму, компонент виден во время разработки (но, конечно, не визуально во время выполнения).

Класс TTimer определен в модуле ExtCtrls, поэтому, конечно, я прочитал исходный код TTimer в этом модуле.

Я ожидал увидеть что-то вроде этого:

procedure TTimer.Paint;
begin
  if csDesigning in ComponentState then
    with Canvas do
    begin
      // Paint the design-time appearance of TTimer here:

      // ... code ...

    end else begin end; // no painting at runtime.
end;

Но я был удивлен, не увидев такого кода!

Компонент TTimer имеет это приватное поле: FWindowHandle: HWND;, но это используется только для получения сообщения WM_Timer от самих окон. Он не используется для рисования ничего, даже во время проектирования. И холста тоже нет.

Читая исходный код TTimer, я не смог найти ничего, связанного с рисованием времени разработки.

Таким образом, вопрос заключается в следующем: какой код и где отвечает за отображение времени разработки TTimer на форме в конструкторе форм самой Delphi IDE.

Теперь, если кто-то задается вопросом, почему я задаю этот вопрос, вот некоторая информация об этом:

В другом месте на Stackru кто-то спросил, можно ли загрузить файл.dfm во время выполнения. Кто-то ответил: "Нет, это невозможно".

Но это не совсем так. Я написал некоторый код для этого: загрузите "someform.dfm" с диска и создайте такую ​​форму во время выполнения. Это возможно, но неприятность заключается в том, что вам нужно написать такой код:

procedure RegisterNecessaryClasses;
begin
  RegisterClass(TfrmDynaForm);
  RegisterClass(TPanel);
  RegisterClass(TMemo);
  RegisterClass(TTimer);
  RegisterClass(TListBox);
  RegisterClass(TSplitter);
  RegisterClass(TEdit);
  RegisterClass(TCheckBox);
  RegisterClass(TButton);
  RegisterClass(TLabel);
  RegisterClass(TRadioGroup);
end;

Это только первый пример, который позволяет мне загрузить и представить одну конкретную форму без ошибок. Но, как только какая-то другая форма содержит, например: TSpeedbutton, вышеописанная процедура должна быть отредактирована, чтобы добавить эту строку:

  RegisterClass(TSpeedbutton);

Пропустите это, и вы получите исключение "класс Txxx не найден".

Другая проблема заключается в том, что даже после того, как я добавил код для поиска любых компонентов TTimer в dfm для загрузки, и я вручную установил csDesigning в ComponentState этого экземпляра TTimer, TTimer по-прежнему остается невидимым.

Итак, что (еще) мне нужно сделать, чтобы сделать TTimer видимым так же, как он виден в конструкторе форм Delphi IDE?

1 ответ

Невизуальные компоненты не имеют Paint Метод и так не умеет себя красить.

Кто рисует TTimer во время разработки?

Среда IDE отображает представление невизуальных компонентов.

Итак, что (еще) мне нужно сделать, чтобы сделать TTimer видимым так же, как он виден в конструкторе форм Delphi IDE?

Вы должны нарисовать это в своем коде. Невизуальные компоненты не будут краситься сами.

Другие вопросы по тегам