AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CM_HINTSHOW in Komponente

Ein Thema von Hobbycoder · begonnen am 13. Okt 2018 · letzter Beitrag vom 15. Okt 2018
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

CM_HINTSHOW in Komponente

  Alt 13. Okt 2018, 23:01
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#2

AW: CM_HINTSHOW in Komponente

  Alt 14. Okt 2018, 09:52
Es wird auch nie ein Hint angezeigt.
Ist das ShowHint-Property des Controls denn auch True?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#3

AW: CM_HINTSHOW in Komponente

  Alt 14. Okt 2018, 10:30
Ja, das habe ich auf True gesetzt.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: CM_HINTSHOW in Komponente

  Alt 14. Okt 2018, 10:38
Wer inherited sagt muss auch override sagen.

Das vermisse ich aber bei der Deklaration ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: CM_HINTSHOW in Komponente

  Alt 14. Okt 2018, 13:17
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#6

AW: CM_HINTSHOW in Komponente

  Alt 14. Okt 2018, 18:35
Außerdem wird override vom Compiler nicht compiliert "Methode CMHintShow nicht in Basisklasse gefunden".
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#7

AW: CM_HINTSHOW in Komponente

  Alt 15. Okt 2018, 09:31
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.
Angehängte Dateien
Dateityp: zip HCComponents.zip (10,1 KB, 4x aufgerufen)
Dateityp: zip EWPlanTest.zip (54,5 KB, 3x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (15. Okt 2018 um 09:35 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:25 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