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;
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;
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,
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;
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;
借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,