AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Popup/Contextmenü bleibt leer

Ein Thema von Orakel-von-Delphi · begonnen am 28. Feb 2012 · letzter Beitrag vom 21. Mai 2012
Antwort Antwort
Seite 1 von 2  1 2   
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.679 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.288 Beiträge
 
Delphi 11 Alexandria
 
#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
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 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
Benutzerbild von Dalai
Dalai

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

AW: Popup/Contextmenü bleibt leer

  Alt 23. Mär 2012, 01:58
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
  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
 
#8

AW: Popup/Contextmenü bleibt leer

  Alt 24. Mär 2012, 09:36
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.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

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

AW: Popup/Contextmenü bleibt leer

  Alt 24. Mär 2012, 14:41
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
  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
 
#10

Fremdkomponenten

  Alt 25. Mär 2012, 11:24
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.
Michael
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:18 Uhr.
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