OnDraw von TPageControl
-
Hallo,
ich habe ein TPageControl und desseen Eigenschaft "OwnerDraw" auf true gesetzt.
Aus der FAQ, der Suche und Hilfe aus diesem Forum habe ich folgenden Code gefunden Bilder und Text in den Tabs auszugeben:void __fastcall TSwlDocInfo::InfoControlDrawTab( TCustomTabControl *Control, int TabIndex, const TRect &Rect, bool Active) { int Picture = InfoControl->Pages[TabIndex]->ImageIndex String Text = InfoControl->Pages[TabIndex]->Caption; Control->Canvas->Brush->Color = clCream; Control->Canvas->Brush->Style = bsSolid; Control->Canvas->TextRect(Rect, Rect.Left + 40, Rect.Top+ 15, Text); ImageList32->Draw(Control->Canvas, Rect.left +4 , Rect.Top+4,Picture, true); }das klappt auch ganz toll!
Nur stelle ich nuicht immer alle Tabs auch da! Es gibt Fälle, wo TabVivible auf false gesetzt wird.In diesem Fall ändert sich der TabINdex allerdings leider auch
Und somit bekomme ich mit den obigen Code falsche Bilder und Texte auf den Tabs ausgegeben 
Ich dachte es wäre dann ja durchaus praktisch die entsprechenden Werte direkt aus dem übergebenen Control Objeckt zu holen. Allerdings gibt es in Control keine Pages, und alle Eigenschaften von Control beziehen sich direkt auf das Eltern TTabControl * InfoControl.
Hat jeamnd eine Idee wie ich die Texte und Bilder dennoch richtig ausgeben kann? Bzw. wie ich über Control IMageIndex und Caption auslesen kann ??
Danke!
-
ich habe jetzt folgenden Code in das Ereignis geschrieben:
int Picture = -1; String Text = "\0"; if (Control->Showing == false) return ; if (Control->Controls[TabIndex]->Name.operator ==("tsAuftrag")) { Picture = 1; Text = "Auftrag"; } else if (Control->Controls[TabIndex]->Name.operator ==("tsPatient")) { Picture = 2; Text = "Patient"; } else if (Control->Controls[TabIndex]->Name.operator ==("tsDokument")) { Picture = 0; Text = "Dokument"; } else if (Control->Controls[TabIndex]->Name.operator ==("tsTabelle")) { Picture = 3; Text = "Tabelle"; } Control->Canvas->Brush->Color = clCream; Control->Canvas->Brush->Style = bsSolid; Control->Canvas->TextRect(Rect, Rect.Left + 40, Rect.Top+ 15, Text); ImageList32->Draw(Control->Canvas, Rect.left +4 , Rect.Top+4,Picture, true);jetzt kriege ich nicht nur falsche Beschriftungen und Bilder, zusätzlich verändern diese sich auch noch wenn ich ein anderes Tab anklicke....
Weiß jemand rat?
-
Warum schribst du eigentlich
Control->Controls[TabIndex]->Name.operator ==("tsAuftrag")anstatt der Kurzform
Control->Controls[TabIndex]->Name == "tsAuftrag"?
-
weil ich nicht wußte das das auch so funktioniert ...
Das problem ist damit allerdings leider nicht gelöst

-
//--------------------------------------------------------------------------- void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control, int TabIndex, const TRect &Rect, bool Active) { String txt; for (int i = 0; i < PageControl1->PageCount; i++) { TTabSheet *Tab = static_cast<TTabSheet*>(((TPageControl*)Control)->Pages[i]); if (Tab->TabIndex == TabIndex) { txt = Tab->Caption; break; } } Control->Canvas->Brush->Color = clCream; Control->Canvas->Brush->Style = bsSolid; Control->Canvas->TextRect(Rect, Rect.Left + 40, Rect.Top + 4, txt); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { PageControl1->Pages[1]->TabVisible ^= 1; // Tab2 verstecken/anzeigen } //---------------------------------------------------------------------------Quelle: Borland Newsgroups
-
Danke!!!!
Diese ganze static_cast Sache muss ich mir beizeiten noch mal genauer anschauen!
-
Die Casterei ist hier nur ein Nebenschauplatz. Ehrlich gesagt verstehe ich die Lösung selbst nicht wirklich.

Es scheint unlogisch, dass sich die Änderung der Tab-Reihenfolge hier nicht negativ auswirkt, denn prinzipiell ist das Abklappern des Pages-Arrays ja das gleiche wie der direkte Zugriff auf Pages[TabIndex], nur eben umständlicher.