Frage

Ich mag eine feste Reihe als Header haben, aber die Texte sind ziemlich lang, so dass ich die Zeilenhöhe erhöhen möchte und Einsatz CR / LF in die Zelle Text.

Googeln zeigt dies als Lösung (und es ist das erste, was ich dachte, fo vor googeln), aber es down't zur Arbeit zu sehen. Irgendwelche Ideen?

Grid.Cells[2,3] := 'This is a sample test' + #13#10 + 'This is the second line';

Was passiert, ist, dass die Zelle enthält This is a sample testThis is the second line

(Delphi 7, wenn es einen Unterschied macht)

[Bounty] „Mein schlecht. Ich vergeben eigentlich dieses eine Antwort vor zwei Jahren, ohne zu überprüfen und jetzt feststellen, dass die Antwort nicht funktioniert hat. Aplogies für jeden, der die Irre geführt wurde. Dies ist ein FABOWAQ (häufig gestellte, oft falsch beantworteten Frage ). GINYF“.

Ich nehme an, wir suchen OnDrawCell zu verwenden, aber vorstellen, dass wir auch die Höhe der Strings Startreihe erhöhen müssen, die die Zelle enthält.

Ich werde vergeben, die Antwort für beiden Codes oder eine FOSS VCL-Komponente.

[Update] Muss Arbeit mit Delphi XE2 Starter Edition

War es hilfreich?

Lösung

TStringGrid Verwendungen Canvas.TextRect, die verwendet DrawText Routine. Siehe zum Beispiel auf href="https://stackoverflow.com/a/7010216/757830"> wie DrawText für mehrzeiligen Text zu verwenden, und diese letzte Antwort auf, wie benutzerdefinierte implementieren in OnDrawCell Zeichnung:

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    procedure FillWithRandomText(AGrid: TStringGrid);
    procedure UpdateRowHeights(AGrid: TStringGrid);
  end;

procedure TForm1.FillWithRandomText(AGrid: TStringGrid);
const
  S = 'This is a sample'#13#10'text that contains'#13#10'multiple lines.';
var
  X: Integer;
  Y: Integer;
begin
  for X := AGrid.FixedCols to AGrid.ColCount - 1 do
    for Y := AGrid.FixedRows to AGrid.RowCount - 1 do
      AGrid.Cells[X, Y] := Copy(S, 1, 8 + Random(Length(S) - 8));
  UpdateRowHeights(AGrid);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FillWithRandomText(StringGrid1);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with TStringGrid(Sender) do
    if Pos(#13#10, Cells[ACol, ARow]) > 0 then
    begin
      Canvas.FillRect(Rect);
      Inc(Rect.Left, 2);
      Inc(Rect.Top, 2);
      DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect,
        DT_NOPREFIX or DT_WORDBREAK);
    end;
end;

procedure TForm1.UpdateRowHeights(AGrid: TStringGrid);
var
  Y: Integer;
  MaxHeight: Integer;
  X: Integer;
  R: TRect;
  TxtHeight: Integer;
begin
  for Y := AGrid.FixedRows to AGrid.RowCount - 1 do
  begin
    MaxHeight := AGrid.DefaultRowHeight - 4;
    for X := AGrid.FixedCols to AGrid.ColCount - 1 do
    begin
      R := Rect(0, 0, AGrid.ColWidths[X] - 4, 0);
      TxtHeight := DrawText(AGrid.Canvas.Handle, PChar(AGrid.Cells[X, Y]), -1,
        R, DT_WORDBREAK or DT_CALCRECT);
      if TxtHeight > MaxHeight then
        MaxHeight := TxtHeight;
    end;
    AGrid.RowHeights[Y] := MaxHeight + 4;
  end;
end;

Default String


Es gibt auch andere String Komponenten können mehrzeiligen Text zu zeichnen. Zum Beispiel diesen einen , die ich selbst geschrieben hätte (Download-Quellen: < a href = "https://svn.apada.nl/svn/NLDelphi-opensource/walterheck/nldstringgrid/" rel = "nofollow noreferrer"> NLDStringGrid + NLDSparseList ) mit möglicherweise dieses Ergebnis:

