mehrere Spalten in einer TComboBox anzeigen



  • 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 die

    ComboBox1->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 | test01

    dann wenn ich mit der Mouse drüber gehe so:
    hallo | test | test01
    column1 | column2 | column3

    Liegt 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.


Anmelden zum Antworten