PopupMenu の処理を共通にするには?

解決


クラリス  2005-11-17 01:15:44  No: 18741

まず、ListBox1、ListBox2 をフォームに貼り付け、
各 Click イベントに ComponentsClick を設定します。
次に、PopupMenu1、PopupMenu2 をフォームに貼り付け、
ListBox1 の PopUpMenu プロパティに PopupMenu1
ListBox2 の PopUpMenu プロパティに PopupMenu2
を設定します。
PopMenu1、PopMenu2 にMenuItem を作成します。
    PopMenu1 は Show1: TMenuItem(Caption=Show)
    PopMenu2 は Show2: TMenuItem(Caption=Show)
ListBox1、ListBox2、Show1、Show2 それぞれの
Click イベントに ComponentsClick を設定します。
以上で設定を終わります。

ListBox1、ListBox2 にはあらかじめデータを設定しておき、
ListBox1をクリックすすると、
アドレスの読込違反が発生します。

おかしいのは
設定時の TListBox(Sender) と
取得時の TListBox(TPopupMenu(Sender).PopupComponent)が
違っているからですが、
なぜ、このような現象になるのか、
また、正常に動作するにはどうすればよいのか教えてください。

procedure TForm1.ComponentsClick(Sender: TObject);
var
  ListBoxCompo:  TListBox;
begin
  if          (Sender = ListBox1) or
              (Sender = ListBox2) then begin
    TListBox(Sender).PopupMenu.PopupComponent := TListBox(Sender);
    TListBox(Sender).PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  end else if (Sender = Show1) or
              (Sender = Show2) then begin
    ListBoxCompo := TListBox(TPopupMenu(Sender).PopupComponent);
    if ListBoxCompo.ItemIndex >= 0 then begin
      ShowMessage(ListBoxCompo.Items[ListBoxCompo.ItemIndex]);
    end;
  end
end;


Basser  2005-11-17 02:34:19  No: 18742

>    ListBoxCompo := TListBox(TPopupMenu(Sender).PopupComponent);

ここが間違っています。
Sender は TPopupMenu ではなく、TMenuItem です。

下記のコードで動作します。

procedure TForm1.componentClick(Sender: TObject);
var
  APopupMenu: TPopupMenu;
  AListBox  : TListBox;
begin
  if (Sender is TListBox) then
  begin
    TListBox(Sender).PopupMenu.PopupComponent:= TListBox(Sender);
    TListBox(Sender).PopupMenu.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
  end
  else if (Sender is TMenuItem) then
  begin
    APopupMenu:= TPopupMenu(TMenuItem(Sender).GetParentMenu);
    if Assigned(APopupMenu) then
    begin
      AListBox:= TListBox(APopupMenu.PopupComponent);
      if Assigned(AListBox) and (AListBox.ItemIndex >= 0) then
        ShowMessage(AListBox.Items[AListBox.ItemIndex]);
    end;
  end;
end;


Basser  2005-11-17 02:34:21  No: 18743

>    ListBoxCompo := TListBox(TPopupMenu(Sender).PopupComponent);

ここが間違っています。
Sender は TPopupMenu ではなく、TMenuItem です。

下記のコードで動作します。

procedure TForm1.componentClick(Sender: TObject);
var
  APopupMenu: TPopupMenu;
  AListBox  : TListBox;
begin
  if (Sender is TListBox) then
  begin
    TListBox(Sender).PopupMenu.PopupComponent:= TListBox(Sender);
    TListBox(Sender).PopupMenu.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
  end
  else if (Sender is TMenuItem) then
  begin
    APopupMenu:= TPopupMenu(TMenuItem(Sender).GetParentMenu);
    if Assigned(APopupMenu) then
    begin
      AListBox:= TListBox(APopupMenu.PopupComponent);
      if Assigned(AListBox) and (AListBox.ItemIndex >= 0) then
        ShowMessage(AListBox.Items[AListBox.ItemIndex]);
    end;
  end;
end;


Basser  2005-11-17 02:35:39  No: 18744

すいません2度送信してしまいました。


クラリス  2005-11-18 21:17:30  No: 18745

Basserさん、ありがとうございました。

動作できるようになりました。
おっしゃるとおりです。
何か勘違い(思い込み?)してたみたいです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加