NLDStringGrid

var
  R: TRect;
begin
  NLDStringGrid1.Columns.Add;
  NLDStringGrid1.Columns.Add;
  NLDStringGrid1.Cells[1, 1] := 'Sample test'#13#10'Second line';
  NLDStringGrid1.Columns[1].MultiLine := True;
  NLDStringGrid1.AutoRowHeights := True;
  SetRect(R, 2, 2, 3, 3);
  NLDStringGrid1.MergeCells(TGridRect(R), True, True);
  NLDStringGrid1.ColWidths[2] := 40;
  NLDStringGrid1.Cells[2, 2] := 'Sample test'#13#10'Second line';
end;

Andere Tipps

Der Standard-Renderer des TStringGrid unterstützen nicht mehr Linien. Durch die Einstellung der TStringGrid in OwnerDraw Modus (durch das OnDrawCell Ereignis Aufruf) Sie jede Zelle durch Ihren eigenen Wünschen machen können.

Hier finden Sie aktuelle diese für ein Beispiel, das einen vorherigen Benutzer geholfen.

Verknüpfte Referenzcode eingefügt:

procedure DrawSGCell(Sender : TObject; C, R : integer; Rect : TRect;
          Style : TFontStyles; Wrap : boolean; Just : TAlignment;
          CanEdit : boolean);
  { draws formatted contents in string grid cell at col C, row R;
    Style is a set of fsBold, fsItalic, fsUnderline and fsStrikeOut;
    Wrap invokes word wrap for the cell's text; Just is taLeftJustify,
    taRightJustify or taCenter; if CanEdit false, cell will be given 
    the background color of fixed cells; call this routine from 
    grid's DrawCell event }
var
  S        : string;
  DrawRect : TRect;
begin
  with (Sender as tStringGrid), Canvas do begin
    { erase earlier contents from default drawing }
    if (R >= FixedRows) and (C >= FixedCols) and CanEdit then
      Brush.Color:= Color
    else
      Brush.Color:= FixedColor;
    FillRect(Rect);
    { get cell contents }
    S:= Cells[C, R];
    if length(S) > 0 then begin
      case Just of
        taLeftJustify  : S:= ' ' + S;
        taRightJustify : S:= S + ' ';
        end;
      { set font style }
      Font.Style:= Style;
      { copy of cell rectangle for text sizing }
      DrawRect:= Rect;
      if Wrap then begin
        { get size of text rectangle in DrawRect, with word wrap }
        DrawText(Handle, PChar(S), length(S), DrawRect,
          dt_calcrect or dt_wordbreak or dt_center);
        if (DrawRect.Bottom - DrawRect.Top) > RowHeights[R] then begin
          { cell word-wraps; increase row height }
          RowHeights[R]:= DrawRect.Bottom - DrawRect.Top;
          SetGridHeight(Sender as tStringGrid);
          end
        else begin
          { cell doesn't word-wrap }
          DrawRect.Right:= Rect.Right;
          FillRect(DrawRect);
          case Just of
            taLeftJustify  : DrawText(Handle, PChar(S), length(S), DrawRect,
                               dt_wordbreak or dt_left);
            taCenter       : DrawText(Handle, PChar(S), length(S), DrawRect,
                               dt_wordbreak or dt_center);
            taRightJustify : DrawText(Handle, PChar(S), length(S), DrawRect,
                               dt_wordbreak or dt_right);
            end;
          end
        end
      else
        { no word wrap }
        case Just of
          taLeftJustify  : DrawText(Handle, PChar(S), length(S), DrawRect,
                             dt_singleline or dt_vcenter or dt_left);
          taCenter       : DrawText(Handle, PChar(S), length(S), DrawRect,
                             dt_singleline or dt_vcenter or dt_center);
          taRightJustify : DrawText(Handle, PChar(S), length(S), DrawRect,
                             dt_singleline or dt_vcenter or dt_right);
          end;
      { restore no font styles }
      Font.Style:= [];
      end;
    end;
end;

ich denke, das gut funktionieren wird für Sie ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top