Delphi-PRAXiS

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/)
-   -   Mysteriöser Hauptmenübefehl-Aufruf aus modalem Dialog reproduzierbar (Win 2008 Bug) (https://www.delphipraxis.net/159148-mysterioeser-hauptmenuebefehl-aufruf-aus-modalem-dialog-reproduzierbar-win-2008-bug.html)

mjustin 16. Mär 2011 08:40


Mysteriöser Hauptmenübefehl-Aufruf aus modalem Dialog reproduzierbar (Win 2008 Bug)
 
Hallo,

Dieser Stack Trace ist überraschend, denn er ist progammseitig nur möglich, wenn es gelingt aus einem modalen Dialog heraus einen Menüpunkt aufzurufen, der sich im Menü des dahinter liegenden (also inaktiven) Hauptformulars befindet.

Meine Frage ist, wie kann man diesen Fall gezielt reproduzieren? Da er relativ selten im Echteinsatz auftritt, und mir im manuellen Test (im Produktivsystem) mir noch nicht begegnet ist, überlege ich nun wie diesen Aufruf eines Menüpunktes nachbauen kann. Wenn ich auf den modalen Dialog einen Button setze, der eine passende Windows Message an den Menüpunkt sendet, würde der Menübefehl dann ausgeführt?

Die Fehlermeldung ist: Aus einem sichtbaren Fenster kann kein modales gemacht werden

Code:
main thread ($4c94):
004ffa88 +06c Ladelist.exe Forms                   TCustomForm.ShowModal      <--- Fehler
0052f4ff +0bb Ladelist.exe DB                      TDataSet.SetActive
008fc9a1 +089 Ladelist.exe u_ladeli        928 +16 TForm1.EditLoadingList     <--- gleicher modaler Dialog
008fbacd +085 Ladelist.exe u_ladeli        765 +11 TForm1.SearchShipmentClick <--- Klick auf Menüpunkt im dahinter liegenden Hauptformular der Anwendung
004d6e27 +0a7 Ladelist.exe Menus                   TMenuItem.Click
004d857f +0ef Ladelist.exe Menus                   DoClick
004d866b +087 Ladelist.exe Menus                   TMenu.IsShortCut
005001c1 +04d Ladelist.exe Forms                   TCustomForm.IsShortCut
004e8dc0 +068 Ladelist.exe Controls                TWinControl.IsMenuKey
004e8f89 +011 Ladelist.exe Controls                TWinControl.CNSysKeyDown
004e247e +2d2 Ladelist.exe Controls                TControl.WndProc
004e6983 +513 Ladelist.exe Controls                TWinControl.WndProc
004fb5e8 +594 Ladelist.exe Forms                   TCustomForm.WndProc
004e20a4 +024 Ladelist.exe Controls                TControl.Perform
004856e0 +014 Ladelist.exe Classes                 StdWndProc
004e609c +02c Ladelist.exe Controls                TWinControl.MainWndProc
004856e0 +014 Ladelist.exe Classes                 StdWndProc
772b00e3 +02b ntdll.dll                            KiUserCallbackDispatcher
008fc9a1 +089 Ladelist.exe u_ladeli        928 +16 TForm1.EditLoadingList      <-- öffnet modalen Dialog
008fadec +070 Ladelist.exe u_ladeli        504  +5 TForm1.OpenLoadingListClick
004d6e27 +0a7 Ladelist.exe Menus                   TMenuItem.Click
004d857f +0ef Ladelist.exe Menus                   DoClick
004d866b +087 Ladelist.exe Menus                   TMenu.IsShortCut
005001c1 +04d Ladelist.exe Forms                   TCustomForm.IsShortCut
004e8dc0 +068 Ladelist.exe Controls                TWinControl.IsMenuKey
004e8e0d +01d Ladelist.exe Controls                TWinControl.CNKeyDown
0067ead1 +03d Ladelist.exe cxControls              TcxControl.CNKeyDown
007b2351 +019 Ladelist.exe cxGridCustomView        TcxGridSite.CNKeyDown
004e247e +2d2 Ladelist.exe Controls                TControl.WndProc
004e885c +01c Ladelist.exe Controls                TWinControl.WMNCHitTest
004e247e +2d2 Ladelist.exe Controls                TControl.WndProc
004e6983 +513 Ladelist.exe Controls                TWinControl.WndProc
0067ef6c +11c Ladelist.exe cxControls              TcxControl.WndProc
007b2b1f +01b Ladelist.exe cxGridCustomView        TcxGridSite.WndProc
004e609c +02c Ladelist.exe Controls                TWinControl.MainWndProc
004856e0 +014 Ladelist.exe Classes                 StdWndProc
772b00e3 +02b ntdll.dll                            KiUserCallbackDispatcher
76973675 +010 kernel32.dll                         BaseThreadInitThunk

dataspider 16. Mär 2011 09:24

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Hi,

ich habe keine Ahnung, ob es das Gleiche ist.
Ich hatte diesen Fehler auch mal bei einem Toolbarbutton (Bars von Developer Express).
Ich habe dann herausgefunden, das einige User einen Doppelklick gemacht haben.
Waren Sie schnell genug, kam es auch zu diesem Fehler.

Mittlerweilen ist das bereinigt. Damals habe ich mich im Code darum gekümmert, das der Menüpunkt quais gelockt wurde.

Frank

mjustin 16. Mär 2011 11:28

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Danke für die Antwort - also im Prinzip kann dieser Fehler durch schnelle Doppelklicks ausgelöst werden. Den Fall, dass innerhalb des modalen Dialogs scheinbar noch einmal der gleiche Menüpunkt angewählt wurde (im Hauptformular), hatte ich auch in einem bugreport gehabt, und dachte daher an diese Doppelklick-Ursache.

Allerdings (im gezeigten Stacktrace auch erkennbar) kommt es auch vor, dass zwei ganz verschiedene Menüpunkte zum Öffnen des modalen Dialogs, die auch nicht direkt übereinander stehen, durch den Doppelklick getroffen werden - das ist relativ unwahrscheinlich, denn dann müßte man 'Klicken - Mauszeiger einen Zentimeter höher platzieren - nochmal Klicken' können, bevor der modale Dialog geöffnet wird.

Das Problem tritt erst seit Umzug auf einen Windows 2008 R2 Server auf, der nun über RDP statt über Citrix betrieben wird. Ich werde es weiter verfolgen, vielleicht gibt es doch einen Weg es zuverlässig zu reproduzieren.

SirThornberry 16. Mär 2011 12:01

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Sieht doch danach aus das der Menüpunkt durch einen Shortcut aufgerufen wurde.

mjustin 16. Mär 2011 12:14

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Zitat:

Zitat von SirThornberry (Beitrag 1088954)
Sieht doch danach aus das der Menüpunkt durch einen Shortcut aufgerufen wurde.

Danke, da war ich noch nicht so sicher - allerdings muss dann Delphi, wenn man zweimal den gleichen Shortcut eingibt und der erste bereits den modalen Dialog (vorher erscheint noch ein InputQuery Dialog) öffnet, den zweiten Shortcut nicht aus der Eingabequeue löschen? Im modalen Dialog selber, und in erwähnter InputQuery, ist der Shortcut nicht mehr wirksam.

blauweiss 16. Mär 2011 12:30

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Hallo mjustin,

nur so eine Idee: Hast Du irgendwo (FormShow etc.) ein Application.ProcessMessages drin ?

Bei uns gab es ein ähnliches Problem. Ein Anwender mit nervösem Zeigefinger, der auf alles doppelklickte, schaffte es 2-mal auf einen Button zu klicken der einen modalen Dialog öffnete. Dort wurde ein Application.ProcessMessages durchlaufen vor Erscheinen der Form -> Problem evtl. wie bei Dir.

Gruß,
blauweiss

mjustin 16. Mär 2011 12:51

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Zitat:

Zitat von blauweiss (Beitrag 1088963)
nur so eine Idee: Hast Du irgendwo (FormShow etc.) ein Application.ProcessMessages drin ?

Stimmt, das wäre ein Kandidat - schaue ich mir an, Danke für den Tipp!

mjustin 17. Mär 2011 05:31

AW: Mysteriösen Hauptmenübefehl-Aufruf aus modalem Dialog reproduzieren
 
Es ist laut Angaben ein Windows Bug, der mit dem SP1 für Windows 2008 R2 behoben ist.

Also falls in dieser Umgebung rätselhafte Ausführungen von Menüpunkten auftreten, kann es sich um diesen Fehler handeln.

Auf Stackoverflow:

http://stackoverflow.com/questions/5...334062#5334062


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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