Newsgroup: it.comp.lang.delphi
Titolo: rimuovere un item dal popupmenu

Dunque... riesco facilmente ad aggiungere a run-time più item ad un
TPopupMenu... il problema è che non riesco ad eliminare l'item selezionato
con il click del mouse semplicemente perchè non riesco a trovare un evento
OnClick "generico" che viene generato quando clicco sopra un item qualunque!
per farmi capire meglio supponiamo di aggiungere 5 item al TPopupMenu:
Voce 1
Voce 2
Voce 3
Voce 4
Voce 5
con il mouse, ad esempio, clicco sulla terza e desidero eliminarla...
il problema è che l'oggetto
TPopupMenu non genera un evento "Click" su un oggetto creato a run time...
ragazzi help me :)))
--
Max Etere
massimili...@programmando.org
http://www.programmando.org

 TPopupMenu non genera un evento "Click" su un oggetto creato a run time...
Inserisci nell'evento OnClick dei vari TMenuItem che aggiungi una unica
routine per tutti. Tipo:
Procedure TForm1.ItemClick(Sender: TObject);
begin
TMenuItem(Sender).free;
end;
IN un mio programma creo a RunTime un PopupMenu con i vari TMenuItem e
l'OnClick funziona bene.
Ciao.
Giuseppe

 routine per tutti. Tipo:
uhm...  non mi è chiara una cosa... se gli item li genero a RunTime come
faccio ad aggiungere una routine come mi consigli tu?
Scusa ma non c'ho capito molto :)))))


 end;
  Sbaglio o questo codice ti genera un Access Violation?
A.S.

 Scusa ma non c'ho capito molto :)))))
Vedi help: "Adding a TMenuItem to a Popup menu at runtime example"
da cui riporto stralcio:
procedure TForm1.AddButtonClick(Sender: TObject);
var
  index: Integer;
  NewItem: TMenuItem;
begin
  for index := 0 to 3 do
  begin
    NewItem := TMenuItem.Create(PopupMenu1); // create the new item
    PopupMenu1.Items.Add(NewItem);// add it to the Popupmenu
    NewItem.Caption := 'Menu Item ' + IntToStr(index);
    NewItem.Tag := index;
    NewItem.OnClick = PopupMenuItemsClick;// assign it an event handler
  end;
end;
dove PopupMenuItemsClick sara' un opportuno metodo (ad esempio della
form cui e' associato il popupMenu) di tipo TNotifyEvent.
Saluti
Paolo Arosio

 da cui riporto stralcio:
Accidenti grazie!!!
Scusa ma sono idiota io che per sbaglio prendendo lo stesso esempio ho
eliminato distrattamente proprio la riga:
     NewItem.OnClick := PopupMenuItemsClick;// assign it an event handler
grazie ancora Paolo!  :)))


 faccio ad aggiungere una routine come mi consigli tu?
Procedure TForm1.TuaAggiunta;
Var
a: integer;
i: TMenuItem;
begin
for a:= 0 to 4 do
begin
i:= TMenuItem.Create(TuoPopup);
i.Caption := 'Voce '+ IntToStr(a+1);
i.OnClick:= TuaRoutine;
TuoPopup.Items.add(i);
end;
end;
Procedure TForm1.TuaRoutine(Sender: TObject);
begin
// Qui puoi metterci quello che vuoi...
// tranne quello che ti scrissi ieri,
// fatto notare da Alessandro
// C'è comunque il modo di farlo
// Come ti spiego ora
// Qui Mandi un messaggio alla tua form
PostMessage(Handle, WM_User, 0, Longint(Sender));
end;
INserisci questa dentro la tua Form principale
procedure TuaCancellazione(var message:tmessage); Message wm_user;
Puoi predisporre un altro messaggio diverso da WM_User. I possibili valori
che puoi usare, semplici Word, vanno da $0400, il WM_User, a $3FFF.
Ad esempio
Const
AM_MioMessaggio = WM_User+ $100;
IL codice della Procedura che riceve il messaggio sarà:
procedure TForm1.TuaCancellazione(var message:tmessage);
begin
TMenuItem(Message.LParam).free;
end;
C'è da dire che se non hai la necessità di distruggere l'item, ma ti basta
nasconderlo, ti converrà usare la proprietà Visible, eventualmente anche
Enabled, nella routine attaccata all'ONClick dell'item. Ti eviti di
smessaggiare con la tua Form.
Ciao.
Giuseppe

 smessaggiare con la tua Form.
lo devo distruggere e mi hai consigliato bene :))))
grazie!
