AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Maus auf Form: andere Priorität beim Repaint?
Thema durchsuchen
Ansicht
Themen-Optionen

Maus auf Form: andere Priorität beim Repaint?

Ein Thema von alzaimar · begonnen am 18. Dez 2006 · letzter Beitrag vom 20. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Maus auf Form: andere Priorität beim Repaint?

  Alt 18. Dez 2006, 16:32
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!

"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 02:40
Zitat von alzaimar:
2. Ist es wirklich so, das die unten liegenden Fenster irgendwie stiefmütterlich behandelt werden?
Ja, denn ansonsten wäre es verschwendete Rechenzeit. Allerdings sollte eine Komponente immer nur die sichtbaren Teile neu zeichnen. Das alles läßt sich anhand der Win32-API ermitteln. Hast du den Source zu diesem Grid?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 07:42
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...

Danke für die Aufklärung.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 10:15
Hallo alzaimar,

Zitat von alzaimar:
... Das Zeichnen des Grids bewerkstellige ich mit 'Invalidate'. ...
nicht wirklich - mit Invalidate() setzt du ja auch nur einen internen marker, effektiv gezeichnet wird mit Repaint().

Freundliche Grüße
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 13:17
Weihnachtliche Grüße an meinen Lieblingsforen-"Vogel"!!!

Zitat von marabu:
Zitat von alzaimar:
... Das Zeichnen des Grids bewerkstellige ich mit 'Invalidate'. ...
nicht wirklich - mit Invalidate() setzt du ja auch nur einen internen marker, effektiv gezeichnet wird mit Repaint().
Prinzipiell hast du natürlich recht, aber im Default-Handler erledigt Windows genau das nach einem Invalidate(). Ich würde also sagen, daß es stark von der Implementierung abhängt, die er einsetzt.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 13:28
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:
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;
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.

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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 14:58
Hallo Olli,

Zitat von Olli:
... im Default-Handler erledigt Windows genau das nach einem Invalidate(). ...
ich untermauere meine Behauptung, dass mit Invalidate() nicht gezeichnet wird, mit dieser Code-Stelle aus der VCL:

Delphi-Quellcode:
procedure TWinControl.Repaint;
begin
  Invalidate;
  Update;
end;
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.

@alzaimar: probiere es doch mal aus, wenn du Zeit hast.

Vorweihnachtliche Grüße
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 15:11
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 15:25
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 ...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Maus auf Form: andere Priorität beim Repaint?

  Alt 19. Dez 2006, 15:30
Zitat von marabu:
...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. ...
Das Verfahren mit der ich auf die Lösung gekommen bin, nennt sich im Fachjargon: "Extreme-Hair-Raufing".
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:27 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