![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 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 by Thomas Breitkreuz