![]() |
Maus auf Form: andere Priorität beim Repaint?
Hi Leute,
Kleines Problem: Ein Grid (DevExpress, aber egal) muss immer mal wieder neu gezeichnet werden. Die Methode hierfür heisst: 'Invalidate'. Das klappt auch.... Fast. Wenn nämlich: - die Maus nicht auf dem Grid liegt, scheint es etwas seltener zu klappten (Vielleicht subjektiv) - eine andere Form OnTop ist und die Maus auf dieser Form 'liegt', wird das Grid gar nicht gezeichnet. Die OnTop-Form hat den Fokus. Offensichtlich wird das darunter/danebenliegende Fenster (das mit dem Grid) stiefmütterlich behandelt und zeichnet sich nicht. Gut. Bewege ich die Maus über das Grid-Fenster (Fokus ist immer noch auf dem OnTop-Fenster), zeichnet sich das Grid, allerdings mehr schlecht als recht. Frage: 1. Kann mir Jemand dieses Verhalten erklären (Focused etc.). 2. Ist es wirklich so, das die unten liegenden Fenster irgendwie stiefmütterlich behandelt werden? 3. Kann man dafür sorgen, das so ein Fenster trotzdem immer gezeichnet wird? Außer den Fokus setzen... Danke für Hinweise, Aufklärung und Nachhilfe! :dp: |
Re: Maus auf Form: andere Priorität beim Repaint?
Zitat:
|
Re: Maus auf Form: andere Priorität beim Repaint?
Hi Olli,
Klar irgendwie, das hintenliegende Fenster eine niedrigere Priorität haben. Den Sourcecode habe ich, aber das sind ca. 200.000 Zeilen. Mittlerweile habe ich aber den Fehler gefunden: Wenn das Grid neu gezeichnet werden muss, setze ich ein globales Flag. Im Application.OnIdle frage ich das Flag ab und "zeichne" das Grid ggf. neu. Das Zeichnen des Grids bewerkstellige ich mit 'Invalidate'. Danach hat das Grid aber keine Chance mehr, der Aufforderung nachzukommen, das OnIdle bis zum nächsten Event nicht mehr aufgerufen wird... :wall: Danke für die Aufklärung. |
Re: Maus auf Form: andere Priorität beim Repaint?
Hallo alzaimar,
Zitat:
Freundliche Grüße |
Re: Maus auf Form: andere Priorität beim Repaint?
Weihnachtliche Grüße an meinen Lieblingsforen-"Vogel"!!! :-D
Zitat:
|
Re: Maus auf Form: andere Priorität beim Repaint?
Hi Olli:
Schau: <In irgendeinem Thread, z.B. nach Empfang einer TCP-Message>
Delphi-Quellcode:
Procedure TSomeWhere.OnTCPMessageReceived;
Begin PleaseUpdateGrid := True End; <Im Application.OnIdle>
Delphi-Quellcode:
Das geht natürlich so nicht mehr, weil Invalidate aufgerufen wird und danach nix mehr kommt. Das Grid-Neuzeichnen wird dann erst nach dem Bewegen der Maus/Keyboard etc. initiiert.
Procedure TMainForm.ApplicationIdle (Sender : TObject; Var Done : Boolean);
Begin If PleaseUpdateGrid then Begin ViewController.UpdateGrid; PleaseUpdateGrid := False; End End; ... Procedure TViewController.UpdateGrid; Begin ... MyGrid.Invalidate ... End; Meine Frage richtete sich aber eher danach, wie (und ob) ich Windows 'zwingen' kann, ein nicht fokusiertes Fenster im Hintergrund auch ofters mal neu zu zeichnen... |
Re: Maus auf Form: andere Priorität beim Repaint?
Hallo Olli,
Zitat:
Delphi-Quellcode:
Ein Repaint() gefolgt von einem Application.ProcessMessages - das muss schon sein, da sonst das auf WM_PAINT basierende UpdateWindow() nicht funktioniert - sollte den gewünschten Erfolg bringen, wenn (1) die Komponente von TWinControl abgeleitet wurde und (2) Windows keinen Einspruch erhebt.
procedure TWinControl.Repaint;
begin Invalidate; Update; end; @alzaimar: probiere es doch mal aus, wenn du Zeit hast. Vorweihnachtliche Grüße |
Re: Maus auf Form: andere Priorität beim Repaint?
Hi marabu: Diese Developer-Express-Komponente ist schon sehr komplex:
Wenn der Anwender gerade eine Zelle bearbeitet und ich rufe ein 'Repaint' auf, dann wird die Eingabe abgebrochen (Seiteneffekt). Das geht natürlich nicht. Also mache ich es so: Wenn die Anforderung ('PleaseUpdateGrid') gesetzt ist, ruft OnIdle zunächst 'Invalidate' auf und anschließend setzt sie den 'Done'-Parameter auf False, damit OnIdle nochmal aufgerufen wird. Frag mich nicht wieso, aber das klappt. Ist das Flag 'PleaseUpdateGrid' nicht gesetzt, wird 'Done' auf True gesetzt und die Welt ist in Ordnung. |
Re: Maus auf Form: andere Priorität beim Repaint?
Hi alzaimar,
das ist aber schon das von mir erwartete Verhalten, immerhin auch so dokumentiert: Nach Invalidate() zeichnet Windows "bei Gelegenheit" alle für ungültig erklärten Rechtecke neu, auch wenn sie in der Z-Ordnung weiter hinten liegen. OnIdle() heißt ja, dass sonst nix zu tun ist. Also ist das eine passende Gelegenheit. Deine Lösung für das Problem ist theoretisch äquivalent zu meinem Vorschlag, scheint aber noch die Komplexität einer Komponente zu berücksichtigen, die ich nicht kenne. Freundliche Grüße @Olli: Versuchst du dich diese Woche schnell noch im burst mode ins Buch der guten Taten zu schmuggeln? Ich merke sowas ... |
Re: Maus auf Form: andere Priorität beim Repaint?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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-2025 by Thomas Breitkreuz