![]() |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Das läßt sich jetzt aber zusammenfassen zu:
Delphi-Quellcode:
Ob das so gewollt ist?
procedure TFrameAuftrag.UpdateRowHeight(GridPositionen: TStringGrid; const iRow, iHeight: Integer);
begin GridPositionen.RowHeights[iRow] := iHeight end; |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo Jumpy,
das funktioniert nicht. Grid ist immer 1-Zeilig und blinkt ständig.:roll: |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Zitat:
Danach setzt Du in UpdateRowHeights die Property RowHeight auf den ermittelten Wert der aktuellen Zelle, was wiederum ein Neuzeichnen aller Zellen der Zeile hervorruft. Du musst bevor Du RowHeight einen Wert zuweist, erst ermitten, welche Zelle der ganzen Zeile den höchsten Wert hat und DIESEN Wert dann nehmen. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Hallo BadenPower,
sitze mal wieder an dem Stringrid und versuche Deinen Hinweis umzusetzen. Mit dem Ergebnis,dass diese Grid irgendt etwas macht, jedoch nicht das was ich will. Könntest Du mir bitte weiter helfe? Meine Spalte, die sich in der Höhe ändert ist die 3-te. In jeder Zeile der 3-ten Spalte steht ein Text, der verschieden lang sein kann. Luckner Habe mal zwischendurch mit dem XStringrid gespielt. Ist auch nicht schlecht. Man kann da schon einiges einstellen aber ich habe es nicht geschaft die Zeilenhöhe für verschiedene Zeilen zu ändern. Also bin wieder beim Stringrid. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Zitat:
Ein kleines schnell zusammengetipptes Beispiel, wie man so etwas machen könnte.
Delphi-Quellcode:
Ist mit Sicherheit noch verbesserungswürdig und soll als Gedankenanstoß dienen.
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, JvExGrids, JvStringGrid; type TForm2 = class(TForm) JvStringGrid1: TJvStringGrid; procedure JvStringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure SetMaxRowHeight(AGrid: TJvStringGrid; ARow: Integer); const cAddHeight = 4; var lTextHeigth: Integer; lMaxRowHeight: Integer; liZ1: Integer; lBitmap: TBitmap; lText: String; lRect: TRect; begin lMaxRowHeight := AGrid.DefaultRowHeight; lBitmap := TBitmap.Create; lBitmap.Canvas.Font := AGrid.Font; for liZ1 := 0 to AGrid.ColCount - 1 do begin lText := AGrid.Cells[liZ1, ARow]; lTextHeigth := DrawText(lBitmap.Canvas.Handle, PChar(lText), Length(lText), lRect, DT_WordBreak or DT_NOCLIP) + cAddHeight; if (lTextHeigth > lMaxRowHeight) then begin lMaxRowHeight := lTextHeigth; end; end; lBitmap.Free; if (AGrid.RowHeights[ARow] <> lMaxRowHeight) then begin AGrid.RowHeights[ARow] := lMaxRowHeight; end; end; procedure TForm2.JvStringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var lText: String; lGrid: TJvStringGrid; begin lGrid := TJvStringGrid(Sender); lText := lGrid.Cells[ACol, ARow]; lGrid.Canvas.FillRect(Rect); Dec(Rect.Left, -2); Inc(Rect.Right, -2); Dec(Rect.Top, -2); Inc(Rect.Bottom, -2); DrawText(lGrid.Canvas.Handle, PChar(lText), Length(lText), Rect, DT_WordBreak); SetMaxRowHeight(lGrid ,ARow); end; end. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Da habe ich aber ewig gebraucht, um zu verstehen, was diese vier Zeilen machen. :lol:
Delphi-Quellcode:
Ich glaube, das geht auch:
Dec(Rect.Left, -2);
Inc(Rect.Right, -2); Dec(Rect.Top, -2); Inc(Rect.Bottom, -2);
Delphi-Quellcode:
Und warum arbeitest Du nicht mit
//
InflateRect(Rect,-2,-2);
Delphi-Quellcode:
und
lGrid.Canvas.TextHeight
Delphi-Quellcode:
?
Math.Max
Und wieso verzichtest Du auf den Resourcenschutzblock, um die Verwendung der Bitmap? Fragen über Fragen :lol: |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
|
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Und wo ist der Link zur Zeilenhöhe?
|
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Zitat:
Falls Du es nicht gelesen hast: Zitat:
Zitat:
Hättest Du den Thread aufmerksam durchgelesen, so wie es sich gehört, dann wäre Dir aufgefallen, dass diese Zeilen eine reine Übernahme einer Funktion des TE sind. Aber wie üblich kommt nur BlaBla, anstatt einen verbesserten Code zu posten. Zitat:
Aber es geht hier um die Zellenhöhe. |
AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
Ich hatte gehofft, dass von Dejan Vu eine Code-Variante mit seinen Vorstellungen kommt, aber leider ist dies wie immer nicht so.
Dennoch möchte ich seine Fragen (obwohl ich nicht annehmen kann, dass sie ernst gemeint waren) noch beantworten. Zitat:
Wenn ich mit Math.Max arbeiten würde, dann würde ich in diesem Fall nur unnötig Resourcen verschwenden. Was macht die Funktion Max(a,b)?:
Delphi-Quellcode:
Und was macht der Code von mir:
function Max(const A, B: Integer): Integer;
begin if A > B then Result := A else Result := B; end;
Delphi-Quellcode:
Er macht das Gleiche, nur wesentlich effizienter.
if (lTextHeigth > lMaxRowHeight) then
begin lMaxRowHeight := lTextHeigth; end; 1. kein unnötiger Funktionsaufruf (pro Schleifendurchgang) 2. kein unnötiges Zuweisen eines Wertes (pro Schleifendurchgang) 3. keine Notwendigkeit Math in die Uses aufzunehmen Zitat:
Zitat:
Ressourcenschutzblöcke sind sinnvoll, aber bei Weiten nicht unbedingt immer notwendig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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