Einzelnen Beitrag anzeigen

bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#34

AW: Tastatur Eingabe im Canvas Objekt

  Alt 3. Nov 2014, 10:55
Zitat:
Ich verstehe die Wirkung noch nicht ganz.
Muss man die Application.ProcessMessages immer in eine Schleife einfügen ?
Ich versuchs mal zu erklären:

Windows ist ein Nachrichtenbasiertes System. Ein Windows-Programm wird von der Message-Loop gesteuert. In Delphi bekommt man die nicht zu Gesicht. Die verbirgt sich hinter dem Aufruf Application.Run in der .dpr- Datei deines Projektes.

Grob gesagt schickt jede Aktion wie z.B. ein Button-Klick eine Message an Windows, die dann in der Message-Loop verarbeitet wird. Die ruft dann die entsprechende Behandlungsroutine auf und sorgt damit dafür dass dein Programm weiterläuft und Windows bedienbar bleibt. Ein Windows-Programm läuft deshalb nicht in einem Stück durch wie ein DOS-Programm, sondern es wird, durch die Messages gesteuert, mal hier und mal da ein Programmteil ausgeführt. Die Reihenfolge richtet sich nach dem Eingang der Messages in der Message-Loop.

Wenn jetzt eine Schleife so gebaut wird, dass keine Messages abgearbeitet werden können, weil die Programmkontrolle nicht an Windows zurückgegeben wird, kann die Messageloop keine Messages abarbeiten und das Programm hängt.

Deshalb muss in einer Schleife, in der irgendwelche Aktionen stattfinden, die die Oberfläche betreffen dafür gesorgt werden, dass die anstehenden Messages abgearbeitet werden können. Das macht das Application.ProcessMessages. Ohne sieht es in deinem konkreten Fall so aus: Du rufst innerhalb der repeat-Schleife Form2.Show auf. Das wird auch noch ausgeführt. Jetzt schickt das Form2 eine Message an Windows mit dem Inhalt "Setze Focus auf Edit1". Diese Message kann aber nicht abgearbeitet werden, weil dein Programmfluss noch in der Repeat-Schleife festhängt.

Allerdings muss man aufpassen: zuviel Application.ProcessMessages kann auch schädlich sein. Das führt aber jetzt zu weit.

Ich hoffe, ich konnte das einigermaßen erklären. Wenn ich noch was vergessen habe, korrigiere man mich.
  Mit Zitat antworten Zitat