mehrere Spalten in einer TComboBox anzeigen
-
Hallo,
habe hier [ComoBox mit Spalten], ein Beispiel gefunden und in C++ eingebaut.
Soweit funktioniert alles, aber nur dann wenn ich mit Mousover über ComboBox rüber gehe. Wenn ich einfach Combobox anklicke bekomme ich keinen Text, alles weiss.Ich würde gern wissen, was ich machen muss damit man den Text sofort sehen kann ohne das man erst düber gehen muss.
Dank im Voraus.
-
Hallo,
bei Programmstart legst du nur den Startindex fest, etwa im Konstruktor.
zB.:ComboBox1->ItemIndex = 4;
edit: der Code aus dem Link muss ins Event DrawItem geschrieben werden.
mfg
kpeter
-
Hi,
ja das habe ich alles Schon gemacht.
Nur lädt alles später, wenn ich mit der Mouse drüber gehe.
-
titanium schrieb:
.Nur lädt alles später, wenn ich mit der Mouse drüber gehe.
Werden die Itemeinträge korrekt am Semikolon getrennt und in der 100er Teilung angezeigt?
Hmmm, ein Mausereignis braucht es eigentlich nicht vorher.
Wenn schon Einträge in der Box sind und der Startindex ist gesetzt, also nicht -1, müsste was angezeigt werden...
-
Hi,
ja alles läuft Super, außer die Anzeige.
Deswegen kann ich kein Fehler finden?Anzahl spalten wird angezeigt, Trennlinie wird angezeigt.
Nur kein Ergebnis, erst dann wenn ich mit Mouse drüber gehe über die Combobox Felder, die leer sind.
-
Ist die Box dynamisch erzeugt? dann musst du noch ein paar Zeilen coden...
-
Ja, bitte welche Zeilen ich habe genau das gemacht was in den Beispiel war.
Hast du eine Lösung für mich ?
-
Nur, dass wir nicht aneinander vorbeireden.
Das Link-Beispiel ist für eine ComboBox aus der Komponentenpalette. Von dynamisch erzeugen steht da nichts, deshalb stutze ich...
Der obige Code sollte in diesem einen Event funktionieren.
Läuft der Code denn erstmal auf einer ComboBox aus der Palette?
-
Ahh, OK gibt es eine Möglichkeit, für ComboBoxen?
Ganz Normal oder einfach? Sorry weiß nicht wie es beschreiben kann.
Ich brauche eine Lösung für spalten in ComboBox?
-
Wenn du versuchst, deinen bisherigen Code zum laufen zu bringen, hast du einen guten Anfang.
Am besten, du postest mal was du bisher hast, vielleicht finden wir den Fehler
-
Hi,
hier der Code://--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ComboBox1->Items->Add("hallo;test;tes01;"); ComboBox1->Items->Add("column1;column2;column3;"); } //--------------------------------------------------------------------------- void __fastcall TForm1::B1Click(TObject *Sender) { Form1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { String strVal; String strAll; char *text; int pos1, pos2; RECT rc; int arrWidth[4]; ComboBox1->Canvas->Brush->Style = bsSolid; ComboBox1->Canvas->FillRect(Rect); // Die einzelnen Spalten müssen durch ";" getrennt sein strAll = ComboBox1->Items->Strings[ComboBox1->ItemIndex]; arrWidth[0] = 0; arrWidth[1] = 100; // Width of column 1 arrWidth[2] = 200; // Width of column 2 arrWidth[3] = 300; // Width of colimn 3 // Zeichenbereich für erste Spalte rc.left = Rect.left + arrWidth[0] + 2; rc.right = Rect.left + arrWidth[1] - 2; rc.top = Rect.top; rc.bottom = Rect.bottom; // Text für erste Spalte ausfiltern pos1 = Pos(";", strAll); strVal = strAll.SubString(1,pos1-1); strAll = strAll.SubString(pos1+1,strAll.Length()); // Text ausgeben // Draw Text ComboBox1->Canvas->TextRect(rc, rc.left, rc.top, strVal); // Trennlinie zwischen Spalten zeichnen // Draw separating line betwenn columns ComboBox1->Canvas->MoveTo(rc.right, rc.top); ComboBox1->Canvas->LineTo(rc.right, rc.bottom); // Zeichenbereich für zweite Spalte // Drawingrange for( second column rc.left = Rect.left + arrWidth[1] + 2; rc.right = Rect.left + arrWidth[2] - 2; // Text für zweite Spalte ausfiltern // Get text for( second column //strAll =(strAll, pos1+1, strAll.Length()-pos1); strAll.SetLength((strAll, pos1+1, strAll.Length())); pos1 = Pos(";", strAll); strVal = strAll.SubString(1,pos1-1); strAll = strAll.SubString(pos1+1,strAll.Length()); // Text ausgeben // Draw Text ComboBox1->Canvas->TextRect(rc, rc.left, rc.top, strVal); // Trennlinie zwischen Spalten zeichnen // Draw separating line betwenn columns ComboBox1->Canvas->MoveTo(rc.right, rc.top); ComboBox1->Canvas->LineTo(rc.right, rc.bottom); // Zeichenbereich für dritte Spalte // Drawingrnge for( third column rc.left = Rect.left + arrWidth[2] + 2; rc.right = Rect.left + arrWidth[3] - 2; // Text für dritte Spalte ausfiltern // Get text for( third column strAll.SetLength((strAll, pos1+1, strAll.Length())); pos1 = Pos(";", strAll); strVal = strAll.SubString(1,pos1-1); // Text ausgeben // Draw Text ComboBox1->Canvas->TextRect(rc, rc.left, rc.top, strVal); // Trennlinie zwischen Spalten zeichnen // Draw separating line betwenn columns ComboBox1->Canvas->MoveTo(rc.right, rc.top); ComboBox1->Canvas->LineTo(rc.right, rc.bottom); strAll = (strAll, pos1 + 1, strAll.Length() - pos1); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ComboBox1->Style = csOwnerDrawFixed; }
Hoffe könnt mir helfen, für andere Lösung bin ich Offen. Hauptsache es geht.
-
und dieser Quellcode läßt sich so bei dir compilieren? hast du eine eigene Funktion Pos (Zeile 43,64,84)?
ich bin mal davon ausgegangen das du die Methode Pos von AnsiString verwendest
das Problem ist Zeile 29, dort wird ein leerer Text geliefert, was dann natürlich auch zu leeren Zeilen führt
die Lösung:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ComboBox1->Style = csOwnerDrawFixed; ComboBox1->Items->Add("hallo;test;tes01;"); ComboBox1->Items->Add("column1;column2;column3;"); ComboBox1->ItemIndex = 0; }
das hätten man natürlich mit dem Debugger auch selbst herausfinden können
-
Hi,
ich habe so oft versucht, man lernt dazu.
Aber ein Problem ist noch da, wenn ich Comobobx auswähle sehe ich mehrmals dieComboBox1->Items->Add("hallo;test;tes01;"); ComboBox1->Items->Add("column1;column2;column3;");
Bis ich wieder mit der Mouse drüber gehe dann wird der andere text angezeit.
Sieht dan so aus:
hallo | test | test01
hallo | test | test01dann wenn ich mit der Mouse drüber gehe so:
hallo | test | test01
column1 | column2 | column3Liegt das an Zeile 29 immer noch?
Kann man das irgendwie wo anders einbauen ????
-
titanium schrieb:
Liegt das an Zeile 29 immer noch?
Etwas schon.
Korrekterweise nimmt man Index aus dem Funktionsaufruf.
strAll = ComboBox1->Items->Strings[Index];
-
Hallo,
ich versuch das Problem zu Lösen leider erfolglos???
Was kann man da machen gibt es auch andere Möglichkeit als Combobox mit spalten??Bin für jede hilfe Dankbar.
-
also mit der Änderung von kpeter (Zeile 29) sollte es jetzt eigentlich funktionieren, zumindest tut es das bei mir
-
Hi,
sorry Klasse Stimmt geht.
Habe das voll überlesen.
Danke Danke.