Как получить и работать со свойством 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;