在DELPHI中有没有像VFP中的COMBOBOX控件呀,多栏显示,以第一列为默认显示值!哪 儿有!多谢!

解决方案 »

  1.   

    DELPHI好像没有,但你可以通过编程实现:例如你的数据在table1的name字段中,你可以在窗体显示时添加以下代码:
    combobox1.items.clear;
    query1.close;
    query1.sql.clear;
    query1.sql.add('select name from table');
    query1.open;
    query1.first;
    while not query1.eof do
    begin
    combobox1.items.add(query1.fields[0].asstring);
    query1.next;
    end;
    combobox1.text:=query1.fields[0].asstring;
      

  2.   

    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; 
      Index: Integer; Rect: TRect; State: TOwnerDrawState); 
    var 
      strVal, strAll: string; 
      pos1, pos2: Integer; 
      rc: TRect; 
      arrWidth: array [0..3] of Integer; 
    begin 
      Combobox1.Canvas.Brush.Style := bsSolid; 
      Combobox1.Canvas.FillRect(Rect); 
      // Die einzelnen Spalten müssen durch ';' getrennt sein 
      // the columns must be separated by ';' 
      strAll := Combobox1.Items[Index];   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 
      // Drawingrange for first column 
      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 
      // Get text for first column 
      pos1   := Pos(';', strAll); 
      strVal := Copy(strAll, 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);   // 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 := Copy(strAll, pos1 + 1, Length(strAll) - pos1); 
      pos1   := Pos(';', strAll); 
      strVal := Copy(strAll, 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);   // Zeichenbereich für dritte Spalte 
      // Drawingrange 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 := Copy(strAll, pos1 + 1, Length(strAll) - pos1); 
      pos1   := Pos(';', strAll); 
      strVal := Copy(strAll, 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 := Copy(strAll, pos1 + 1, Length(strAll) - pos1); 
    end; 
    // Example/ Beispiel: procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      with Combobox1.Items do 
      begin 
        Add('first;second;third;'); 
        Add('column1;column2;column3;'); 
      end; 
    end; 
    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
      //Oder im Objekt Inspektor einstellen 
      //Or set this Property in the Object Inspector 
      Combobox1.Style := csOwnerDrawFixed; 
    end; 
      

  3.   

    多谢TIAN!如何只显示第一列的内容呢?就你上面的例子,COMBOBOX的TEXT属性只有FIRST或COLUMN1呢?
      

  4.   

    to wuzongjie:
     借tian兄的代码一用,刚试了下。
    这样
    在这arrWidth[0] := 0; 之前加上 if odComboBoxEdit in State then
      begin
        ComboBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Copy(strAll, 1, Pos(';', StrAll) - 1));
        Exit; 
      end;当有一项被选中,state就包含有odComboBoxEdit,
      

  5.   

    非常感谢TIAN兄,老达摩!这个问题困扰了我很久!现在让我解决了,我实在是太感激你们了!
      

  6.   

    TIAN,老达摩兄:我想问一下在DELPHI中有没有像VFP中的具有以上功能的COMBOBOX控件呀