![]() |
Application.HideHint ändern
Hallo Kollegen,
vllt steh ich gerade fest aufm Schlauch, aber ... weshalb bringt D2010 einen E2089 bei
Delphi-Quellcode:
?
TMethod(Application.HideHint).Code := MyAppHideHint.Code;
Ich möchte die HideHint-Prozedur ändern, um zusätzlich selbst darauf reagieren zu können, wenn das HintFenster ausgeblendet wird. Wie immer danke für alle Ideen ;-) + fg |
AW: Application.HideHint ändern
Weil der Compiler endlich mal schauler ist, als du. (früher wurde sowas einfach noch nicht bemängelt)
Es wird das Propert HideHint ausgelesen und du versuchst in der ausgelesenen
Delphi-Quellcode:
dieses Records ein Feld zu ändern.
Kopie
Und nein, es wird ausschließlich der Getter aufgerufen, da du ja einen bestehenden Wert teilweise ändern willst, aber es wird nacher nicht mehr per Setter zurückgespeichert. [edit] HideHint ist eine Methode und dann noch nichtmal virtuell ... das kann so oder so garnicht funktionieren. |
AW: Application.HideHint ändern
Stimmt, es ist eine Methode und kein Property.
Daher sollte der Cast auf TMethod funktionieren. Tut er aber nicht. Und das wundert mich, da ich auf diese Art öfter das Verhalten von Methoden ändere. Und dort geht das. Das ist übrigens kein schmutziger Trick, sondern funktioniert mit den Bordmitteln ganz legal. Der Record TMethod ist für Zwecke wie diesen gemacht. [virtual] käme dann zum Tragen, wenn ich [override] verwendete. Tu ich aber nicht, weil ich nicht kann, weil es nicht [virtual] ist :-) Sonst wäre das ganze Problem kein Problem. |
AW: Application.HideHint ändern
Zitat:
Also man kann die "Adresse" auslesen und z.B. casten oder an eine Event-Variable übergeben. Und was mich nicht wundert: Man kann das natürlich nicht zurückschreiben oder ändern ... wohin auch? Das geht maximal mit einem bösen Hook. Seit XE, XE2 oder XE3 (k.A.) kann man man sich in virtuale Methoden auch mit einen Interceptor reinhängen. ![]() Und vorher konnte man sich auch böswillig und manuell an der VMT zu schaffen machen. |
AW: Application.HideHint ändern
Delphi-Quellcode:
funktioniert nicht und resultiert in:
var
lpDummy: Pointer; begin lpDummy := TMethod(Application.HideHint).Code;
Code:
[DCC Fehler] E2089 Ungültige Typumwandlung
|
AW: Application.HideHint ändern
In der TNTWare-Controls gibts doch Helperfunktionen um solche Hooks korrekt zu setzen.
Für Funktionen funktioniert es (z.B. ersetzen von Format-Befehl um unter D6 den Bufferfehler zu umgehen). Evtl. funktioniert das auch hier |
AW: Application.HideHint ändern
Danke für den Tip, ich möchte möglichst ohne ZusatzTools auskommen.
Mein Weg wird wohl sein, eine eigene THintWindow-Klasse zu erstellen, dort ShouldHideHint zu überschreiben und mir darin selbst eine Message zu posten. :? |
AW: Application.HideHint ändern
Eventuell auch TApplicationEvents.OnMessage und auf WM_DESTROY des HintWindows reagieren.
Oder, da die HintWindows-Klasse eine TComponent ist, sich beim Anzeigen dranhängen ( ![]() Direkte Events/Messages, beim Ausblenden des Hints, hab ich auch nicht entdecken können. |
AW: Application.HideHint ändern
Das hatte ich ausprobiert und mglw etwas übersehen, aber es scheint so, daß das Hintfenster nicht zerstört wird, sondern nur versteckt. Leider.
|
AW: Application.HideHint ändern
WM_CLOSE, CM_VISIBLECHANGED usw.
|
AW: Application.HideHint ändern
Wie ich schon schrieb ... Message abfangen funkt leider nicht.
|
AW: Application.HideHint ändern
Schau dir vielleicht mal die Units NativeHintWindow und FastCodePatch (bzw. Cromis.Detours) an. Beide ändern in Zusammenarbeit miteinander die Delphi-Hints in native und "patchen" dabei Application.HideHint.
MfG Dalai |
AW: Application.HideHint ändern
Das sieht doch mal gut aus :thumb:
Daß dabei TApplication.HideHint als einzige Methode derart gepatcht werden muß bekräftigt mich in der Annahme, daß in diesem Fall die üblichen Mittel tatsächlich nicht ausreichen. Danke sehr! |
AW: Application.HideHint ändern
Aber es ist letztendlich doch nur ein "Windows"?
Dann müsste es eigentlich viele Messages geben, welche von und an das Ding gehen. :gruebel: |
AW: Application.HideHint ändern
IIUC ist es kein ausgewachsenes Fenster, sondern "nur" ein TWinControl. Ich vermute, daß Windoof ein Tooltip-Window erzeugt und Delphi das THintWindow (das zwar Window heißt, aber kein TCustomForm ist) darin einbaut um die Anzeige zu malen.
Es würde mich zwar akademisch interessieren, wie der Mechanismus tatsächlich abläuft, aber die Zeit dafür bezahlt niemand :-/ Ich bin momentan happy mit der eigenen THintWindow-Klasse und werde mglw den FastcodeAddressPatch verwenden, um applikationsweit nur eine einzige Prozedur zu haben, die dann mittels Interface verschiedene THintWindow-Klassen bedienen kann. |
AW: Application.HideHint ändern
Alles was Windows anzeigt, sind "Fenster" ... selbst ein TEdit (EDIT) oder ein TButton (BUTTON) sind nur Fenster, die in das große Top-Level-Fenster eingebettet sind.
Und jedes WinControl wird über Messages kontrolliert. ![]() |
AW: Application.HideHint ändern
Schon klar, deswegen waren die MessageHandler meine erste Idee; THintWindow wird offenbar dennoch anders behandelt. Schon mal selbst probiert?
|
AW: Application.HideHint ändern
Delphi-Quellcode:
Hmmmmm, also entweder hostet Windows die HintWindows extern, was aber nicht gehen kann, denn irgendwo muß das WM_PAINT des HintWindows vorbeikommen, denn als ich zuletzt eine eigene Hint-Klasse schrieb, da ist das noch angekommen (in der Klasse).
procedure TForm2.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var C: TWinControl; begin C := FindControl(Msg.hwnd); if C is HintWindowClass then begin Tag := Tag + 1; Caption := IntToStr(Tag); end; end; Oder man muß auf irgendwas Anderes hören, oder Delphi fängt die HintMessages ab, bevor sie beim OnMessage vorbeikommen. :gruebel:
Delphi-Quellcode:
THintWindow = class(TCustomControl)
protected procedure Paint; override; procedure WMPrint(var Message: TMessage); message WM_PRINT; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz