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/)
-   -   Delphi Spezielles "Hint"(Window) für nur ein bestimmtes Control (https://www.delphipraxis.net/85058-spezielles-hint-window-fuer-nur-ein-bestimmtes-control.html)

DataCool 25. Jan 2007 12:44


Spezielles "Hint"(Window) für nur ein bestimmtes C
 
Hi,

ich habe gerade das Problem, das ich bei einem Treeview(und nur bei diesen),
ein spezieles Hint einblenden möchte(mehrere Zeilen und 2 Images).

Erst habe gedacht ich schreib mir eine eigene Klasse die ich von THintWindow ableite.
^^ Gehe ich so vor dann habe ich diese Art von Hint überall in der App oder gar nicht.

Dann habe ich den Hint durch eine Form simuliert, dabei stosse ich aber auf das Problem
das der Hint aber schon nach ein paar Millisekunden bei OnMouseMove angezeigt wird.
Ich hätte es gerne so wie es normal ist nach ca. 1 sek. dann erst einblenden.

Hat jemand eine Idee oder einen Ansatz wie ich zu meinem Ziel kommen könnte ?

Greetz

DataCool

juergen 25. Jan 2007 19:40

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hallo DataCool,

ich hatte da mal was bei den Schweizern gefunden.
Der Autor ist Horst Kniebusch.
http://www.swissdelphicenter.ch/de/p...de.php?id=1390

DataCool 25. Jan 2007 21:30

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hi Jürgen,

danke für den Hinweis, aber die Klasse THintWindow zu überschreiben/abzuleiten
hatte ich oben ja schon als Möglichkeit beschrieben!

Bei der Lösung ist das Problem das iich dieses spezielle HintWindow dann bei
jeder Komponente habe und nicht nu beim dem Treeview wo ich es haben möchte.

Greetz DataCool

GuenterS 25. Jan 2007 22:12

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
nun du könntest im OnMouseMove oder so einen Timer mit einer Sekunde wartezeit auslösen und den im Timer-Event wieder deaktivieren und dein Hint-Form anzeigen.

DataCool 25. Jan 2007 22:31

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hi,

der Ansatz hat was ;-)

Hatte gerade aus eigener Idee folgendes probiert :

Delphi-Quellcode:
// TreeView XYZ OnMouseMove
Var Node : TTreeNode;
begin
  Node := tv_XYZ.GetNodeAt(x,y);
  if Node.Index <> iLastTvIdx then begin
    dtLastTvMousMove := now;
    iLastTvIdx := node.Index;
    HideHintWindow;
    exit;
  end
  else begin
    if (dtLastTvMousMove + (650/24/60/60/1000)) >= now then exit;
  end;
  ShowHintWindow;
^^ Funktioniert wunderbar, nur bewegt man die Maus über einen node und bewegt die MMaus dann nicht mehr wird kein Hint eingeblendet.
Werde wohl Deinen Vorschlag mit dem Timer realisieren.
Obwohl ich Timer Lösungen immer unschön finde, aber hier gehts wohl nicht anderes.

Danke und Greetz

DataCool

DataCool 26. Jan 2007 13:01

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hi,

mit der Timer-lösung kommt man zum gewünschtem Ergebnis !

Greetz DataCool

IngoD7 26. Jan 2007 14:21

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Zitat:

Zitat von DataCool
Erst habe gedacht ich schreib mir eine eigene Klasse die ich von THintWindow ableite.
^^ Gehe ich so vor dann habe ich diese Art von Hint überall in der App oder gar nicht.

Kannst du das nicht mit TApplication.Hint und TApplication.OnHint beeinflussen und flexibel handhaben? :gruebel:

In einer OnHint-Behandlung könntest du über einen speziellen Short- oder LongHint deines TreeViews eben diesen als "Hint aufrufend" identifizieren und entsprechend reagieren.

DataCool 26. Jan 2007 17:37

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hi,

das könnte ich zwar machen,
aber dann habe ich das selbe Problem wie beim OnMouseMove mit Zeitberechnung,
ich möhte ja einen unterschiedlihen Hint abhängig vom aktuellem TreeItem.

Bis jetzt ist die Timer Variante wirklich die beste Lösung.

Greetz DataCool

himitsu 26. Jan 2007 17:44

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Und wie wäre es, wenn du entsprechend über OnMouseOver und OnMouseLeave (oder so) deinen Hint nur initialisierts, wenn die Maus über der TreeView ist und beim Verlassen dann wieder den "Originalen".


Also einfach nur HintWindowClass entsprechende der aktiven Controls setzt.


Die Verwaltung und speziell die Zeiten sollten dann ja auch wieder passen :angel:

IngoD7 26. Jan 2007 17:57

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Zitat:

Zitat von DataCool
ich möhte ja einen unterschiedlihen Hint abhängig vom aktuellem TreeItem.

:wiejetzt:
Okay, aber das ist natürlich auch eine neue Aussage. Bisher ging es nur um den Hint des Treeviews, der unterschiedlich zu den Hints der anderen Komponenten dargestellt werden sollte.

Zitat:

(...)
das ich bei einem Treeview(und nur bei diesen),
ein spezieles Hint einblenden möchte
(...)
Bei der Lösung ist das Problem das iich dieses spezielle HintWindow dann bei
jeder Komponente habe und nicht nu beim dem Treeview wo ich es haben möchte.

himitsu 26. Jan 2007 18:25

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Zitat:

Zitat von IngoD7
Zitat:

Zitat von DataCool
ich möhte ja einen unterschiedlihen Hint abhängig vom aktuellem TreeItem.

:wiejetzt:
Okay, aber das ist natürlich auch eine neue Aussage. ...

Tja, dann halt im OnMouseMove des TreeViews den Item unter der Maus bestimmen und danach dann HintWindowClass entsprechend setzen, obwohl du ja die Bilder mit im HintText kodieren könntest (z.B. über ein Trennzeichen an den Hinttext die Bilder anhängen, oder zumindestens 'ne Bildnummer)

Ich weiß nicht, ob es das in der normalen TreeView auch gibt, aber in der VirtualTreeView gibt's ja OnGetHintText (oder so), worin man dann Itemabhängig den Hinttext übergibt.




Ansonsten im OnMouseMove den Hint unterm Mauszeiger rausfinden und danach dann den Hint setzen.

juergen 26. Jan 2007 18:35

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hallo DataCool,
ok, 2.Versuch :wink:

Du willst keinen Timer, wie wäre es mit einer Schleife wo du am Ende ein Sleep hast.
Diese Schleife blendet die "myHintForm" langsam über Alphablend ein.
Mit Sleep bestimmst du die Pause, also das Tempo :?:
Das ganze wie schon gesagt im OnMouseMove...

himitsu 26. Jan 2007 18:40

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Zitat:

Zitat von juergen
Du willst keinen Timer, wie wäre es mit einer Schleife wo du am Ende ein Sleep hast.
Diese Schleife blendet die "myHintForm" langsam über Alphablend ein.
Mit Sleep bestimmst du die Pause, also das Tempo :?:
Das ganze wie schon gesagt im OnMouseMove...

1. wärend OnMouseMove die Schleife mit den Pausen abarbeitet ist der Mainthread blockiert.
2. was ist, wenn inzwischen der Mauszeiger wo anders ist, also der Hint garnixchtmehr angezeigt werden muß?

zu 1 und 2: möglich wäre es, wenn in OnMouseMove ein Thread gestartet wird, welcher diese macht und falls der Thread schon existiert, dann wird dieser entweder beendet und ein Neuer gestartet, oder die aktuellen Daten werden an den aktiven Thread weitergegeben.


HintWindowClass entsprechend zu setzen sollte da wohl weniger aufwändig sein :angel:

DataCool 27. Jan 2007 15:05

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hi Himitsu,

einen Thread anstatt einem Timer zu nutzen ist natürlich möglich und auch schöner,
falls ich keine bessere Möglichkeit finde werde ich den Timer auch durch einen Thread ersetzen.

Zitat:

HintWindowClass entsprechend zu setzen sollte da wohl weniger aufwändig sein
^^^Vielleicht habe ich ja einen Denkfehler oder seh den Wald vor lauter Bäumen nicht ;-)

