Как получить и работать со свойством FONT АНОНИМНОГО КОНТРОЛЯ?

В Delphi 10.4 в приложении VCL, используя OnMessage обработчик событий TApplicationEvents компонент, я увеличиваю размер шрифта элемента управления, который щелкнул правой кнопкой мыши:

procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  ThisControl: TControl;
begin
  if (Msg.Message = WM_RBUTTONDOWN) then
  begin
    ThisControl := FindDragTarget(Mouse.CursorPos, True);
    CodeSite.Send('TformMain.ApplicationEvents1Message: RIGHTCLICK!', ThisControl.Name);
    if ThisControl is TLabel then
      TLabel(ThisControl).Font.Size := TLabel(ThisControl).Font.Size + 1
    else if ThisControl is TCheckBox then
      TCheckBox(ThisControl).Font.Size := TCheckBox(ThisControl).Font.Size + 1;
    // ETC. ETC. ETC.! :-(
  end;
end;

Это крайне НЕЭФФЕКТИВНЫЙ способ сделать эту работу для всех типов элементов управления, потому что мне пришлось бы перечислить все существующие типы элементов управления, как TControl не имеет TFont свойство.

Лучшим способом было бы получить TFont свойство элемента управления без необходимости запрашивать TYPE и затем TYPECAST элемента управления.

Но как?

1 ответ

Решение

Если вы повторно объявите тип, вы получите доступ к защищенным свойствам класса. В настоящее время это делается с помощью класса вставки, но я все еще привык к старым методам. Возможно, придется добавить проверку, если окажется, что тот или иной элемент управления бомбит, когда вы что-то делаете со шрифтом. До сих пор это всегда помогало мне.

type
  TCrackControl = class(TControl);

procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  ThisControl: TCrackControl;
begin
  if (Msg.Message = WM_RBUTTONDOWN) then
  begin
    ThisControl := TCrackControl(FindDragTarget(Mouse.CursorPos, True));
    CodeSite.Send('TformMain.ApplicationEvents1Message: RIGHTCLICK!', ThisControl.Name);
    If assigned(ThisControl.Font) then
    ThisControl.Font.Size := ThisControl.Font.Size + 1;
   
  end;
end;
Другие вопросы по тегам