Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   CM_HINTSHOW in Komponente (https://www.delphipraxis.net/198214-cm_hintshow-komponente.html)

Hobbycoder 13. Okt 2018 22:01

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:
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;
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.

Dann will ich auf die Messages
Delphi-Quellcode:
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;
reagieren, explizit natürlich auf die CM_HINTSHOW , damit ich den passenden HintStr setzen kann. Diese wird aber nie ausgeführt.

Deklaration sieht folgendermaßen aus:
Delphi-Quellcode:
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
    procedure CMHintShowPause(var Message: TCMHintShowPause);
      message CM_HINTSHOWPAUSE;
Es wird auch nie ein Hint angezeigt. Was könnte ich vergessen haben? Die Message CM_HINTSHOW müsste doch wenigstens ankommen.

Uwe Raabe 14. Okt 2018 08:52

AW: CM_HINTSHOW in Komponente
 
Zitat:

Zitat von Hobbycoder (Beitrag 1415711)
Es wird auch nie ein Hint angezeigt.

Ist das ShowHint-Property des Controls denn auch True?

Hobbycoder 14. Okt 2018 09:30

AW: CM_HINTSHOW in Komponente
 
Ja, das habe ich auf True gesetzt.

Schokohase 14. Okt 2018 09:38

AW: CM_HINTSHOW in Komponente
 
Wer
Delphi-Quellcode:
inherited
sagt muss auch
Delphi-Quellcode:
override
sagen.

Das vermisse ich aber bei der Deklaration ...

himitsu 14. Okt 2018 12:17

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.

Hobbycoder 14. Okt 2018 17:35

AW: CM_HINTSHOW in Komponente
 
Außerdem wird override vom Compiler nicht compiliert "Methode CMHintShow nicht in Basisklasse gefunden".

Hobbycoder 15. Okt 2018 08:31

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 13:09 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