![]() |
CM_HINTSHOW in Komponente
Ich möchte in einer meiner Komponenten einen speziellen Hint anzeigen lassen, je nach Position des Mauszeigers. In dieser Komponente verwende ich unter anderen Paintboxen in denen die Items dargestellt werden.
Mittels
Delphi-Quellcode:
von der FPaintBoxClient ermittele ich das Item, über dem die Mouse befinde. Das Item wird gefunden und die Zeile Application.ActivateHint wird auch ausgeführt.
procedure TKomponente.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var i: Integer; mousept: TPoint; newItemIndex: Integer; HintPos: TPoint; begin mousept.X:=X; mousept.Y:=Y; newItemIndex:=-1; for i:=0 to self.FItemList.Count-1 do if PtInRect(self.FItemList[i].Rect, mousept) then newItemIndex:=i; if newItemIndex<>FMouseOverItem then begin FMouseOverItem:=newItemIndex; if FMouseOverItem>-1 then begin HintPos.X:=Self.FItemList[FMouseOverItem].BoundsLeft; HintPos.Y:=Self.FItemList[FMouseOverItem].Rect.Bottom+3; Hintpos:=self.FPaintBoxClient.ClientToScreen(HintPos); Application.CancelHint; Application.ActivateHint(HintPos); end; end; end; Dann will ich auf die Messages
Delphi-Quellcode:
reagieren, explizit natürlich auf die CM_HINTSHOW , damit ich den passenden HintStr setzen kann. Diese wird aber nie ausgeführt.
procedure TKomponente.CMHintShow(var Message: TCMHintShow);
var HintStr: string; begin inherited; if Message.HintInfo.HintControl=Self then begin if (FMouseOverItem>-1) and (FMouseOverItem<self.FItemList.Count) then HintStr:=Self.FItemList[FMouseOverItem].Hint else HintStr:=''; Message.HintInfo.HintStr:=HintStr; Message.HintInfo.HideTimeout:=FHintDelay; end; end; procedure TKomponente.CMHintShowPause(var Message: TCMHintShowPause); var PHintDelay: PInteger; begin inherited; PHintDelay:=@FHintDelay; Message.Pause:=PHintDelay; end; Deklaration sieht folgendermaßen aus:
Delphi-Quellcode:
Es wird auch nie ein Hint angezeigt. Was könnte ich vergessen haben? Die Message CM_HINTSHOW müsste doch wenigstens ankommen.
procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
procedure CMHintShowPause(var Message: TCMHintShowPause); message CM_HINTSHOWPAUSE; |
AW: CM_HINTSHOW in Komponente
Zitat:
|
AW: CM_HINTSHOW in Komponente
Ja, das habe ich auf True gesetzt.
|
AW: CM_HINTSHOW in Komponente
Wer
Delphi-Quellcode:
sagt muss auch
inherited
Delphi-Quellcode:
sagen.
override
Das vermisse ich aber bei der Deklaration ... |
AW: CM_HINTSHOW in Komponente
Bei Messages gibt es kein override,
bzw. entweder du überschreibst die ursprüngliche Methode, ohne neue angabe der Message oder du definierst das einfach neu, überschreibst damit den Eintrag in der Liste der Messages (also quasi das "Override" in einer Liste, anstatt an der Methode) Und Inherited hat nichts zwangsläufig mit Override zu tut, denn es ruft nur die "gleichnamige" bzw. namentlich genannte Methode in einem der Vorfahren auf, egal ob Überschrieben oder nicht. |
AW: CM_HINTSHOW in Komponente
Außerdem wird override vom Compiler nicht compiliert "Methode CMHintShow nicht in Basisklasse gefunden".
|
AW: CM_HINTSHOW in Komponente
Liste der Anhänge anzeigen (Anzahl: 2)
Ich bin leider mit dem CM_Hintshow noch nicht weiter gekommen.
Ich hänge mal die Komponente und ein Testprogramm an. Vielleicht hat jemand die Muße und schaut sich das mal an. Irgendwo muss ich einen Fehler gemacht haben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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 by Thomas Breitkreuz