AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Popup/Contextmenü bleibt leer

Ein Thema von Orakel-von-Delphi · begonnen am 28. Feb 2012 · letzter Beitrag vom 21. Mai 2012
Antwort Antwort
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#1

Popup/Contextmenü bleibt leer

  Alt 28. Feb 2012, 20:20
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
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#2

AW: Popup/Contextmenü bleibt leer

  Alt 21. Mär 2012, 17:02
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 ).

MfG Dalai
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Popup/Contextmenü bleibt leer

  Alt 21. Mär 2012, 17:21
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.853 Beiträge
 
Delphi 12 Athens
 
#4

AW: Popup/Contextmenü bleibt leer

  Alt 21. Mär 2012, 17:34
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...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#5

AW: Popup/Contextmenü bleibt leer

  Alt 21. Mär 2012, 18:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#6

OwnerDrawn ?

  Alt 22. Mär 2012, 09:58
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 ???
Michael
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 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