Announcement

Collapse
No announcement yet.

Probleme mit TPopupMenu im ActiveX

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

  • Probleme mit TPopupMenu im ActiveX

    Hallo,
    habe mit TActiveForm in Delphi 5 Professional ein ActiveX erstellt.In die Form ist ein Popupmenu eingebetet, welches über rechten Mausklick auf
    die Form aktiviert wird.Beim ausführen im Browser (IE 5) funktioniert alles.Doch öffne ich nun ein zusätzliches Browser Fenster mit diesem ActiveX funtkioniert dort das Popupmenu nicht mehr.
    Wer hat hierfür ein Erklärung bzw. Lösung?

  • #2
    Hallo,

    >..das Popupmenu nicht mehr. Wer hat hierfür ein Erklärung ..

    alle Fenster- und Menü-Handles sind in Win32 nur in dem Thread gültig, der diese Ressourcen angefordert hat. Wenn ein ActiveForm in einer zweiten Internet Explorer 5-Instanz ausgeführt wird, lässt der IE5/6 die gleiche Instanz in einem zweiten Thread zusätzlich laufen. Die Delphi-interne Implementierung eines ActiveForm hat daher nur bis zum IE 4 funktioniert (dort konnte man auf Wunsch separate IE-Instanzen je Objekt anfordern). Meines Wissens nach hat Borland aber bisher keine Anpassungen vorgenommen, damit das Ganze auch ab dem IE 5 funktioniert

    Comment


    • #3
      Danke an Andreas Kosch für die schnelle Antwort!
      Durch den Hinweis konnte ich eine Lösung für das Problem finden.Das ganze funtioniert, wenn man jedesmal beim Aufruf des Popupmenü das Popup-Objekt erstellt.Sobald das Popupmenü aber wieder ausgeblendet wird muß es wieder freigegeben werden.Dies habe ich durch das abfangen von Windows Messages mit Hilfe der API-Funtion PeekMessage realisiert.
      Hier ist der Quellcode der Funktion die durch das Ereignis OnContextPopup der ActiveForm aufgerufen wird:

      procedure TtestActiveX2.ActiveFormContextPopup(Sender: TObject;
      MousePos: TPoint; var Handled: Boolean);
      var
      Pophandle : HWND;
      ClientHandle : HWND;
      Msg : tagMsg;
      CursorPos : TPoint;
      begin
      MyPopupmenu:=TMyPopupmenu.Create(self);
      // Itemliste erstellen und dem Popup hinzufügen //
      NewItem:= TMenuItem.Create(self);
      NewItem.caption:='Option1';
      NewItem.OnClick:=OnPopMTestClick; // Eventhandler zuweisen
      MyPopupmenu.Items.Add(NewItem);

      NewItem:= TMenuItem.Create(self);
      NewItem.caption:='Option2';
      NewItem.OnClick:=OnPopMTestClick; // Eventhandler zuweisen
      MyPopupmenu.Items.Add(NewItem);

      NewItem:= TMenuItem.Create(self);
      NewItem.caption:='Option3';
      NewItem.OnClick:=OnPopMTestClick; // Eventhandler zuweisen
      MyPopupmenu.Items.Add(NewItem);

      // Position des Cursors ermitteln
      windows.GetCursorPos(CursorPos);
      // Popupmenu an der Stelle des Cursors öffnen
      MyPopupmenu.Popup(CursorPos.x,CursorPos.y);
      // Handle des Popups ermittlen
      Pophandle:=MyPopupmenu.WindowHandle;
      // ClientHandle ermitteln
      ClientHandle:=self.clienthandle;

      // Auf Messages in der message queue reagieren
      if windows.PeekMessage(Msg,ClientHandle,0,0,PM_NOREMO VE) then begin
      case Msg.message of
      WM_Paint: // dient zum reagieren auf Mausklicks außerhalb des
      begin // Browser-Fensters
      MyPopupmenu.free;
      end;
      end; // end case
      end; // end if

      // Auf Messages in der message queue des Popupmenüs reagieren
      if windows.PeekMessage(Msg,Pophandle,WM_NCLBUTTONDOWN ,WM_RBUTTONDOWN,PM_NOREMOVE) then begin
      case Msg.message of
      WM_LBUTTONDOWN: // Mausklick "links" innerhalb der ClientArea im Browser
      begin
      MyPopupmenu.Free;
      end;
      WM_RBUTTONDOWN: // Mausklick "rechts" innerhalb der ClientArea im Browser
      begin
      MyPopupmenu.Free;
      end;
      WM_NCLBUTTONDOWN: // Mausklick "links" außerhalb der ClientArea im Browser
      begin
      MyPopupmenu.Free;
      end;
      WM_NCRBUTTONDOWN: // Mausklick "rechts" außerhalb der ClientArea im Browser
      begin
      MyPopupmenu.Free;
      end;
      end; // end case
      end; // end if
      end;

      // Diese Funtion wird aufgerufen wenn ein Menüpunkt im Popupmenü
      // ausgewählt wird.
      procedure TtestActiveX2.OnPopMTestClick(Sender: TObject);
      begin
      MyPopupmenu.Free;
      ShowMessage('Test');
      end;

      Das Umständliche an dieser Lösung ist jedoch leider, daß man in jeder Funktion die durch einen Menüpunkt im Popup aufgerufen wird das Popup freigeben muß.Wichtig ist hierbei auch das dies gleich zu Anfang geschieht.Eine bessere Alternative konnte ich bis jetzt leider nicht finden.Denn gibt man das Popupmenü schon vorher frei, wird die Funtkion nicht mehr aufgerufen

      Comment

      Working...
      X