Użycie jednego menu kontekstowe dla wielu etykiet

0

mam kilka labelek do każdej z nich dołączyłem 1 i to samo popupmenu z jedną opcją kopiuj. Jak pobrać caption labelki na której kliknąłem i wybrałem opcję kopiuj. Jak zastąpić Label1.Caption w poniższym kodzie

procedure TForm1.kopiuj1Click(Sender: TObject);
var a : string;
begin
   Clipboard().AsText := Label1.Caption
end;
0

To chyba powinno wystarczyć:

 Clipboard().AsText := (Sender As Tlabel).Caption;
0

Niestety nie działa - jak kod jest w popupmenu - a właśnie chcę, żeby był w jednym miejscu

3

Tak powinno działać:

procedure TForm1.pmKopiujClick(Sender: TObject);
begin
  Clipboard.AsText := TLabel(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupComponent).Caption;
end;
0

dzięki, pięknie działa

0
artiii napisał(a):

mam kilka labelek do każdej z nich dołączyłem 1 i to samo popupmenu z jedną opcją kopiuj. Jak pobrać caption labelki na której kliknąłem i wybrałem opcję kopiuj. Jak zastąpić Label1.Caption w poniższym kodzie

W OnContextPopup zapamietaj sobie, ktora labelka wywolala popupa, a nastepnie z niej kopiuj.

0

@Rodmir - Sender w tym zdarzeniu nie jest etykietą, a itemem menu, więc rzutowanie na TLabel nie zadziała i wywali wyjątek klasy EInvalidCast; Gdybyś wykonał standardowe rzutowanie, to dostałbyś wyjątek klasy EAccessViolation;

Dlatego podane przez @kAzek rozwiązanie jest najprostsze, najkrótsze i najbezpieczniejsze, bo kolejne rzutowania wykonywane są na instancjach właściwych klas; Aby dojść do takiego rozwiązania, wystarczyło otworzyć sobie pomoc środowiska i przeglądnąć listę właściwości i metod, ale pytacz tego nie zrobił;

W przyszłości jednak sugeruję więcej samodzielnych działać oraz posiłkowanie się Google; Wystarczy wpisać odpowiednią frazę - drugi link na liście wyników zawiera rozwiązanie poruszanego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1