AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi In einer Klasse Messages für alle Komponenten abfangen
Thema durchsuchen
Ansicht
Themen-Optionen

In einer Klasse Messages für alle Komponenten abfangen

Ein Thema von LH_Freak · begonnen am 5. Mai 2007 · letzter Beitrag vom 17. Mai 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von LH_Freak
LH_Freak

Registriert seit: 2. Mär 2005
Ort: Nürnberg
222 Beiträge
 
#11

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 15. Mai 2007, 15:36
ich probier doch schon garnicht mehr mit Hooks...hab ich doch oben schon geschrieben
Zitat:
im Moment versuche ich die WindowProcs der Komponenten zu überschreiben...das funktioniert auch gut...
das ist auch die Möglichkeit die in dem ThemeManager benutzt wird. Allerdings suche ich sowas wie eine Referenz wo ich nachschaun kann was die Controls alles für Messages bekommen...daran häng ich gerade ^^
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#12

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 15. Mai 2007, 16:36
Zitat von negaH:
Mit Hooks wirst du auf lang oder kurz an einem Punkt ankommen bei dem du besser über alle Komponenten, die du beeinflussen möchtest, bescheid weist als der Programmierer der diese Komponenten erzeugt hat. Ergo: dann bist du schneller wenn du all diese Komponenten durch eigene Entwicklungen ersetzt.
Aber mit Hooks weißt Du mehr über die Komponenten als wenn Du diese selbst schreibst
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#13

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 15. Mai 2007, 21:15
Zitat:
Aber mit Hooks weißt Du mehr über die Komponenten als wenn Du diese selbst schreibst
Falsch. Ein Hook ist immer ein nachträgliches Instrument das nachträglich eine Funktionalität umbiegen möchte. Das bedeutet auch das als erster Schritt erstmal eine umbiegbare Fuktionalität vorhanden sein muß damit man überhaupt was Hooken kann. Der Komponentenentwickler ist also zeitlich und informell immer einen Schritt vorraus, ohne Kompoentenentwickler gibts keinen Hook-Entwickler. Denoch benötigt man das komplette Wissen eines Komponentenentwicklers wenn man einen Hook sauber platzierene möchte. Und das bestätigt sich auch, fragt doch der Threadersteller exakt nach diesem Wissen ->

Zitat:
Allerdings suche ich sowas wie eine Referenz wo ich nachschaun kann was die Controls alles für Messages bekommen...daran häng ich gerade
Die Antwort ist sehr einfach Die einzigste Referenz der man trauen kann sind die Sourcen aller Komponenten selber. Verschaffe dir also einen fundierten Einblick in die Funktonsweise aller Komponeten die du hooken möchtest dann hast du die Möglichkeit durch Messages circa 40% des Verhaltens der Komponenten zu verändern. Die restlichen 60% wirst du über Hooks nicht verändern können da es statische und geschützte Programsequenzen sind die intern eigene Staties benutzten die alle per Hooks nichts erreichbar sind. Hooks im herkömlichen Sinne benutzen die Messageabarbeitung der Komponenten und Fenster. Bei simplen Windows-Fenster ist das eine feine Sache bei der VCL aber nicht mehr. Viele Komponenten benutzen garkein Windowshandle mehr -> TControl->TGraphicControl sondern benutzen ein separates Messagekonzeopt nur typisch für Delphi VCL Controls. Zb. Nachrichten die oberhabl von cm_Base liegen -> cm_Activate, cm_Deactive, cm_Paint usw. usw. Um das alles mitzubekommen MUSST du die WindowProc der VCL-Controls hooken und NICHT das Fensterhandle des Parent WinControls -> zb. TPanel.Handle

Du wirst also nicht umhinkommen und dir das Wissen wie die komplette VCL intern arbeitet anzueignen. Alles andere wird ansonsten ein Blindflug, ein Trial&Error und aufgrund der hohen Komplexität der VCL Komponenten, niemals zu einem Erfolg führen.

Einen guten Abriß über die Arbeitsweise der VCL wird man wohl eher nicht finden. Mein "Abriß" in meinem Hirn besteht aus dem Wissen von 15 Jahren in denen ich als Komponentenentwickler mit der VCL arbeite.

