| Autor |
Beitrag |
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Di 17.02.09 22:55
Hallo,
ich habe eine Klasse von TWinControl abgeleitet und diese fängt das Paint-Ereignis ab per:
Delphi-Quelltext 1:
| procedure WMPaint(var Msg: TWMPaint); message WM_PAINT; |
Nun zu dem was mich wundert: warum muss ich inherited in die prozedur reinschreiben? Wenn ichs nicht mache kommt dauernd das Event und die CPU-Last ist bei ca. 5-10%. Mit dem inherited bei 0% - dabei überschreibe ich doch nichts (ohne override; override akzeptiert er auch nicht, da WM_Paint nicht in der Basisklasse existiert)
Grüße
Heiko
Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 17.02.2009 um 23:02
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 17.02.09 23:18
Doch, das gibt es in der Basisklasse, aber es ist private deklariert und somit nicht sichtbar oder erreichbar. Durch das message überschreibst du implizit einen vorhergehenden Handler. Und mit inherited wird dieser aufgerufen.
// EDIT:
Ach ja, wenn es immer wieder aufgerufen wird:
Kann es sein, dass du Result der übergebenen Botschaft nicht setzt? 
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 18.02.09 10:31
Über TObject.Dispatch werden Messages an message-Methode verteilt. Diese gelten quasi implizit als virtual bzw. override (auch wenn private). Ein inherited auf der untersten message-Methode ruft TObject.DefaultHandler auf (diese wird generell ausgeführt, wenn kein Message-Handler zur Verfügung steht). Alles "Compilermagic".
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 18.02.09 12:16
Ferner benötigen WM_PAINT-Botschaften explizit eine Behandlung bei der 1-2 Dinge erledigt werden; solange dies nicht geschehen ist, bekommt mn immer wieder den Hinweis, dass da noch was zu zeichnen ist. Durch den Inherited-Aufruf wird der Default-Handler von Windows gecallt, der geau diese notwendige Behandlung erledigt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 18.02.09 12:22
BenBE hat folgendes geschrieben : | | Ferner benötigen WM_PAINT-Botschaften explizit eine Behandlung bei der 1-2 Dinge erledigt werden |
Das ist korrekt. Wie hier angedeutet sollte man in WM_PAINT nicht einfach drauflos zeichnen, sondern zuerst die Doku lesen, bzw. man sollte die Delphi Paint-Methode (oder analoge Funktionalität) verwenden. Zudem ist für (evtl. später gewünschte) Platformunabhängigkeit sinnvoll, solche low-level Dinge zu unterlassen.
 Für eigene Komponenten ist TCustomControl meist geeigneter als TWinControl (für diesen Zweck wurde die geschaffen...)
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mi 18.02.09 12:54
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 18.02.09 13:26
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 18.02.09 14:26
|
|
|