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));
Vielleicht hilft dir da was weiter 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 12:40 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