Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Popup/Contextmenü bleibt leer (https://www.delphipraxis.net/166777-popup-contextmenue-bleibt-leer.html)

Orakel-von-Delphi 28. Feb 2012 19:20

Popup/Contextmenü bleibt leer
 
Hallo !

Ich betreue seit kurzer Zeit ein ziemlich großes Projekt, dass in Delphi 5 geschrieben ist. Es läuft auf Windows 7 Clients. Es gibt dabei allerdings ein kleines Problem mit den Popups/Contextmenüs, weil es auf einigen Arbeitsplätzen immer mal wieder beim Öffnen leer bleibt.

http://softwaremacher.de/images/context_empty_001.jpg

Einer der Entwickler hat schon einen Versuch unternommen und den WM_ENTERMENULOOP eingefangen und über eine boolsche Variable (Flip-Flop) das Öffnen des Popups manuell gesteuert. Bringt aber offensichtlich nichts.

Kennt jemand das Problem - und noch wichtiger: Die Lösung ?

Grüße Michael

Dalai 21. Mär 2012 16:02

AW: Popup/Contextmenü bleibt leer
 
Hast du mal versucht, die Anwendung unter Einbindung eines Manifests zum Einschalten der Themes zu kompilieren? Ggf. auch den ThemeManager einbinden, damit wirklich alle Komponenten erfasst werden. Ich hatte bislang noch keine derartigen Probleme mit Kontextmenüs unter Win7 bei mit Delphi 5 kompilierten Anwendungen (dafür aber andere :roll:).

MfG Dalai

shmia 21. Mär 2012 16:21

AW: Popup/Contextmenü bleibt leer
 
Läuft das Programm zufällig auf einem Windows Server mit Citrix-Aufsatz wobei Windows 7 für die Client Rechner verwendet werden??
Falls ja, wäre die Ursache ein Resourcenmangel des Servers.

jaenicke 21. Mär 2012 16:34

AW: Popup/Contextmenü bleibt leer
 
Das Problem hat die Freeware explorerxp unter Windows 7 auch. Und Windows hatte zu dem Zeitpunkt garantiert genug Ressourcen. ;-)

Eine Lösung habe ich aber leider nicht gefunden, daher blieb für das Programm nur Ablage P...

Dalai 21. Mär 2012 17:48

AW: Popup/Contextmenü bleibt leer
 
Zitat:

Zitat von jaenicke (Beitrag 1157803)
Das Problem hat die Freeware explorerxp unter Windows 7 auch.

In der Tat. Damit kann ich es auch reproduzieren. Lustigerweise ist das Programm mit Visual C++ 7.0 entwickelt, wenn ich PEiD glauben darf. Insofern beschränkt sich das Problem nicht auf Delphi-Programme und ist wohl auch nicht unbedingt bei den Themes zu suchen (ExplorerXP verwendet welche).

Daher ein anderer Ansatz: sind die Menüs evtl. OwnerDrawn?

MfG Dalai

Orakel-von-Delphi 22. Mär 2012 08:58

OwnerDrawn ?
 
Teilweise wird OwnerDrawn verwendet, aber in der Regel nicht.

Ich habe schon überlegt, ob ein Handling wie dieses etwas bringen könnte:
Code:
unit Dialog;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ExtCtrls, StdCtrls, syncobjs;

type
  TEnterExitDia = class(TForm)
    mmInfo: TMemo;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    popDia: TPopupMenu;
    PopupMenu1: TPopupMenu;
    PopupMenu2: TPopupMenu;
    PopupMenu3: TPopupMenu;
    Neu1: TMenuItem;
    Oeffnen1: TMenuItem;
    Neu2: TMenuItem;
    Neu3: TMenuItem;
    Oeffnen2: TMenuItem;
    Info1: TMenuItem;
    btnAll: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnAllClick(Sender: TObject);
  private
    { Private-Deklarationen }
    evPopAvail : TEvent;
    OldPopupListWndProc: TFNWndProc;
    NewPopupListWndProc: TFNWndProc;
    fPopupOpen : Boolean;
    procedure PopupListWndProc(var Message: TMessage);
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.DFM}

procedure TEnterExitDia.PopupListWndProc(var Message: TMessage);
begin
  with Message do
  begin
    case Msg of
      WM_ENTERMENULOOP:
        if evPopAvail.WaitFor(0) = wrSignaled then
          begin
           evPopAvail.ResetEvent();
          end
        else
          begin
           mmInfo.Lines.Add('Attention: NOT signaled !');
           Exit;
          end;
      WM_EXITMENULOOP:
        evPopAvail.SetEvent();
    end;
   Result := CallWindowProc(OldPopupListWndProc, PopupList.Window, Msg, WParam, LParam);
  end;
end;

procedure TEnterExitDia.FormCreate(Sender: TObject);
begin
  evPopAvail := TEvent.Create(nil, True, True, Format('%s-%d', [self.Classname, self.Handle]));
  mmInfo.Lines.Add(Format('Event ''%s-%d'' created.', [self.Classname, self.Handle]));
  NewPopupListWndProc := MakeObjectInstance(PopupListWndProc);
  OldPopupListWndProc := TFNWndProc(GetWindowLong(PopupList.Window, GWL_WNDPROC));
  SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(NewPopupListWndProc));
