GetShortHint() funktioniert nicht
-
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