Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 11. Jun 2002, 23:33
Moin Ernie,

ich hoffe Paul hat nichts dagegen, dass ich ihm da vorgreife.

Also das Perform bezieht sich auf Form1, da es in einem Methodenaufruf von TForm1 augerufen wird, ohne angabe eines anderen Controls.
Man könnte hier also auch schreiben Form1.Perform...
Ersatzweise ginge auch SendMessage(self.Handle...), wobei sich das Self wiederum aus dem TForm1 ableitet.

WM_NEXTDLGCTL entspricht dem Druck auf TAB. Das nächste/vorige Control in der Tabulatorreihenfolge erhält den Tastaturfokus.
Die folgende erste null (null entspricht false) sagt aus, dass das nächste Control genommen werden soll, würde dort ein Wert ungleich 0 stehen (entspricht in C true, und die API ist ja in C geschrieben) würde das vorige Control den Fokus erhalten (entspricht also Shift-Tab).
Die zweite null sagt aus, dass wParam (also die erste null) angibt, ob das nächste oder das vorige Control in der Tabulatorreihenfolge gemeint ist. Würde hier ein Wert ungleich null stehen, würde das Betriebssystem wParam als Handle auf das Control verstehen, das als nächstes den Fokus erhält. (präziser es ist hier das niederwertige Datenwort, also die unteren 16 Bit gemeint, die über die Funktion von wParam entscheiden).
Damit hätten wir den Perform.

Kleiner Tip am Rande:
Sollte Perform mal nicht das gewünschte Ergebnis bringen, einfach mal mit SendMessage probieren. Manchmal hilft das. Perform scheint ab und zu nicht wie erwartet zu funktionieren.

So und jetzt das PeekMessage:
Damit werden Messages aus der MessageQueue des Threads ausgelesen.
In diesem Falle wird es nur dazu benutzt unerwünschte Werte aus der Queue zu entfernen.
Der erste Parameter ist hier eigentlich nur ein Dummy, aber die Funktion braucht hier nun einmal eine Variable (eigentlich werden hier die Daten der ausgelesenen Message gespeichert).
Die null an zweiter Stelle besagt, dass die Messagequeue aller Fensters des aktuellen Threads beachtet werden sollen.
Mit den beiden nun folgenden WM_CHAR wird angegeben, dass nur die Messages von WM_CHAR bis WM_CHAR ausgelesen werden sollen, da es hier darum geht genau dieses zu entfernen. Meist wird man hier wohl WM_KEYFIRST, WM_KEYLAST bzw. WM_MOUSEFIRST, WM_MOUSELAST vorfinden, um alle Tastatur- bzw. Mausmessages abzufangen.
PM_REMOVE besagt schliesslich, dass die Message nicht nur ausgelesen, sondern sogar aus der Queue entfernt werden soll. Dadurch wird der Beep unterdrückt.
PeekMessage ist noch umfangreicher, aber das liest Du wohl am besten im PSDK oder auf MSDN nach. Das würde hier zu weit führen.

Ich hoffe Du kommst mit meinen Ausführungen klar.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat