![]() |
Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo,
habe in einem Stringgrid die Option goRowSizing auf True gesetzt. Damit, so glaube ich und es funktioniert, die Zeilenhöhe automatisch an den Text der Zelle angepasst. Die Zeile wird jedoch nicht automatisch kleiner, falls der Text in dieser Zelle kleiner wird. Gibt es eine Funktion, mit der ich diese Zellgrössen-Anpassung auslösen kann? Danke, Luckner. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Zitat:
Zitat:
- Man müsste also erst einmal die Höhe jeder einzelnen Zelle dieser Zeile und davon die größte Höhe bestimmen (Canvas.TextHeight()). - Oberen und unteren Rand addieren. - Eventuell bestimmte Grenzwerte berücksichtigen (minimale und maximale Höhe). - Zum Schluss StringGrid.RowHeight[] entsprechend setzen. Viel Spass beim Programmieren. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo zusammen,
für die Breite habe ich das so gemacht:
Delphi-Quellcode:
Das kann man mit ein bischen Fantasie auch problemlos auf die Zellenhöhe übertragen.
procedure HGGridColWidth(AGrid: TStringGrid; AMinWidth: Integer);
var liZ1: Integer; liZ2: Integer; liWidth: Integer; liTextWidth: Integer; liMaxWidth: Integer; const ciWidthAdd = 5; begin if (AMinWidth < 0) then begin AMinWidth := AGrid.DefaultColWidth; end; for liZ1 := 0 to (AGrid.ColCount -1) do begin // alle Spalten liMaxWidth := 0; for liZ2 := 0 to (AGrid.RowCount - 1 ) do begin // alle Zeilen liTextWidth := AGrid.Canvas.TextWidth(AGrid.Cells[liZ1, liZ2]); if (liTextWidth > liMaxWidth) then begin liMaxWidth := liTextWidth; end; end; if ((liMaxWidth + AGrid.GridLineWidth + ciWidthAdd) > AMinWidth) then begin liWidth := liMaxWidth + AGrid.GridLineWidth + ciWidthAdd; end else begin liWidth := AMinWidth; end; AGrid.ColWidths[liZ1] := liWidth; end; end; |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Ja, dass habe ich mir schon gedacht, dass man Das von Hand programmieren muss. Also alle Zellen durchgehen, die höchste Zelle aussuchen und entsprechen die Zellhöhe, für alle setzen.
Danke. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo BadenPower,
Dein Beispiel ist ein guter Ansatz. Werde es entsprechend modifizieren. Danke. Luckner. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo BadenPower,
mache mich gerade ran, Deine Routine für mich anzupassen, Brauche bitte noch einige Hinweise: Was ist AMinWidth: Integer liZ1: Integer; (kann ich mir denken) liZ2: Integer; (kann ich mir denken) liWidth: Integer; liTextWidth: Integer; (kann ich mir denken) liMaxWidth: Integer; Vor Allem AMinWith. Danke. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo zusammen,
ich dachte eigentlich bisher, dass die Variabeln selbsterklärend sind, wenn man sich den Sourcecode durchschaut. "liZ1" und "liZ2" sind reine Zählervariabeln für die Schleifen. "liTextWidth" ist der gerade ermittelte Wert der Länge des Textes der Zelle[liZ1,liZ2] In "liMaxWidth" wird der größte Wert von "liTextWidth" einer Spalte gespeichert Mit AMinWidth kannst Du festlegen wie breit die Spalte auf jeden Fall sein soll. "liWidth" ist dann die Breite der Spalte, welche ins Grid gesetzt wird. Entweder AMinWidth oder liMaxWidth, je nach dem was größer ist. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo, habe mir zu diesem Thema 3 folgende Routinen gestrickt (irgendwo im Internet gefunden und angepasst)
Delphi-Quellcode:
Jetzt werden die Zeilen im Grid höher, wenn der Inhalt der Zelle mehr wird, jedoch nicht kleiner, wenn der Inhalt weniger wird. Es funktioniert jedoch, wenn ich das Programm neu starte, wird die Zeilenhöhe wieder korrekt dargestellt. Hat Jemand eine Idee, was ich noch hier ändern müsste?
procedure TFrameAuftrag.GridPositionenDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState); var s: String; begin if Sender = nil then Exit; if not (Sender is TJvStringGrid) then Exit; with Sender as TJvStringGrid do begin s := Cells[ACol, ARow]; // Canvas.Brush.Color := Farbe; Canvas.FillRect(Rect); GrowRect(Rect, -2); UpdateRowHeight(Sender as TJvStringGrid, ARow, DrawText(Canvas.Handle, PChar(s), Length(s), Rect, DT_WordBreak) + 4); end; end; procedure TFrameAuftrag.GrowRect(var Rect: TRect; const pixel: Integer); begin Dec(Rect.Left, pixel); Inc(Rect.Right, pixel); Dec(Rect.Top, pixel); Inc(Rect.Bottom, pixel); end; procedure TFrameAuftrag.UpdateRowHeight(sg: TStringGrid; const iRow, iHeight: Integer); begin with GridPositionen do if iHeight > RowHeights[iRow] then RowHeights[iRow] := iHeight; end; Danke, Luckner |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Zitat:
2. Du sagst, was passieren soll, wenn iHeight > Zeilenhöhe ist, aber nicht, was passieren soll, wenn nicht. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo DeddyH,
1 sg habe ich geändert. Jetzt meine Änderung in der Routine, die irgendwie ein blinkendes Grid nach sich zieht.
Delphi-Quellcode:
Das ist nicht unbedigt klug von mir gewesen. Aber mehr fällt mir jetzt nicht ein. Diese Grid-Routinen (Formatierungen) kappier ich überhaupt nicht. Eine kleine Hilfe bitte.
procedure TFrameAuftrag.UpdateRowHeight(GridPositionen: TStringGrid; const iRow, iHeight: Integer);
begin with GridPositionen do if iHeight > RowHeights[iRow] then RowHeights[iRow] := iHeight else if iHeight < RowHeights[iRow] then RowHeights[iRow] := iHeight; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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 by Thomas Breitkreuz