![]() |
AW: Probleme mit TextWidth im String Grid
Und wo merkst Du Dir nun die maximale Breite je Spalte? Hab ich das übersehen?
|
AW: Probleme mit TextWidth im String Grid
In der Variablen iMaxTextLength
Ich geh ja mein StringGrid Spaltenweise durch und pro Spalte merke ich mir den längsten Wert... |
AW: Probleme mit TextWidth im String Grid
Ja wann denn? Ich habe den Code gerade 4 mal durchgesehen, kann die Variable aber nirgends entdecken.
[edit] BTW: Ich würde den DRY-Code mal ein wenig entschlacken. [/edit] |
AW: Probleme mit TextWidth im String Grid
Hier ist nochmal der Source aus meinem ersten Beitrage:
Delphi-Quellcode:
Diese Routine ruf ich auf nachdem ich mein StringGrid befüllt habe... (also Schritt 2)...
procedure prTStringGridAutoFit(strgrid : TStringGrid);
var iMaxTextLength : Integer; iCol, iRow : Integer; begin //=== Auto Fit Columns ======================================================= For iCol := 0 to (strGrid.ColCount -1) Do Begin iMaxTextLength := 0; For iRow := 0 To (strGrid.RowCount - 1 ) Do Begin If strGrid.Canvas.TextWidth(strGrid.Cells[iCol, iRow]) > iMaxTextLength Then Begin iMaxTextLength := strGrid.Canvas.TextWidth(strGrid.Cells[iCol, iRow]); End; End; strGrid.ColWidths[iCol] := iMaxTextLength + 25; End; //============================================================================ end; |
AW: Probleme mit TextWidth im String Grid
Nach dem Befüllen nützt es Dir doch nichts mehr, das sagen wir doch die ganze Zeit.
|
AW: Probleme mit TextWidth im String Grid
Ok, das war ja meine Frage bzw. das was ich nicht ganz verstanden hab... Also ob mein Ablauf im Moment schon dem entspricht was ich mache...
D.h. ich muss mir die Maximal Länge im OnCellDraw merken und am Schluss vom befüllen über diesen Maximal Wert die Spaltenbreite anpassen? |
AW: Probleme mit TextWidth im String Grid
Also ich setz die Spaltenbreiten bereits beim Befüllen und ganz ohne OnCellDraw, wie man
![]()
Delphi-Quellcode:
// ********** BEFÜLLEN DES GRIDS MIT ORT-INFORMATIONEN AUS ORT-OBJEKTEN **************************************************************
Procedure TFormMain.GridFill_Orte; Var Liste, SepList : TStrings; Land : String; Breit, i,z,k,x : Integer; Start, Ende : TDateTime; Sek : Extended; Breite : Array[0..ColMax] OF Integer; // Array für die Spaltenbreiten begin Start := Now; Land := Combo_Land.Text; Label_Orte_Anzahl.Caption := 'Bitte warten ...'; Label_Orte_Dauer.Caption := 'Orts-Daten werden geladen ...'; Forms.Application.ProcessMessages; Liste := TStringList.Create; SepList := TStringList.Create; SepList.Delimiter := ';'; SepList.StrictDelimiter := True; Try Einrichten_Orte; StrGrid_Orte.Visible := False; IF HC.GetOrteFromLand(Land,Liste) THEN BEGIN z := Liste.Count; IF z > 0 THEN BEGIN FOR i := 0 TO StrGrid_Orte.ColCount -1 DO Breite[i] := StrGrid_Orte.ColWidths[i]; FOR i := 0 TO z-1 DO BEGIN SepList.DelimitedText := Liste[i]; x := SepList.Count; IF x > 0 THEN FOR k := 0 TO x-1 DO BEGIN // Zuweisung der Zell-Inhalte und Setzen der Spaltenbreiten StrGrid_Orte.RowCount := i + 2; StrGrid_Orte.Cells[k,i+1] := SepList[k]; Breit := StrGrid_Orte.Canvas.TextWidth(SepList[k]) + GridSpace; IF Breit > Breite[k] THEN Breite[k] := Breit; END; END; END; END; Finally SepList.Free; Liste.Free; Label_Orte_Anzahl.Caption := 'enthält ' + IntToStr(z)+ ' Einträge'; Breit := 55; FOR i := 0 TO ColMax DO BEGIN StrGrid_Orte.ColWidths[i] := Breite[i]; Breit := Breit + Breite[i]; END; StrGrid_Orte.Visible := True; FormMain.Width := Breit; // Die Integer-Variable Breit ist die Summe aller Werte im Breite-Array StrGrid_Orte.SetFocus; Ende := Now; Sek := DateUtils.MilliSecondsBetween(Start,Ende) / 1000; Label_Orte_Dauer.Caption := 'Ladezeit: ' + FloatToStr(Sek) + ' sec'; End; end; |
AW: Probleme mit TextWidth im String Grid
Zitat:
Delphi-Quellcode:
procedure DoOnDrawCell(...);
begin SetzeFontEigenschaften(ACol, ARow); {Zeichnen...} end; procedure prTStringGridAutoFit(strgrid : TStringGrid); var iMaxTextLength : Integer; iCol, iRow : Integer; begin //=== Auto Fit Columns ======================================================= For iCol := 0 to (strGrid.ColCount -1) Do Begin iMaxTextLength := 0; For iRow := 0 To (strGrid.RowCount - 1 ) Do Begin SetzeFontEigenschaften(iCol, iRow); If strGrid.Canvas.TextWidth(strGrid.Cells[iCol, iRow]) > iMaxTextLength Then Begin iMaxTextLength := strGrid.Canvas.TextWidth(strGrid.Cells[iCol, iRow]); End; End; strGrid.ColWidths[iCol] := iMaxTextLength + 25; End; //============================================================================ end; |
AW: Probleme mit TextWidth im String Grid
Das entspricht prinzipiell genau dem Gesagten. Und das kann man auch im OnDrawCell machen, und zwar zweckmäßigerweise vor oder hinter den DrawText-Aufrufen, da ist der aktuelle Font und der darzustellende Text bekannt.
|
AW: Probleme mit TextWidth im String Grid
Beim Scrollen führt das zu dem beschriebenen Effekt, das sich plötzlich die Breite ändert...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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-2025 by Thomas Breitkreuz