まず、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;
> 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;
> 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;
すいません2度送信してしまいました。
Basserさん、ありがとうございました。
動作できるようになりました。
おっしゃるとおりです。
何か勘違い(思い込み?)してたみたいです。
ツイート | ![]() |