Suche dir am besten Sourcen die fast das manchen was du dir wünscht, und dann studiere sie.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 15. Mai 2007, 21:21
Zitat:
ich probier doch schon garnicht mehr mit Hooks...hab ich doch oben schon geschrieben
Du biegst die WindowPocs der Komponenten um. Also aktuellen Wert von Control.WindowProc in FSaveWindowProc. Dann Control.WindowProc auf MeineWindowProc umbsetzen und in MeineWindowProc reagierst du auf die Messages und/oder leitest sie an FSaveWindowProc weiter. Richtig ?

DAS IST ein Hook.

Gruß Hagen
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#15

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 16. Mai 2007, 07:58
Zitat von negaH:
Zitat:
Aber mit Hooks weißt Du mehr über die Komponenten als wenn Du diese selbst schreibst
Falsch.
Sorry, nur den falschen Smiley benutzt, wollte eigentlich nur auf die etwas lustige Aussage Deines vorrigen Beitrages hinweisen

Zitat von negaH:
Mit Hooks wirst du auf lang oder kurz an einem Punkt ankommen bei dem du besser über alle Komponenten, die du beeinflussen möchtest, bescheid weist als der Programmierer der diese Komponenten erzeugt hat.
Wenn man jetzt selbst die Komponenten erzeugt hat, dann dürfte wohl gelten, dass man mehr durch Hooks über die Komponenten weiß als der Programmierer, der sie schrieb (ergo man selbst). (ein wenig paradox)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#16

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 16. Mai 2007, 09:31
Nein nicht ganz.

Betrachte die Summe aller Komponenten die man hooken möchte als die Arbeit mehrer Programmierer. Man muß also alles das Wissen was eine Gruppe von Programmierern verzapft haben. Wenn man nun selber Komponenten schreibt dann werden das auch nur eine Teilmenge von denen sein die man hooken müsste, ergo: nicht mehr ganz so paradox

Aber das wird zu philosophisch.

Die Kernaussage bleibt besteht:

Hooken und solche Tricks bedingen das der Programmierer ein sehr teifgründiges Wissen besitzen muß. Dieses Wissen wird mindestens so tief sein wie das eines erfahrenen Komponentenentwickler. Ist dem nicht so so wird man mit Hooks meistens mehr kaputt machen als reparieren. Die Frage nach mehr zusammengefassten Backgroundwissen ist also korrekt, nur habe ich eben keine Antwort darauf wo man solche fundierten Sachen nachlesen könnte, als im Source selber.

Schau mal, wer kann sich heute als Komponetenentwickler bezeichnen ?
All diejenigen die selber Komponenten schreiben, logisch. Da diese Entwickler die meiste Zeit nur Komponeten auf eine fertige konstruierte Basis aus Komponeten draufsetzten, wie zb. Propertyeditoren für die IDE usw. usw. heist das auch das ein Komponentenentwickler heutzutage nicht zwangsläufig darüber bescheid wissen muß was er da eigentlich benutzt.
Das ist ja das schöne an der Arbeitsweise der OOP, bzw. im Grunde exakt ihr Ziel.

Ein Hook greift aber ganz unten, im innersten in das Prozessing einer oder sogar einer ganzen Gruppe von Komponenten ein. Der Hook bekommt auch innere Staties mit die man aussen der Schnittstelle Komponente garnicht ansehen kann. Denoch ist es wiederum so das ein Hook niemals komplett alles über die gehookte Komponete wissen kann, das diese eben private Felder/Staties/Methoden benutzt die nicht über die WindowProc laufen.

Egal: über die Komponeten der VCL gut bescheid zu wissen kann nie schaden. Borland liefert die Sourcen mit, ergo kann man darin stöbern, und ich habe es auch so gelernt. Nur einen Abriß der fundiert ist wird man meines erachtens so nicht finden, das wäre ein dickes Buch.

Grundsätzlich muß er fast alle Messages berücksichtigen, da sie fast alle das Ziel haben einen internen Status, zb. Text, im GUI darzustellen/sie zu editieren und auch das darzustellen, und exakt das möchte er verändern. Es gibt nur sehr wenige Windowsbotschaften die redundant sind. Zb. wm_Size,wm_Move,wm_Activate zu wm_WindowPosChanged/wm_WindowPosChanging. Die in der VCL eingeführten Messages, die nichts mehr mit Windows zu tuen haben, sind die cm_XXXX Messages. Deren Arbeitsweise kann sich leicht zu den Windowsbotschaften unterscheiden und sind in ihrer Menge genauso groß wie die Windows Botschaften. Deren logischer Aufbau ist dabei intuitiver und logischer konstruiert als die Windowsbotschaften. Sehr oft sind es gemappte Windowsbotschaften wie wm_SetFocus zu cm_Activate/cm_Deactivate die eine Nachricht an ein TWinControl benutzen das dann diese Nachricht als cm_XXXX Nachricht broadcastet an seine untergeordneten TControl's, die ja kein eigenes Fensterhandle besitzen.

