Einzelnen Beitrag anzeigen

SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

TSpTBXComboBox mit Spalten

  Alt 7. Apr 2011, 08:18
Falls das jemand mal braucht... Einige Zeilen stammen von hier.

Delphi-Quellcode:
uses StrUtils, SpTBXSkins;
procedure TForm.cbDrawItem(Sender: TObject; ACanvas: TCanvas; var ARect: TRect; Index: Integer;
  const State: TOwnerDrawState; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean);
var
  rc: TRect;
  arrWidth: array [0 .. 2] of Integer;
  aStr: TStringDynArray;
  i: Integer;
  xLeft: Integer;
  Flags: Integer;
begin
  if PaintStage = pstPrePaint then begin
    ACanvas.Brush.Style := bsSolid;
    PaintDefault := False;
    Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);

    // Die einzelnen Spalten müssen durch '|' getrennt sein
    aStr := SplitString(TSpTBXComboBox(Sender).Items[Index], '|');

    // Die einzelnen Spaltenbreiten, hier sind es drei Spalten
    arrWidth[0] := 30; // Width of column 1
    arrWidth[1] := 120; // Width of column 2
    arrWidth[2] := 70; // Width of colimn 3

    rc.Top := ARect.Top;
    rc.Bottom := ARect.Bottom;
    xLeft := 0;

    for i := Low(aStr) to High(aStr) do begin
      rc.Left := ARect.Left + xLeft + 2;
      rc.Right := xLeft + arrWidth[i] - 2;
      xLeft := xLeft + arrWidth[i];
      SpDrawXPText(ACanvas, aStr[i], rc, Flags);
      // Trennlinie zwischen Spalten zeichnen
      // ACanvas.MoveTo(rc.Right, rc.Top);
      // ACanvas.LineTo(rc.Right, rc.Bottom);
    end;
  end;
end;

procedure TForm.Button1Click(Sender: TObject);
begin
  with cb.Items do
  begin
    Add('first|second|third;');
    Add('column1|column2|column3;');
  end;
end;
Einige Prüfungen fehlen hier noch, die kann dann ja jeder selbst noch hinzufügen, z.B. wenn mehr Spalten in cb.Add() hinzugefügt wurden, als im Code mit arrWidth angegeben.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat