Einzelnen Beitrag anzeigen

SvB

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

AW: TSpTBXComboBox mit Spalten

  Alt 7. Apr 2011, 08:46
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.
Sven

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