end;

procedure TEnterExitDia.FormDestroy(Sender: TObject);
begin
  SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(OldPopupListWndProc));
  evPopAvail.Free();
end;

procedure TEnterExitDia.btnAllClick(Sender: TObject);
begin
  // Try to open more than one Popup at once ...
  PostMessage(self.Handle, WM_RBUTTONDOWN, MK_RBUTTON, 0);
  PostMessage(self.Handle, WM_RBUTTONUP, MK_RBUTTON, 0);

  PostMessage(Panel1.Handle, WM_RBUTTONDOWN, MK_RBUTTON, 0);
  PostMessage(Panel1.Handle, WM_RBUTTONUP, MK_RBUTTON, 0);

  PostMessage(Panel2.Handle, WM_RBUTTONDOWN, MK_RBUTTON, 0);
  PostMessage(Panel2.Handle, WM_RBUTTONUP, MK_RBUTTON, 0);

  PostMessage(Panel2.Handle, WM_RBUTTONDOWN, MK_RBUTTON, 0);
  PostMessage(Panel2.Handle, WM_RBUTTONUP, MK_RBUTTON, 0);
end;

end.
Das Example funktioniert natürlich einwandfrei. Ob es sich lohnt, dieses Handling in das große Projekt einzubauen ???

Dalai 23. Mär 2012 00:58

AW: Popup/Contextmenü bleibt leer
 
Ich verstehe nicht, was dieser Code tun und was er bringen soll. Ich würde erstmal prüfen, ob es ein generelles Problem mit Programmen gibt, die mit demselben Delphi kompiliert wurden. Wenn dem so ist: Sind alle Updates für Delphi installiert? Wie gesagt: ich habe keine derartigen Probleme mit meinen in Delphi 5 geschriebenen Programmen unter Win7 (und auch nicht unter Win8).

Im Zweifel kann man auch auf andere Komponenten ausweichen wie z.B. Toolbar2000, die ich mir gerade wegen anderer Eigenheiten von PopupMenus installiert habe. Bestandteil der ToolBar2000 ist ein TTBPopupMenu; konvertieren lassen sich bestehende TPopupMenus auch (hat eine entsprechende Funktion). Aber wie gesagt: erstmal prüfen, ob es generell nicht geht oder ob nur die fragliche Anwendung dieses Verhalten zeigt. Und selbst dann kann man noch untersuchen, ob vor dem Popup noch irgendetwas gemacht wird, was evtl. stört.

MfG Dalai

Orakel-von-Delphi 24. Mär 2012 08:36

AW: Popup/Contextmenü bleibt leer
 
Was der Code macht ist doch einfach zu verstehen. Durch das Event-Objekt ist ein Mechanismus implementiert, der sicher verhindert, dass der Versuch unternommen werden kann 2 Popups gleichzeitig (bspw. durch einen Thread o.ä.) zu öffnen. Die Frage ist nur, ob dieses überhaupt die Ursache ist.

Dalai 24. Mär 2012 13:41

AW: Popup/Contextmenü bleibt leer
 
Zitat:

Zitat von Orakel-von-Delphi (Beitrag 1158256)
Durch das Event-Objekt ist ein Mechanismus implementiert, der sicher verhindert, dass der Versuch unternommen werden kann 2 Popups gleichzeitig (bspw. durch einen Thread o.ä.) zu öffnen.

Gibt's das Problem denn im fraglichen Programm? Ich mein, via Rechtsklick kann man doch eh nur ein Popup gleichzeitig auslösen, wenn man der Eigenschaft PopupMenu der Form vertraut und nicht selber auf solche Ereignisse reagiert.

Zitat:

Die Frage ist nur, ob dieses überhaupt die Ursache ist.
Ja, die Klärung der Frage hab ich ja oben schon erläutert. Und bevor ich mir eine solche Arbeit machte, würde ich das genauer untersuchen.

MfG Dalai

Orakel-von-Delphi 25. Mär 2012 10:24

Fremdkomponenten
 
Wenn Du den Screenshot (http://softwaremacher.de/images/context_empty_001.jpg) einmal ansiehst, erkennst Du, dass das Popupmenü zwar rudimentär angezeigt wird, aber keine Inhalte hat und auch nicht mehr reagiert. Alle anderen Funktionen der GUI stehen nämlich weiter zur Verfügung und führen auch nicht dazu, dass der Popup wieder automatisch schließt. Irgend etwas "stört" das normale Handling massiv. Wenn das Programm nicht vom User geschlossen wird, gibt es einen Programmabsturz.
Das Projekt nutzt jede Menge Fremdkomponenten (Adonis Component Suite, CoolControls, Dream Outbar, Dream Component Collection, ExpressQuantumGrid, ExpressBars, ExpressForum, INDY, JEDI Code Library, TMS Component Pack, TreeNT-Component und Microsoft MS-XML Type Library), von denen einige schon überhaupt nicht mehr Verfügbar sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz