Announcement

Collapse
No announcement yet.

Problem mit PopupMenu

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit PopupMenu

    Hallo Gemeinde,

    in meinem Programm erzeuge ich zur Laufzeit ein bzw. mehrere Objekte/Instanzen (in diesem Bsp. MyLabeledLED).
    Sind diese LED's nun auf dem Formular zu sehen, kann man diese umherschieben, "anknipsen", etc.
    Zusätzlich erzeuge ich dynamisch ein PopupMenu, wenn man auf die LED mit der rechten Maustaste drückt.
    Folgendes Problem.

    Klicke ich mit ssRight auf LED1 (und es ist noch keine weitere LED vorhanden), ist alles OK.
    Sind aber mehrere LED's vorhanden und ich klicke wieder mit ssRight auf LED1, so erscheint das PopupMenu an der zuletzt erstellten LED und nicht bei LED1.

    Hat jemand eine Ahnung, was ich verkehrt mache?
    Anbei der Code.

    Danke und Grüsse
    Peter

    <

    // Hier wird die LED erzeugt
    procedure TForm2.NeueClick(Sender: TObject);
    begin
    inc(MyCounter);
    MyLabeledLED := TLabeledLED.Create(Self);
    with MyLabeledLED do
    begin
    Name := 'LabeledLED'+IntToStr(MyCounter);
    Parent := Self;
    Left := 416;
    Top := 88;
    LedStyle := lstSquare;
    LEDColor := lctGreen;
    LEDLabel.Width := 39;
    LEDLabel.Height := 13;
    LEDLabel.Caption := 'LED';
    OnMouseDown := MyMouseDown;
    end;
    MyLabeledLED.Show;
    end;

    // Hier wird das PopUpMenu erzeugt
    procedure TForm2.MyMouseDown(Sender: TObject;
    Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
    i: Integer;
    MyPopupMenu: TPopupMenu;
    MyNamen: TMenuItem;
    MyN: TMenuItem;
    MyLoeschen: TMenuItem;
    begin
    inherited MouseDown(Button, Shift, X, Y);
    if Shift = [ssRight] then begin
    for i:= 0 to ComponentCount -1 do begin
    if Components[i] is TPopupMenu then begin
    Components[i].Destroy;
    Break;
    end;
    end;
    MyPopupMenu := TPopupMenu.Create(Self);
    MyNamen := TMenuItem.Create(MyPopupMenu);
    MyPopupMenu.Items.Add(MyNamen);
    MyN := TMenuItem.Create(MyPopupMenu);
    MyPopupMenu.Items.Add(MyN);
    MyLoeschen := TMenuItem.Create(MyPopupMenu);
    MyPopupMenu.Items.Add(MyLoeschen);
    MyLabeledLED.PopupMenu:= MyPopUpMenu;
    with MyPopupMenu do
    begin
    Name := 'PopupMenu'+IntToStr(MyCounter);
    end;
    with MyNamen do
    begin
    Name := 'Namen'+IntToStr(MyCounter);
    Caption := 'Namen '#228'ndern';
    // OnClick := Namen1Click;
    end;
    with MyN do
    begin
    Name := 'N1'+IntToStr(MyCounter);
    Caption := '-';
    end;
    with MyLoeschen do
    begin
    Name := 'Loeschen'+IntToStr(MyCounter);
    Caption := 'L'#246'schen';
    // OnClick := Loeschen;
    end;
    X:= X+Unit1.Form1.GetXPos;
    X:= X+MyLabeledLED.Left;
    Y:= Y+Unit1.Form1.GetYPos;
    Y:= Y+MyLabeledLED.Top;
    MyPopUpMenu.Popup(x,y);
    end;
    end;
    >

  • #2
    Hallo zusammen,

    ich bin der Ursache schon ein bisschen näher gekommen.
    Da ich MyLabeledLED global deklariert habe, wird auch die zuletzt
    erzeugte LED als "Basis" für's PopupMenu hergenommen.
    Nun aber meine Frage:

    Wie bekomme ich heraus, auf welcher LED ich die rechte Maustaste geklickt habe?

    Ich hoffe, Ihr könnt mir helfen. Danke!

    Grüsse Pete

    Comment


    • #3
      Hallo zusammen,

      ich hab's gefunden:

      procedure TForm2.MyMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
      var
      ...
      MyLabeledLED1: TLabeledLED;
      begin
      MyLabeledLED1:= TLabeledLED(Sender);
      ...
      und dann mit MyLabeledLED1 weiterarbeiten
      end;

      Grüsse Pete

      Comment


      • #4
        Hallo,

        ich hatte mal ein ähnliches Problem mit falscher Position des Popup-Menüs auf einem Grid:

        procedure TFrm.m_GridMouseUp(Sender: TObject;
        Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        var
        Point :Tpoint;
        begin
        if (Button = mbright) then
        begin
        point.X := x;
        Point.y := y;
        PopupMenu1.Popup(TCustomGrid(Sender).Clienttoscree n(Point).X, TCustomGrid(Sender).Clienttoscreen(Point).Y);
        end;
        end;

        Das sollte helfen...

        Grüße

        Juli

        Comment

        Working...
        X