GetShortHint() funktioniert nicht
-
Hallo Gemeinde,
Ich hab ein Panel mit 3 Items. In Item1 möchte ich den kurzen Teil, und Item2 den langen Teil des Hints anzeigen. Die Teile der Hits sind ja durch "|" getrennt.
Wär ja alles sehr schön, wenn nicht GetShortHint(Application->Hint) den gleichen Textteil wie GetLongHint zurückgeben würde. Es werden in beiden Fällen nur alle Zeichen hinter dem "|" angezeigt. An den Short-Teil komm ich nicht ran.
Ich hab schon im Forum gesucht, aber nix gefunden.
RudiVielleicht gehts ja ab RAD Studio 2009 nicht mehr?
-
ich hab mir von dem Statement
MyString = GetShortHint( Application->Hint );
mal angesehen was mit
MyString = Application->Hint;
passiert.
Hier wird immer nur der LongHint oder wenn kein ShortHint existiert, der gesamte Hint zurückgegeben. Jetzt stellst sich die Frage:Wo bleibt der ShortHint? Da ist doch die ganze Funktion GetShortHint nutzlos, oder?
Rudi
-
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