![]() |
Delphi-Version: 5
Probleme mit TextWidth im String Grid
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mir eine Funktion gebastelt mit der ich die Spaltenbreiten in einem StringGrid automatisch ermittle:
Delphi-Quellcode:
In meinem aktuelle StringGrid habe ich unterschiedliche Schriftgrößen und Formattierungen (Fett, usw.)...
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; An was Orientiert sich denn die TextWidth Funktion? Nimmt es zur Berrechnung der Text Länge zufällig die Größte Schriftgröße? Weil in meinem aktuellen Fall habe ich das Problem das ich in der ersten Spalte in kleinerer Schrift lange Texte hab und darunter einen kurzen Text mit einer größeren Schriftgröße und meine Spaltebreite absolut nicht zu den Text längen passt...? |
AW: Probleme mit TextWidth im String Grid
Ich fürchte, das wird nicht funktionieren. Man kann einem StringGrid nur einen Font zuweisen, will man mehrere verwenden, muss man eben selbst zeichnen. Canvas.TextWidth dürfte sich aber lediglich auf den dem Grid-Canvas aktuell zugewiesenen Font orientieren.
|
AW: Probleme mit TextWidth im String Grid
Vielleicht hab ich mich falsch ausgedrückt...
Ich verwende nur eine Art von Font, diese aber in unterschiedlichen Schriftgrößen! Deshalb meine Frage ob sich TextWidth an der größten Schriftgröße orientiert? |
AW: Probleme mit TextWidth im String Grid
Du zeichnest aber doch selber im OnDrawCell, oder wie bekommst Du die unterschiedlichen Schriftgrößen hin? Und dazu setzt Du dann StringGrid.Canvas.Font.Size. TextWidth wird dann aus dem aktuell zugewiesenen Font errechnet und nicht aus dem, den die Zeichenfläche zwischenzeitlich mal hatte.
|
AW: Probleme mit TextWidth im String Grid
Also muss die Zuweisung der Schrift-Attribute vor der Größenbestimmung genauso erfolgen, wie vor dem Zeichnen.
Am besten in einer Prozedur kapseln, die in beiden Fällen pro Spalte oder Zelle aufgerufen wird. |
AW: Probleme mit TextWidth im String Grid
Zitat:
|
AW: Probleme mit TextWidth im String Grid
Du kannst ganz einfach im OnDrawCell-Event die Spaltenbreite anpassen: Einfach vor dem Zeichnen prüfen, ob es reinpassen würde. Wenn nicht: Breite setzen.
Hat nur den Nachteil, das es beim Scrollen zuppelt, wenn dann plötzlich ein breiter Text erscheint. |
AW: Probleme mit TextWidth im String Grid
Zitat:
|
AW: Probleme mit TextWidth im String Grid
Da sowohl Cols als auch Rows von TStringGrid TStrings sind, könnte man auch theoretisch den jeweiligen Font in dessen Objects-Eigenschaft ablegen. Damit kann man dann dynamisch breiter/schmaler schalten oder die optimale Spaltenbreite berechnen.
|
AW: Probleme mit TextWidth im String Grid
Vielen Dank für die vielen Antworten...
Zitat:
Ich versteh was Ihr meint und ich mein ich hab das auch schon so umgesetzt... Korrigiert mich wenn ich falsch liege... Also hier mein Ablauf: 1. Daten in StringGrid schreiben 2. Aufruf der Routine aus meinem ersten Beitrag um die Spalten Breite festzulegen So sollte ich doch eigentlich die maximale länge erhalten und die Spalten Breite optimal anpassen können? Anbei noch der Source aus dem OnDrawCell:
Delphi-Quellcode:
procedure Teancheck_eanscan_form.strgrid_eancheckDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var fntSize : Integer; s : String; fntAlignment : TAlignment; begin //=== Format Settings for Current Scan ======================================= //Headers fntAlignment := taLeftJustify; If ARow In [0,1,2,4,5,7,8] Then Begin strgrid_eancheck.Canvas.Brush.Color := $00A2FBF7; strgrid_eancheck.Canvas.Font.Color := clBlack; strgrid_eancheck.Canvas.Font.Size := 9; strgrid_eancheck.Canvas.Font.Name := 'Trebuchet MS'; strgrid_eancheck.Canvas.Font.Style := strgrid_eancheck.Canvas.Font.Style + [fsBold]; End; //Data If ARow In [3,6,9] Then Begin strgrid_eancheck.Canvas.Brush.Color := $00CCFDFB; strgrid_eancheck.Canvas.Font.Color := clBlack; strgrid_eancheck.Canvas.Font.Size := 11; strgrid_eancheck.Canvas.Font.Name := 'Trebuchet MS'; strgrid_eancheck.Canvas.Font.Style := strgrid_eancheck.Canvas.Font.Style + [fsBold]; End; //============================================================================ //=== Format Settings for Previous Scan ====================================== //Headers fntAlignment := taLeftJustify; If ARow In [12,13,14,16,17,19,20] Then Begin strgrid_eancheck.Canvas.Brush.Color := $00D8D8D8; strgrid_eancheck.Canvas.Font.Color := clBlack; strgrid_eancheck.Canvas.Font.Size := 9; strgrid_eancheck.Canvas.Font.Name := 'Trebuchet MS'; strgrid_eancheck.Canvas.Font.Style := strgrid_eancheck.Canvas.Font.Style + [fsBold]; End; //Data If ARow In [15,18,21] Then Begin strgrid_eancheck.Canvas.Brush.Color := $00E5E5E5; strgrid_eancheck.Canvas.Font.Color := clBlack; strgrid_eancheck.Canvas.Font.Size := 11; strgrid_eancheck.Canvas.Font.Name := 'Trebuchet MS'; strgrid_eancheck.Canvas.Font.Style := strgrid_eancheck.Canvas.Font.Style + [fsBold]; End; //============================================================================ //=== Format Settings for selected Cell ====================================== fntAlignment := taLeftJustify; If ARow In [0,1,2,4,5,7,8,12,13,14,16,17,19,20] Then fntSize := 9 Else fntSize := 10; If (gdSelected In State) Then Begin strgrid_eancheck.canvas.Brush.Color := clHighlight; strgrid_eancheck.Canvas.Font.Color := clWhite; strgrid_eancheck.Canvas.Font.Size := fntSize; strgrid_eancheck.Canvas.Font.Name := 'Trebuchet MS'; strgrid_eancheck.Canvas.Font.Style := strgrid_eancheck.Canvas.Font.Style + [fsBold]; End; //============================================================================ //=== Drawing ================================================================ strgrid_eancheck.canvas.FillRect(Rect); s := strgrid_eancheck.Cells[ACol, ARow]; strgrid_eancheck.canvas.FillRect(Rect); If fntAlignment = taLeftJustify Then DrawText(strgrid_eancheck.Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER); If fntAlignment = taRightJustify Then DrawText(strgrid_eancheck.canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_RIGHT or DT_VCENTER); If fntAlignment = taCenter Then DrawText(strgrid_eancheck.canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); //============================================================================ end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 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