Hallo Genaral2003,
ich hab' das zwar nicht mir einer ComboBox gemacht, sondern mit einer ListBox, dürfte aber wohl so ähnlich funktionieren.
Code:
{ lbxOrt.Style muß auf lbOwnerDrawFixed gesetzt sein für eigene Auswahlliste
Ergebnis: 2-spaltige Tabelle (mehr ist möglich}
procedure TFKasse.lbxOrtDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
const
mx = 2; // = Anzahl der Spalten
arrWidth : array[0..mx] of integer = (0,120,150);
var
strVal, strAll : string;
i, pos1 : integer;
rc : TRect;
begin
lbxOrt.Canvas.Brush.Style := bsSolid;
lbxOrt.Canvas.FillRect(Rect);
// nur zur Sicherheit:
arrWidth[mx] := lbxOrt.Width;
// oben und unten bleiben unverändert
rc.Top := Rect.Top;
rc.Bottom := Rect.Bottom;
{ Die einzelnen Spalten müssen durch ';' getrennt sein }
strAll := lbxOrt.Items[Index]; // z.B.: "Ortename;12345"
for i := 0 to High(arrWidth) - 1 do begin
{ Zeichenbereich für erste Spalte }
rc.Left := Rect.Left + arrWidth[i] + 2;
rc.Right := Rect.Left + arrWidth[i+1] - 2;
{ Text für erste Spalte ausfiltern }
pos1 := Pos(';', strAll);
if pos1 > 0
then strVal := Copy(strAll, 1, pos1 - 1)
else strVal := strAll;
{ Text ausgeben }
lbxOrt.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);
{ Trennlinie zwischen Spalten zeichnen }
lbxOrt.Canvas.MoveTo(rc.Right, rc.Top);
lbxOrt.Canvas.LineTo(rc.Right, rc.Bottom);
{ Text für nächste Spalte ausfiltern }
strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);
end;
end;
Das Ergebnis, zweispaltige Liste Ort | Plz, habe ich als Bild hinterlegt.
mfg
eddy