0

シンプル モードまたはアドバンス モードで実行できるアプリケーションがあります。違いは、表示されるメイン メニュー エントリです。問題は、RAD Studio XE2 が dfm で設定された OnClick プロパティ値をサイレントに削除することです。これは、メイン メニュー > [ファイル] メニューの一部のメニュー項目を非表示にする手順を示しています。

手順:
1. Subversion からディスク上の新しいフォルダー (以前は存在しなかったフォルダー) へのフレッシュ チェックアウト。
2. メイン フォームの dfm ファイルと pas ファイルを notepad++ で開き、"OnClick = MenuItem_File1Click" 行が存在し、そのプロシージャ MenuItem_File1Click が pas ファイルのインターフェイスと実装に含まれていることを確認します。はい、すべて良さそうです。
3. RAD Studio XE2 でプロジェクトを開きます。
4. オブジェクト インスペクタの [ファイル] メニュー項目の OnClick プロパティが空白です。

FormShow で処理された他のメニュー項目がいくつかあり、それらは期待どおりに機能し、シンプル モードでは非表示になり、アドバンス モードでは表示されます。回避策は、MenuItem_File1Click 内の機能を FormShow に移動することでした。しかし、そもそもなぜそれが起こったのかを本当に理解したいと思っています。

誰でもこの動作を説明できますか? 他の誰かがこのようなものに出くわしましたか? プロシージャの名前をシステムのようなものではないものに変更しようとしましたが、IDEはとにかくそれを削除しました。

4

1 に答える 1

1

your Menu(または a Button) を に接続するとActionActionはこれらすべてのプロパティの制御を引き継ぐことになっています: 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 より良いテストになるだろう

于 2012-10-26T18:46:58.337 に答える