Re: Delphi -- fill popupmenu and select itemsPosted by webmaster Guido on November 02, 2001 at 18:32:23: In Reply to: fill popupmenu and select items posted by Stefan Loeners p12167 on November 01, 2001 at 09:34:42: : Could you please provide some sample code to populate a popupmenu with items from a listbox at runtime and how to get the caption of such an item when selected. -----
Let's suppose that we have a form with: The first menu-item should show the first item of the listbox, the second one shows the second listbox item, and so on... But what should we do if we allow the listbox to become empty? If we also empty the popup-menu, it won't pop up anymore. Therefore, I propose to always have at least one item in the popupmenu, and if the listbox is empty, we show a text in the first menu-item saying 'Click button to add items' or something similar.
Ok, let's code :)
procedure TForm1.MenuItem0Click(Sender: TObject); begin Label1.Caption := (Sender as TMenuItem).Caption; end; Or, if you want an empty string when the listbox is empty:
procedure TForm1.MenuItem0Click(Sender: TObject);
begin
if LB.Items.Count = 0 then
Label1.Caption := ''
else
Label1.Caption := (Sender as TMenuItem).Caption;
end;
Here's some code to add and remove items to the listbox:
procedure TForm1.btnAddItemClick(Sender: TObject);
begin
LB.Items.Add('Option ' + IntToStr(LB.Items.Count));
SyncMenuWithListbox;
end;
procedure TForm1.btnDeleteLastItemClick(Sender: TObject);
begin
if LB.Items.Count > 0 then begin
LB.Items.Delete(LB.Items.Count - 1);
SyncMenuWithListbox;
end;
end;
And finally, this code will synchronize the popupmenu and the listbox:
procedure TForm1.SyncMenuWithListbox;
var
NewItem: TMenuItem;
I: integer;
begin
// Synchronize the number of items, but...
// ...always leave one item in the popupmenu
while (PU.Items.Count > LB.Items.Count) and
(PU.Items.Count > 1) do
PU.Items.Delete(PU.Items.Count - 1); // delete last item
while PU.Items.Count < LB.Items.Count do begin
NewItem := TMenuItem.Create(Self);
NewItem.OnClick := MenuItem0Click;
PU.Items.Add(NewItem);
end;
// Show listbox items in menu-items
if LB.Items.Count = 0 then
PU.Items[0].Caption := 'Click button to add items'
else
for I := 0 to LB.Items.Count - 1 do
PU.Items[i].Caption := LB.Items[i];
end;
Tip for those of you that haven't worked with TPopupMenu yet: don't forget to set the form's property PopupMenu to the name of the popupmenu, so that the menu "pops up" with a right mouseclick on the form. |
|