GetShortHint() funktioniert nicht



  • rudiM schrieb:

    Ich hab ein Panel mit 3 Items.

    Ein Panel mit Items... Erklär das bitte



  • StatusBar->Panels->Items[2]->Text = GetShortHint( Application->Hint );
    

    Sorry, natürlich ne Statusbar mit 3 Panels.



  • Hmm, im BCB2009 gehts.

    Eintrag in der Projektdatei:

    Application->Initialize();
       Application->Hint = " Short Hint  | Und hier der LongHint "; // <---
       Application->CreateForm(__classid(TForm1), &Form1);
    

    Formulardatei:

    StatusBar1->Panels->Items[0]->Text = GetShortHint( Application->Hint );
       StatusBar1->Panels->Items[1]->Text = GetLongHint( Application->Hint );
    


  • Hallo kpeter,

    ich glaube das, wenn Du Application->Hint direkt lädst. Ich hätte jedoch gehofft, dass in Applikation->Hint immer der Hint gespeichert ist, der in dem Objekt steht über dem sich die Maus befindet. Das ist auch so, aber halt immer nur der LongHint. Der ShortHint muss also verloren gehen wenn die Maus das Objekt wechselt.
    Die Beispiele in allen HilfeDateien (Offline und Online) sind auch nur mit den Hints der einzelnen Objekte beschrieben, nicht mit Application->Hint.
    Gruß Rudi



  • Evtl. hilft dir einfach TStatusBar::AutoHint. Durch Setzen auf 'true' sollte es automatisch den Kurzhinweis anzeigen...



  • Hallo Th69

    danke für den Hinweis, das hab ich tatsächlich noch nicht aktiviert. Aber leider funktioniert es nicht, auch hier kommt nur der LongHint.
    Darüber hinaus kommt der AutoHint in Panel[0], ich hätte ihn aber gerne in Panel[1]. Naja, könnte man auch umdesignen.

    Gruß Rudi



  • Hi,

    nachfolgend mal eine Funktion, nachder du die Hints der Steuerelement aufsplitten kannst.
    Originalfunktion aus Forms.pas, umbenannt:
    (noch kein hacken,oder ? 😃 )
    Formulardatei:

    *.h
    
    protected:
        Controls::TControl* __fastcall DoHintMouseIdle(void);
    private:
       Controls::TControl* FMouseControl;
       void __fastcall ShowHint(TObject *Sender);
    
    //--------------------
    *.cpp
    
    im Konstruktor:
    
       Application->OnHint = ShowHint;
    
    //-----------------------------------------------
    void __fastcall TForm1::ShowHint(TObject *Sender)
    {
       // Steuerelement bestimmen, über welches die Maus ging
       TControl* cntrl = DoHintMouseIdle();
       String name = cntrl->Name;  // nur z.Kontrolle
       String hint = cntrl->Hint;  // <-- Hint der Steuerelemente
       String bs   = GetShortHint( hint );
       String bl   = GetLongHint( hint );
    
       StatusBar1->Panels->Items[0]->Text = bs;
       StatusBar1->Panels->Items[1]->Text = bl;
    }
    //---------------------------------------------------------------------
    
    Controls::TControl* __fastcall  TForm1::DoHintMouseIdle(void)
    {
       TControl* Result;
       TControl* CaptureControl;
       TPoint P;
    
       GetCursorPos(&P);
       Result = dynamic_cast<TControl*>(FindDragTarget(P, true));
    
       if ((Result != NULL) && (Result->ComponentState.Contains(csDesigning))) {
          Result = NULL;
          CaptureControl = GetCaptureControl();
          if ( FMouseControl != Result) {
             if ((FMouseControl != NULL && CaptureControl == NULL) ||
                    (CaptureControl != NULL && FMouseControl == CaptureControl))
                FMouseControl->Perform(CM_MOUSELEAVE, 0, 0);
             FMouseControl = Result;
             if ((FMouseControl != NULL && CaptureControl == NULL) ||
                     (CaptureControl != NULL && FMouseControl == CaptureControl))
                FMouseControl->Perform(CM_MOUSEENTER, 0, 0);
          }
       }
       return Result;
    }
    

    mfg
    kpeter



  • Hallo kpeter,

    danke für Deinen Lösungsvorschlag. Er funktioniert für alle Objekte die DragTargets sind. Besonderen Wert lege ich jedoch auf alle Hints, die im MainMenue vorkommen, und die sind jedoch nicht Dragable. Dort bleibt mein Problem weiterhin bestehen, der ShortHint ist der selbe wie der LonHint.

    Schade, war nur knapp daneben. Wenigstens kenn ich jetzt FindDragTarget(). Eines wundert mich dann aber doch: FindDragTarget() liefert auch hier einen Zeiger auf das MenueObjekt mit dem Hint, aber halt nur den LongHint.
    Gruß Rudi



  • rudiM schrieb:

    alle Hints, die im MainMenue vorkommen

    Mit der Message WM_MENUSELECT kann man da weiterkommen 😉
    Vllt. hab ich morgen etwas Zeit-...

    mfg
    kpeter



  • Hallo,

    nun zu den Hints aus dem MainMenu.
    Dazu werten wir die Message WM_MENUSELECT bzw die Struktur TWMMenuSelect aus.

    // in die *.h
    
    private:
    
       void   virtual __fastcall WM_MenuSelect(TWMMenuSelect& Message);
    
       BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_MENUSELECT, TWMMenuSelect, WM_MenuSelect);
       END_MESSAGE_MAP(TForm)
    
    //------------------------------------------------------------------
    
    // in die *.cpp
    
    void __fastcall TForm1::WM_MenuSelect(TWMMenuSelect& Message)
    {  
    
       Cardinal Msg    = Message.Msg;
       Word IDItem 	   = Message.IDItem;
       Word MenuFlag   = Message.MenuFlag;
       HMENU Menu 	   = Message.Menu;
    
       TMenuItem* MenuItem;
       int ID;
    
       TFindItemKind FindKind;
       TMainMenu* FMenu;
    
       // wir casten hier NICHT auf Message.Menu
       FMenu = static_cast<TMainMenu*>(MainMenu1);  // <-- Name des Hauptmenüs
    
       if (FMenu != NULL ) {
          MenuItem = NULL;
    
          if ((Message.MenuFlag !=  0xFFFF) || (Message.IDItem > 0)) {
             FindKind = fkCommand;  
    	 ID = Message.IDItem;
    	 MenuItem = FMenu->FindItem(ID, FindKind);
    
    	 if (Message.MenuFlag & MF_POPUP ){  
    	    FindKind = fkHandle;
    	    ID = (int)GetSubMenu(Message.Menu, ID);  
    	    MenuItem = FMenu->FindItem(ID, FindKind);
    	 }
          }
          if (MenuItem != NULL ) {
             String shint = GetShortHint(MenuItem->Hint);
    	 String lhint = GetLongHint(MenuItem->Hint);
    	 StatusBar1->Panels->Items[0]->Text = shint;
    	 StatusBar1->Panels->Items[1]->Text = lhint;
          }
          else {
             StatusBar1->Panels->Items[0]->Text = "";
    	 StatusBar1->Panels->Items[1]->Text = "";
          }
       }
    }
    //---------------------------------------------------------------------------
    

    So, das ganze entstand auch wieder mit Blick in die passende *.pas-Datei. 😉

    mfg
    kpeter



  • Hallo kpeter,

    da hast Du dir aber viel Mühe gemacht. Ich bedanke mich vielmals. 👍 :xmas1:

    Gruß Rudi



  • Hallo RudiM,

    Warum so kompliziert? Wenn du die Hits eh nur in der Statusbar anzeigen willst, gehts auch anders. Vergiss einfach das Trennzeichen '|' und nimm zB. '@'. Dann kommt immer der ganze Hint in OnHint() an.
    dann kannst Du schreiben:

    int Pos = Application->Hint.Pos("@");
    
    StatusBar1->Panels->Items[0]->Text = Application->Hint.SubString(1,pos-1);
    StatusBar1->Panels->Items[1]->Text = Application->Hint.Substring(pos+1,Application->Hint.Length()-1);
    

    Gruß EasyProg


Anmelden zum Antworten