AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TSpTBXComboBox mit Spalten

Ein Thema von SvB · begonnen am 7. Apr 2011 · letzter Beitrag vom 7. Apr 2011
Antwort Antwort
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
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz