TUpDown-Hinweis wird mittels ActivateHint nicht angezeigt!? [gelöst]



  • Hallo Gemeinschaft,

    ich möchte den Hinweistext einer TUpDown-Komponente anzeigen lassen, wenn das Steuerelement per Tastatur (Tabulator) ausgewählt wird. Dabei soll es egal sein, an welcher Position sich der Mauszeiger befindet. Die ShowHint-Eigenschaft des UpDown wird zur Laufzeit gesetzt (im FormShow).
    Dazu habe ich in der UpDownEnter-Methode:

    if(pUpDown->ShowHint)                                      // Prüfung, ob ShowHint gesetzt ist (mittels Zeiger auf Komponente)
        Application->ActivateHint(pUpDown->ClientOrigin);      // Angabe der UpDown-Koordinaten (Werte stimmen im Debugger)
    

    Die ActivateHint-Zeile wird auch angesprungen, nur leider wird nie ein Hinweis angezeigt!? Woran kann das liegen?
    Wenn ich mit dem Mauszeiger über die UpDown-Komponente fahre, wird der Hinweis ordnugsgemäß angezeigt.

    MfG



  • Ich hab's jetzt mal mit

    Application->ActivateHint(pUpDown->ClientToScreen(TPoint(0, 0));
    

    versucht, aber auch damit tut sich nichts, dh. der Hinweis wird nicht angezeigt.

    Application->ActivateHint(pUpDown->ClientToScreen(TPoint(5, 5));
    

    bringt auch nichts (ich dachte es könnte vielleicht ein Problem mit dem Randbereich sein...).

    Die Koordinaten, welche ClientToScreen liefert, stimmen mit denen von ClientOrigin aus meinem Eröffnungspost überein. Daher denke ich, die Koordinaten stimmen. Woran kann es noch liegen, dass kein Hinweis angezeigt wird?



  • Hi,

    schau mal unter IsHintMsg...

    mfg
    kpeter



  • Hmm... schön und gut... Danke für den Hinweis, auch wenn ich damit erstmal nicht allzu weit komme.
    Kann ich irgendwie einen Zeiger auf die aktuelle HintWindow-Instanz bekommen oder reicht es, eine Dummy-THintWindow-Instanz anzulegen und mittels dieser IsHintMsg() aufzurufen? Ich stelle mir das so vor, dass die Dummy-Instanz ja auch diese Messages bekommen müsste!?
    Hmm... gerade getestet: IsHintMsg liefert für die Dummy-Instanz immer false zurück :´(
    Ich hab' mir jetzt überlegt, mit Tabulator einfach den Maus-Cursor mit zu setzen... mal sehen, ob das klappt 🙂



  • SetCursorPos hat leider auch nicht den gewünschten Effekt erzielt - der Hinweistext wird nach wie vor nur eingblendet, wenn ich den Mauszeiger mittels Maus über dem Steuerelement positioniere... 😞



  • Hi,

    folgendes habe ich probiert:

    void __fastcall TForm1::UpDown1Enter(TObject *Sender)
    {    
       TPoint P, Q;
       P.x = UpDown1->Left + 5;	
       P.y = UpDown1->Top + 5;
       P = ClientToScreen(P);
       Q.x = P.x + 1;
       Q.y = P.y + 1;   // Cursor je 1 px bewegen, dann dürfte der Timer des HintWindow enablen
       SetCursorPos(Q.x, Q.y);
       Sleep(100);
       SetCursorPos(Q.x + 1, Q.y + 1);   
    }
    //---------------------------------------------------------------------------
    

    Das zeigt den Tooltip, aber nicht bei jedem ENTER. Das mag sicher daran liegen, dass ReleaseHandle des
    Hint-Fenster gesetzt werden muss...

    mfg
    kpeter



  • Super - der Trick ist demnach, SetCursorPos 2x aufzurufen... Vielen Dank für die Denkanstösse kpeter! 👍

    Die Kurzhinweise werden jetzt zuverlässig angezeigt, ohne irgendwas per ReleaseHandle machen zu müssen. Unzuverlässig war die Anzeige des Kurzhinweis bei mir mit Sleep-Zeiten unter 150 Millisekunden, bei größeren Zeiten wurde der Hinweistext zuverlässig eingeblendet.
    Allerdings habe ich das Ganze etwas anders gelöst, weil mir nicht gefallen hat dass für den Benutzer die Veränderung der Cursor-Position sichtbar war und dass Sleep() benutzt wurde... 😉

    MfG



  • Prima. 🙂

    Wenn das Message Processing besser und v.a.D. vollständiger dokumentiert wäre, könnte man
    gezielter eingreifen. So ist das immer nur irgendwie eine funktionierende Lösung.

    mfg
    kpeter



  • kpeter schrieb:

    Wenn das Message Processing besser und v.a.D. vollständiger dokumentiert wäre, könnte man
    gezielter eingreifen.

    Ja, das ist ziemlich undurchsichtig und ich habe bis jetzt auch noch keine vollständig zusammenhängende Beschreibung gesehen... Wer weiß von wie vielen Faktoren das abhängt (evtl. zB. von der verwendeten CPU...)!?

    kpeter schrieb:

    So ist das immer nur irgendwie eine funktionierende Lösung.

    Genau, das sehe ich gerade wieder... Ich hatte SetCursorPos jetzt einmal im FormKeyUp wo ich auf VK_TAB abfrage und einmal im UpDownEnter, damit ich 2x den Cursor setzen kann, ohne Sleep zu benutzen.
    Plötzlich funktionierts auch mit nur einem SetCursorPos (nur das im FormKeyUp)... Ich hab' daraufhin nochmal ein bisschen getestet und tatsächlich: Im UpDownEnter muss ich 2x den Cursor setzen, im FormKeyUp nur einmal! Weiß der Geier... wahrscheinlich ist es, wie du Eingangs schon vermutet hast - nach dem UpDownEnter kommt irgendeine Message, welche der Hinweistext ausblendet / blockiert.

    Soweit, sogut 🙂


Anmelden zum Antworten