Wenn meine eigene HintWindowClass der Application zuweise, ist diese Hint Klasse dann für alle Elemente gültig.
Also müßte das HintWindow der Application immer wieder auf das Default zurück gesetzt werden und dann wieder,
wenn sich die Maus über dem Treeview befindet, auf mein spezielles Hint Window gesetzt werden.

^^ Wie wüdere der Sourcecode dazu aussehen ?!

Trotzdem gäbe es dann noch ein Problem :
Der normale Treeview zeigt keinen Hint an, wenn man sich über die verschiedenen Items bewegt.
Setze ich den Hint beim OnMouseMove habe ih wieder den ganzen anderen Kram(Zeitverzögerung, Itemwechsel, etc.) zu
berücksichtigen, oder sehe ich das falsch ?

Greetz D

DataCool

himitsu 5. Feb 2007 06:08

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Ja, es wäre für alle Elemente gültig, aber wenn du dieses nur angegeben hast, wärend auch nur ein Hint der TreeView angezeigt werden könnte und ansonsten der normale Hint eingetragen ist, dann wird dieser doch auch nur von der TreeView verwendet.


Im OnMouseMove das Item unter der Maus rausfinden und dann dementsprechend den Hint der TreeView setzen?

und dann wäre es wohl am Einfachsten noch das OnMouseLeave nachzurüsten (sonst müstest du ja in allen anderen Objecten auf der Form ebenfalls das OnMouseMove abarbeiten, um das verlassen der TreeView zu erkennen).
also die CM_MOUSELEAVE-WindowsMessage abfangen und dort wieder den "Default"-HintWindow wieder setzen.
z.B.:
Code:
[b]private[/b]
  procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  [b]procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;[/b]


Aber wie gesagt, mit der VirtualTreeView wird der Item-abhängige Hint einfacher zu realsieren sein.
Im OnMouseEnter da deinen Hint installieren (HintWindowClass:=TYourHintWindow; ) und in OnMouseLeave wieder den StandardHint (HintWindowClass:=THintWindow; ).

Dort könntest du aber auch deine HintClass erst installieren, wenn er wirklich gebraucht wird, also in OnGetHint deine HintKlasse zuweisen und zugleich den Item-abhängigen HintText setzen und in OnMouseLeave (selbst nachgerüstet) auf die DefaultHintClass wieder zurücksetzen.

MrKnogge 8. Apr 2007 16:38

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Zitat:

Zitat von DataCool
Hi,
mit der Timer-lösung kommt man zum gewünschtem Ergebnis !
Greetz DataCool

Hallo,
könntest du bitte deine Lösung oder eine Demo posten, ich stehe gerade vor dem gleichen Problem.

Gruß

Hawkeye219 8. Apr 2007 17:17

Re: Spezielles "Hint"(Window) für nur ein bestimmt
 
Hi,

es sollte auch ohne Timer gehen:

Delphi-Quellcode:
type
  TMyHintWindow = class(THintWindow)
  protected
    procedure Paint; override;
  end;

procedure TMyHintWindow.Paint;
begin
  // hier HintWindow-Inhalt zeichnen
end;

procedure TDemoForm.ApplicationShowHint (var HintStr: String;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  if (HintInfo.HintControl = TreeView1) then // hier Control einsetzen
    HintInfo.HintWindowClass := TMyHintWindow;
end;

procedure TDemoForm.FormCreate (Sender: TObject);
begin
  Application.OnShowHint := ApplicationShowHint;
end;
Auf diese Weise wird das neue HintWindow nur für das angegebene Control (hier TreeView1) verwendet.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 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