0

私はフォームにポップアップメニューコントロールを持っています(grr、私はおそらくそれを動的にするつもりです-静的ツールを嫌います)。サブメニュー付きのアイテムがあります。SubMenuには3つのメニュー項目(TMenuItemクラス)があります。

プロシージャがSubMenuのItemまたはSubMenuItemsによって呼び出されたときはいつでも、if..thenステートメントでSenderparamを使用して確認する必要があります。

型キャストとスーパークラスの操作でさまざまなvraiationを試しましたが、うまくいきませんでした。私はこのようなことが可能だと思います:

if FindControl(MenuItemWithSubMenu.Handle) = TControl(Sender as TComponent).Parent then ...

しかし、もちろん、正しい型キャストとコマンドを使用します。

どんなアイデアでもありがたいです。

コミュニティのリクエストによる追加情報:

コードitsef(単にコンポーネント名propで確認した場合)は次のようになります。

procedure TForm1.xClick(Sender: TObject); // procedure that has attached onClick from    PopupActionBar1 Items
begin    
if ((TComponent(Sender).Name = 'Unloadresources1') or  // PopupActionBar1.Items[3]
     (TComponent(Sender).Name = 'VKPCache11')       or // PopupActionBar1.Items[3].Items[0]
     (TComponent(Sender).Name = 'VKPCache21')       or // PopupActionBar1.Items[3].Items[1]
     (TComponent(Sender).Name = 'AllCache31')       or // PopupActionBar1.Items[3].Items[2]
     (ActLoadVal = 2)) and (PopupActionBar1.Items[3].Caption = 'Delete VKP Cache') then begin .. end;
end;

問題は、それが弱いアプローチへの道であり、プログラムユーザーが実行時にコンポーネントまたはコントロールまたはオブジェクトを追加/ドラッグアンドドロップ/挿入したい場合は追加のコーディングが必要になることです。このようにして、プログラム自体が私の代わりに自動的に半分の仕事をします-何をいつ呼び出すかを知っています:)

On(static)Form1は(static)PopupActionBar1です。4つのアイテムがあります。4番目のアイテムにはサブメニューがあります-3つのアイテムがあります。

サブメニュー項目を含む4番目の項目(PopupActionBar1.Items [3])と3つのサブメニュー項目(PopupActionBar1.Items [3] .Items [0 .. 2] OnClickイベントハンドラーは、上記のIf..Thenステートメントを含むプロシージャに設定されます。

タスク-Senderパラメーターを評価し、そのOOP機能を使用して-ProcedureがPopupActionBar1.Items [3]メニュー項目またはそのサブメニュー項目(PopupActionBar1.Items [3] .Items[0]またはPopupActionBar1.Items[3])から呼び出されたかどうかを確認します.Items[1]またはPopupActionBar1.Items[3].Items [2])。

私はさまざまな構文を試しました...TControl、TWinControl、TComponentを使用した型キャスト操作も試しました..(TObjectを使用しない場合は、親がないため(OLEを除く)..

4

1 に答える 1

2

あなたはアイテムを見つける必要はありません、それはすでに送信者です。つまり、あなたはできる

procedure TForm1.MyItem1Click(Sender: TObject);
begin
  if Sender = MyItem1 then
    [...]
  else if Sender = MyItem2 then

私は通常、タグプロパティを使用して、ハンドラーをトリガーしたMenuItemを区別します。エレガントではありませんが、機能します。

procedure TForm1.Item1Click(Sender: TObject);
begin
  case TMenuItem(Sender).Tag of
    0: [..];
    1: [..];
    [..]

すべてのメニュー項目のOnClickイベントを、同じハンドラーを指すように設定することを忘れないでください。これは、クリックしても効果がないことがわかるまで覚えていません。

于 2010-01-24T11:57:14.783 に答える