your Menu
(または a Button
) を に接続するとAction
、Action
はこれらすべてのプロパティの制御を引き継ぐことになっています:
AutoCheck, Caption, Checked, Enabled, HelpContext, Hint, GroupIndex, Bitmap/ImageIndex, ShortCut, Visible
そして、あなたの場合はOnClick/Execute
.
それがそもそもアクションの「存在理由」です。
したがってAction
、イベント ハンドラーを使用せずにそのままにしておくと、Execute
事実上nil
、コントロールのOnClick
イベントに入れられます。
これは、dfm で指定されたアクションがコントロールにフックされた時点で、コントロールが dfm から読み取られるたびに発生します。OnClick を設定してから、View As Text に切り替えて元に戻す (Alt+F12 を 2 回) と、OnClick が消えてしまいます...
VCL ソースを参照してください。
procedure TMenuItem.ActionChange(Sender: TObject; CheckDefaults: Boolean);
begin
if Sender is TCustomAction then
with TCustomAction(Sender) do
begin
if not CheckDefaults or (Self.AutoCheck = False) then
Self.AutoCheck := AutoCheck;
if not CheckDefaults or (Self.Caption = '') then
Self.Caption := Caption;
if not CheckDefaults or (Self.Checked = False) then
Self.Checked := Checked;
if not CheckDefaults or (Self.Enabled = True) then
Self.Enabled := Enabled;
if not CheckDefaults or (Self.HelpContext = 0) then
Self.HelpContext := HelpContext;
if not CheckDefaults or (Self.Hint = '') then
Self.Hint := Hint;
if RadioItem and (not CheckDefaults or (Self.GroupIndex = 0)) then
Self.GroupIndex := GroupIndex;
if not CheckDefaults or (Self.ImageIndex = -1) then
Self.ImageIndex := ImageIndex;
if not CheckDefaults or (Self.ShortCut = scNone) then
Self.ShortCut := ShortCut;
if not CheckDefaults or (Self.Visible = True) then
Self.Visible := Visible;
if not CheckDefaults or not Assigned(Self.OnClick) then
Self.OnClick := OnExecute; // <====== use debug dcus and put a break here...
end;
end;
更新:...しかし、OnClick イベントにコードがある場合、これは発生しないはずです。
これはバグのようです。MenuItem が dfm から読み取られるとき、親フォームはまだ完全にロードされておらず、OnClick は次のように表示されます。
Name Value
FOnClick ($3,$6142210)
Code $3
Data $6142210
しかし、Assigned(FOnClick)
戻りますFalse
!!!!
だからif not CheckDefaults or (@Self.OnClick=nil) then
より良いテストになるだろう