Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TSpTBXComboBox mit Spalten (https://www.delphipraxis.net/159659-tsptbxcombobox-mit-spalten.html)

SvB 7. Apr 2011 07:18

TSpTBXComboBox mit Spalten
 
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.

SvB 7. Apr 2011 07:46

AW: TSpTBXComboBox mit Spalten
 
Und falls jemand die LMDTools hat und simplen HTML-Formatierten Text ausgeben will, z.B. TeilStrings in anderer Farbe, dann könnte man das so machen:

Delphi-Quellcode:
uses StrUtils, SpTBXSkins, LMDHTMLUnit;
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;
  FRender: TLMDHTMLRender;
begin
  if PaintStage = pstPrePaint then begin
    FRender := TLMDHTMLRender.Create;
    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];
      FRender.PrepareText(aStr[i], length(aStr[i]), False);
      FRender.DrawText(ACanvas, Point(0, 0), rc, clNone);
      // Trennlinie zwischen Spalten zeichnen
      // ACanvas.MoveTo(rc.Right, rc.Top);
      // ACanvas.LineTo(rc.Right, rc.Bottom);
    end;
    FRender.Free;
  end;
end;

procedure TForm.Button1Click(Sender: TObject);
begin
  with cb.Items do
  begin
    Add('<FONT face="Default" SIZE="13px" COLOR="#FF0000">first|second|third</FONT>');   // wird in roter Schrift angezeigt
    Add('<FONT face="Default" SIZE="13px" COLOR="#0000FF">column1|column2|column3</FONT>'); // wird in blauer Schrift angezeigt
  end;
end;
Das einzige Problem, was man hier noch hat ist, dass man beim normalen Zugriff auf Items dann auch den HTML-Code mit dabei hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz