Если ваши Формы происходят от общего предка (а не по умолчанию TForm
), например TMyBaseForm
, что означает TForm1 = class(TMyBaseForm)
, это можно сделать легко.В событии TMyBaseForm.OnShow
вы можете перебирать его элементы управления, и если вы найдете TEdit
или TMemo
, вы динамически устанавливаете их свойство PopupMenu
.
Другой способ - использовать Screen.OnActiveFormChange
(Screen.OnActiveControlChange
срабатывает слишком поздно, если щелкнуть правой кнопкой мыши активный элемент управления - РЕДАКТИРОВАТЬ: это верно только для D5 ) в основном обработчике событий формы, чтобы захватить активную форму и выполнить итерации элементов управления Screen.ActiveForm
иустановите TEdit
или TMemo
свойство PopupMenu
на свой пользовательский MyPopupMenu
:
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveFormChange := ActiveFormChange;
end;
procedure TForm1.ActiveFormChange(Sender: TObject);
begin
CustomEditControlsNormalize(Screen.ActiveForm);
end;
type
TCustomEditAccess = class(TCustomEdit);
procedure TForm1.CustomEditControlsNormalize(F: TForm);
var
I: Integer;
begin
if not Assigned(F) then Exit;
for I := 0 to F.ComponentCount - 1 do
if F.Components[I] is TCustomEdit then
TCustomEditAccess(F.Components[I]).Popupmenu := MyPopupMenu;
end;
Чтобы определить, какой элемент управления TCustomEdit
вызвал всплывающее меню, обратитесь к MyPopupMenu.PopupComponent
(в событии MyPopupMenu.OnPopup
):
procedure TForm1.MyPopupMenuPopup(Sender: TObject);
begin
if MyPopupMenu.PopupComponent is TCustomEdit then
begin
FEditPopupControl := TCustomEdit(MyPopupMenu.PopupComponent);
Caption := FEditPopupControl.Name; // debug :-P
end;
end;
EDIT: Screen.OnActiveControlChange
было моей первоначальной мыслью.Я проверил это в D5.если Edit1 сфокусирован, и я щелкаю правой кнопкой мыши на Edit2, он сначала выскочит меню по умолчанию, только затем он станет активным элементом управления.Я наконец проверил это с D7 и D2009.оба работают просто отлично.Это проблема D5 , поэтому Ответ Justmade , безусловно, является лучшим решением, чем использование Screen.OnActiveFormChange
.