Delphi-PRAXiS
Seite 2 von 2     12   

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/)
-   -   Delphi Popup/Contextmenü bleibt leer (https://www.delphipraxis.net/166777-popup-contextmenue-bleibt-leer.html)

EWeiss 25. Mär 2012 10:44

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

Dalai 25. Mär 2012 16:26

AW: Fremdkomponenten
 
Zitat:

Zitat von Orakel-von-Delphi (Beitrag 1158412)
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

Bis hierhin gehe ich mit, und das war mir schon klar. Das hingegen
Zitat:

und auch nicht mehr reagiert.
kann ich einem Screenshot (=stehendes Bild) nicht entnehmen.

Zitat:

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.
Kann ich einem stehenden Bild auch nicht entnehmen. Und das hast du bisher auch noch nicht erwähnt. Also ist das Problem nicht nur auf den fehlenden Text beschränkt sondern beeinflusst noch andere Dinge im Programm.

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

EWeiss 25. Mär 2012 16:41

AW: Popup/Contextmenü bleibt leer
 
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).
Dem kann ich nur beipflichten.. bzw. Habe ich ja auch schon angemerk.
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:

If your compiler is not set to compile for unicode (i.e #ifndef UNICODE) then winuser.h will map AppendMenu to AppendMenuA which is a non-unicode version and would interpret your strings as multi-byte.

gruss

Orakel-von-Delphi 26. Mär 2012 05:01

Testprogramm
 
Zitat:

Ich kann mich nur wiederholen: ich würde erstmal ein dummes Testprogramm erstellen und prüfen, ob das Kontextmenü dort ebenso leer ist.
Das Problem ist aber eben, dass es mit einem "dummen" Testprogramm nicht einfach zu reproduzieren ist. Das Problem ist nämlich intermittierend - d.h. es tritt nicht bei allen 70 Arbeitsplätzen des Kunden auf und auch nicht jeden Tag. Auch die Mitarbeiterinnen, die am häufigsten davon betroffen sind, können nicht genau sagen, wie das Problem reproduzierbar ist. Die Rechner sind übrigens alle gleich und mit dem gleichen Image installiert worden.
Zitat:

... nicht nur auf den fehlenden Text beschränkt sondern beeinflusst noch andere Dinge im Programm.
Ja - nämlich ein totaler Absturz, wenn man es nicht sofort schließt.
Zitat:

Irgendwo hängt das in einer Winproc(Fremdcomponente).
Exakt ! Nur in welchem Kontext :?:

VG Michael

Orakel-von-Delphi 21. Mai 2012 12:55

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:
.
.

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;

.
.
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Seite 2 von 2     12   

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