In vielen Fällen könnten also die cm_XXXX Messages ausreichend sein sie zu hooken und darauf zu reagieren, aber eben nicht immer. Die Deklaration der cm_XXXX Messages findet man in Unit Controls.pas.

Zb. die wm_Paint Messages zu Hooken ist gefährlich. Macht man dort einen Fehler, zb. die Fragestelleung wann muß man den DC->Devicecontext der in Message.wParam übergeben wurde, wenn er übergeben wurde, freigeben oder nicht, kann Speicherleaks im GDI verursachen. Ein Fehler dabei und man hat in Millisekunden oder erst Stunden die GDI Resourcen bei den DC's überschritten, für's gesammte System wohlgemerkt. Danach funktioniert garnichts mehr, sogar der Taskmanager wird nicht mehr richtig dargestellt.

Bei Windowscontrols ist es durchaus üblich das diese auf dem Bildschirm zeichnen auch inerhalb anderer Nachrichten. Ganz besonders schlim wurde dies bei den normalen TForm Fenstern, also der Titelzeile eines Windows, gemacht. Klickt man mit der Maus auf den Schließenbutton so wird wm_NCLButtonDown gesendet. Windows beginnt nun eine Schleife die erst zurück kehrt wenn der Button wieder losgelassen wird. Innerhalb dieser Schleife werden die Fensterbuttons und Titelzeile neu gezeichnet, unabhängig von wm_Paint und wm_NCPaint. Ein Hook muß also wm_NCLButtonDown abfangen und dann ALLES selber machen. Nun ist es aber so das sich gerade der Code dieser Schleife, auf den wir keinen Einfluß haben, mit jeder neuen Windowsversion ständig veränderte und es kein API zur Beeinflussung dafür gibt.
Das zeigt uns das
1.) es schon eine Kunst ist einen 4'ten Button in der Titelzeile einzublenden
2.) warum so viele Tools die so einen Button einblenden fast nie ganz sauber arbeiten, besonders bei neuen Windows Versionen versagen sie.
Diese Problematik ist ein Beispiel für die Anwendung von Hooks, deren Komplexität und eben auch der "Gefahren" dabei. Ist natürlich ein extremes Beispiel.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von LH_Freak
LH_Freak

Registriert seit: 2. Mär 2005
Ort: Nürnberg
222 Beiträge
 
#17

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 16. Mai 2007, 18:48
Naja, aber ich arbeite ja nie mit DCs ^^...ich nehm mir Left, Top, Width und Height und zeichne mein PNG Bild auf das Bild vom Formular...also ich reagiere nur auf die Messages wie WM_PAINT usw.
Kann man da auch viel kaputt machen?
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#18

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 16. Mai 2007, 22:58
Hm, aus deiner Fragestellung am Threadanfang konnte man schließen das du das Styling aller Controls die auf deinem Form liegen verändern möchtest. Deshalb auch die Frage nach den Hooks etc.pp.

So wie es aber jetzt scheint möchtest du nur eine Bitmap in deine Form zeichnen, quasi als Hintergrundbild. Das ist natürlich was ganz anderes und geht ganz ohne Hooks oder manuellem abfangen der wm_Paint Messages. Nimm ein TImage, setze es auf dein TForm mit alClient und in der Property Picture lädst du deine Bitmap.


Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von LH_Freak
LH_Freak

Registriert seit: 2. Mär 2005
Ort: Nürnberg
222 Beiträge
 
#19

Re: In einer Klasse Messages für alle Komponenten abfangen

  Alt 17. Mai 2007, 21:09
jein...also ich habe ein LayeredWindow. per UpdateLayeredWindow zeige ich ein PNG an. Dadurch sind natürlich alle VCL Komponenten verschwunden. Deshalb möchte ich diese auf das Bild der Form zeichnen damit ich die auch beim LayeredWindow sehe...Aber wenn ich nur den WM_Paint abfange funktioniert das ja auch nicht. Weil bei nem Eingabefeld z.B. wird ja kein WM_PAINT geschickt wenn getippt wird (zumindest wars bei mir nicht so o_O)...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:18 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