![]() |
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. ![]() 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 |
AW: Popup/Contextmenü bleibt leer
Hast du mal versucht, die Anwendung unter Einbindung eines Manifests zum Einschalten der Themes zu kompilieren? Ggf. auch den
![]() MfG Dalai |
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. |
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... |
AW: Popup/Contextmenü bleibt leer
Zitat:
Daher ein anderer Ansatz: sind die Menüs evtl. OwnerDrawn? MfG Dalai |
OwnerDrawn ?
Teilweise wird OwnerDrawn verwendet, aber in der Regel nicht.
Ich habe schon überlegt, ob ein Handling wie dieses etwas bringen könnte:
Code:
Das Example funktioniert natürlich einwandfrei. Ob es sich lohnt, dieses Handling in das große Projekt einzubauen ???
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. |
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 |
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.
|
AW: Popup/Contextmenü bleibt leer
Zitat:
Zitat:
MfG Dalai |
Fremdkomponenten
Wenn Du den Screenshot (
![]() 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. |
AW: Popup/Contextmenü bleibt leer
Ob ein Subclassing dafür die richtige lösung ist (auch wenn es funktioniert) mag dahin gestellt sein.
Ich würde den Fehler bei der Wurzel packen und nach dem Übeltäter suchen bzw. dann lieber das popupmenu selber zeichnen als dieses zu verwenden das die Fehler verursacht. Irgenwo hängt das in einer Winproc(Fremdcomponente) Das verstehe ich auch nicht.
Delphi-Quellcode:
OldPopupListWndProc := TFNWndProc(GetWindowLong(PopupList.Window, GWL_WNDPROC));
warum nicht einfach
Delphi-Quellcode:
OldPopupListWndProc := pointer(GetWindowLong(PopupList.Window, GWL_WNDPROC));
![]() gruss |
AW: Fremdkomponenten
Zitat:
Zitat:
Zitat:
Ich kann mich nur wiederholen: ich würde erstmal ein dummes Testprogramm erstellen und prüfen, ob das Kontextmenü dort ebenso leer ist. Und dann Stück für Stück die im Problemprogramm benutzten Komponenten einbinden. Irgendwann sollte das Problem ja auftauchen. Und falls nicht, so kann man immernoch selber zeichnen (oder eine andere Komponente fürs PopupMenu benutzen). MfG Dalai |
AW: Popup/Contextmenü bleibt leer
Zitat:
Mit dem Subclassing pfuscht er irgendwo noch zusätztlich im programm herum der Fehler ist dahingehend aber nicht beseitigt. Es könnte ja wie in meinem Link beschrieben eine Kompo sein die Unicode nicht unterstützt. Zitat:
gruss |
Testprogramm
Zitat:
Zitat:
Zitat:
VG Michael |
Solved
Die ca. 15 - 20 Fremdkomponenten können nicht einfach aus mehreren 100.000 Zeilen Code entfernt werden.
Deshalb habe ich die oben angesprochene Mimik
Code:
im Hauptfenster der Applikation implementiert. Seitdem ist das Problem verschwunden. Der TEvent sorgt zusammen mit WM_ENTERMENULOOP und WM_EXITMENULOOP auf jeden Fall sicher dafür, dass nicht aus irgendwelchen Gründen (bspw. Hintergrund-Threads) zwei mal zur gleichen Zeit ein Popup aufgehen kann.
.
. procedure TMain.PopupListWndProc(var Message: TMessage); begin with Message do begin case Msg of WM_ENTERMENULOOP: if evPopAvail.WaitFor(0) = wrSignaled then begin evPopAvail.ResetEvent(); . <Subroutine mit Application.ProcessMessages> . end else begin Exit; end; WM_EXITMENULOOP: evPopAvail.SetEvent(); end; Result := CallWindowProc(OldPopupListWndProc, PopupList.Window, Msg, WParam, LParam); end; end; . . |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz