Zeilenumbruch bei TabSheet geht nicht?
-
Hallo,
ich habe ein Problem mit PageControl.Wenn ich bei einem TabSheet unter der Eigenschaft "Caption" z.B
"ErsteZeile u ZweiteZeile"
eingebe, sieht das unschön aus, da der Text sehr breit wird für den Reiter. Im Editor zeigt das Programm, daß ich mit CTRL + RETURN die Zeile umbrechen könnte.
also:
"ErsteZeile u
ZweiteZeile"Leider geht das nicht!
Es kommt nur folgendes dabei heraus: "ErsteZeile u||ZweiteZeile"Ich bin sicher, dass dieser Bug hier bekannt ist.
Kennt jemand Abhilfe? Würde mich freuen.
-
Was Du locker mit jedem SpeedButton, ShowMessage-Box, Label etc. machen kannst,
ShowMessage("erste Zeile\n zweite Zeile");
geht bei den TabSheets nicht.
Auch DrawText und TextOut greifen nicht.Das ist bisher meine Erfahrung.
-
Nachtrag:
Was mir noch dazu einfällt, ist, dass du (notgedrungen) deine TabSheet-Caption auf das wesentliche
beschränkst und den kompletten Text in den Hint des jeweiligen TS packst.Dann ShowHint auf true und mal schauen, wie es aussieht.
MfG
kpeter
-
Du könntest auch mit TPageControl::OnDrawTab den Text selber darstellen.
Mit der WinAPI-Funktion DrawText kannst du einige mehr Flags angeben als mit der Canvas-Methode, z.B.const int nFlags = DT_CENTER|DT_WORDBREAK|DT_END_ELLIPSIS; std::string sText("Text \n mit \n Umbruch!"); ::DrawText(cv->Handle, sText.c_str(), sText.size(), &rect, nFlags);
Schau dir dazu mal die Flags in der WinAPI-Hilfe an.
-
@Th :
Hast du es denn schon geschafft, dass in den Reitern dann auch etwas steht?Dann poste mal den Code. Was du meinst, habe ich hier schon durch. Die TabSheets haben nun mal keine Canvas...
MfG
kpeter
-
ok
-
Interessiert mich ja auch, das Thema. Mit etwas Ausdauer kommt man manchmal
zu einem Ergebnis.
Also die TabSheets haben keine Canvas, aber das PageControl. So kommen wir an die Beschriftung der Reiter ://--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // Reiter höher und breiter machen nach Erfordernis PageControl1->TabWidth = 300; PageControl1->TabHeight = 40; } //--------------------------------------------------------------------------- void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control, int TabIndex, const TRect &Rect, bool Active) { TRect myrect; myrect = Rect; HWND hwnd; hwnd = PageControl1->Canvas->Handle; String Capt = "Zeile1 ist sehr lang. Sie muss deshalb hier \n in Zeile 2 umgebrochen werden."; PageControl1->Canvas->Brush->Color = clSilver; // Hintergrund der Beschriftung DrawText(hwnd, Capt.c_str(), Capt.Length(), &myrect, DT_LEFT|DT_WORDBREAK); } //--------------------------------------------------------------------------- // PageControl1DrawTab an geeigneter Stelle aufrufen, hier ein SpeedButton void __fastcall TForm1::sbTest1Click(TObject *Sender) { TRect myrect; myrect = Rect (10, 10, 300, 40); int i = PageControl1->ActivePageIndex; PageControl1DrawTab(PageControl1, i, myrect, 1); } //---------------------------------------------------------------------------
Nun nur noch die Beschriftungstexte in ein Array und mit ner Schleife alle TS
beschriften.@Th danke nochmal für deinen Anstoss.
MfG
Peter
-
Hallo kpeter,
so ganz hast du anscheinend die Ereignis-Behandlung (der VCL) noch nicht verstanden.
Damit das PageControl OnDrawTab aufruft, muß einfach TPageControl::OwnerDraw auf true gesetzt werden (sorry, hatte ich vergessen zu erwähnen, aber ich dachte mir ein kurzer Blick in die Hilfe dürfte nicht schaden -)
Nun zeichnet sich die PageControl-Komponente selbständig, incl. der TabSheets.
Ferner gibt der erste Parameter bei OnDrawTab die Komponente selbst an (TPageControl ist von TCustomTabControl abgeleitet), d.h. du solltest niemals in Ereignis-Methoden die Komponente mit Namen ansprechen, sondern immer über den ersten Parameter (üblicherweise Sender genannt).
Hier also noch mal zusammengefaßt:
PageControl void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control, int TabIndex, const TRect &Rect, bool Active) { TRect myrect(Rect); // hier eigentlich überflüssig, da Rect direct benutzt werden kann, aber evtl. Anpassungen s. u. TCanvas *cv = Control->Canvas; String Capt = "Zeile1 ist sehr lang. Sie muss deshalb hier \n in Zeile 2 umgebrochen werden."; cv->Brush->Color = clSilver; // Hintergrund der Beschriftung DrawText(cv->Handle, Capt.c_str(), Capt.Length(), &myrect, DT_LEFT|DT_WORDBREAK); }
Die Zeilen mit dem SpeedButton sind also völlig überflüssig (außer um den aktiven TabSheet zu ändern, z.B. PageControl1->ActivePageIndex = 0).
Die einzige sinnvolle Erweiterung wäre noch die Unterscheidung zwischen aktivem und nicht-aktiven Tab (Parameter 'Active'), da die übergebenen Rechtecke dann unterschiedlich groß sind und man den Text z.B. bei aktivem Tabsheet etwas höher haben möchte oder die Textfarbe (Font->Color) ändern will.
-
Th schrieb:
so ganz hast du anscheinend die Ereignis-Behandlung (der VCL) noch nicht verstanden.
Keine Bange, etwas hab ich schon begriffen. Das SpeedButton war ja auch ein Fehlgriff meinerseits.
Sollte ja nur das Ereignis demonstrieren.Wie auch immer, es soll ja auch darum gehen, dass alle im Forum profitieren.
MfG
kpeter
-
Hallo, möchte mich nach einiger Abwesenheit bei
@kpeter und @Th für die Diskussionsanregungen zu diesem Thema bedanken.
So wie's aussieht läßt sich der Umbruchfehler scheinbar nicht anders als mit einer eigenen OnDraw-Methode korrigieren.
Hab' schon soetwas befürchtet, ist dadurch natürlich deutlich mehr Arbeit.
Werd' mich 'mal dranmachen.
Vielen Dank.