Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringgrid, Zeile automatisch an Textgrösse anpassen (https://www.delphipraxis.net/183053-stringgrid-zeile-automatisch-textgroesse-anpassen.html)

Jumpy 23. Apr 2015 17:41

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
Das läßt sich jetzt aber zusammenfassen zu:

Delphi-Quellcode:
procedure TFrameAuftrag.UpdateRowHeight(GridPositionen: TStringGrid; const iRow, iHeight: Integer);
begin
  GridPositionen.RowHeights[iRow] := iHeight
end;
Ob das so gewollt ist?

Luckner 26. Apr 2015 15:46

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
Hallo Jumpy,

das funktioniert nicht. Grid ist immer 1-Zeilig und blinkt ständig.:roll:

BadenPower 26. Apr 2015 17:06

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
Zitat:

Zitat von Luckner (Beitrag 1299313)
Hallo Jumpy,
das funktioniert nicht. Grid ist immer 1-Zeilig und blinkt ständig.:roll:

Das ist ja logisch, dass das "blinken" muss, denn Du ermittest in der DrawCell-Methode immer nur die Höhe der aktuellen Zelle.

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.

Luckner 4. Mai 2015 18:11

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.

BadenPower 8. Mai 2015 21:04

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
Zitat:

Zitat von Luckner (Beitrag 1300211)
sitze mal wieder an dem Stringrid und versuche Deinen Hinweis umzusetzen.

Sorry, ich hatte Deine Hilfesuche leider vergessen und daher Danke für die Erinnerung per PN.


Ein kleines schnell zusammengetipptes Beispiel, wie man so etwas machen könnte.

Delphi-Quellcode:
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.
Ist mit Sicherheit noch verbesserungswürdig und soll als Gedankenanstoß dienen.

Dejan Vu 9. Mai 2015 09:34

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:
Dec(Rect.Left, -2);
Inc(Rect.Right, -2);
Dec(Rect.Top, -2);
Inc(Rect.Bottom, -2);
Ich glaube, das geht auch:
Delphi-Quellcode:
//
InflateRect(Rect,-2,-2);
Und warum arbeitest Du nicht mit
Delphi-Quellcode:
lGrid.Canvas.TextHeight
und
Delphi-Quellcode:
Math.Max
?
Und wieso verzichtest Du auf den Resourcenschutzblock, um die Verwendung der Bitmap?

Fragen über Fragen :lol:

hathor 9. Mai 2015 10:27

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
http://www.delphipraxis.net/25365-op...ringgrids.html

DeddyH 9. Mai 2015 12:25

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
Und wo ist der Link zur Zeilenhöhe?

BadenPower 9. Mai 2015 19:59

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1300801)
Fragen über Fragen :lol:

Die Antwort hierauf verbirgt sich schon im Post über Deinem.

Falls Du es nicht gelesen hast:
Zitat:

Zitat von BadenPower (Beitrag 1300771)
Ist mit Sicherheit noch verbesserungswürdig und soll als Gedankenanstoß dienen.


Zitat:

Zitat von Dejan Vu (Beitrag 1300801)
Da habe ich aber ewig gebraucht, um zu verstehen, was diese vier Zeilen machen. :lol:
Delphi-Quellcode:
Dec(Rect.Left, -2);
Inc(Rect.Right, -2);
Dec(Rect.Top, -2);
Inc(Rect.Bottom, -2);

Das Du das nicht verstanden hast, liegt daran, dass Du die Code-Schnipsel des TE nicht gelesen hast.

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:

Zitat von hathor (Beitrag 1300803)

Zur Zellenbreite hatte ich ja bereits auf der 1. Seite etwas Code gepostet.

Aber es geht hier um die Zellenhöhe.

BadenPower 12. Mai 2015 15:33

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:

Zitat von Dejan Vu (Beitrag 1300801)
Und warum arbeitest Du nicht mit ....
Delphi-Quellcode:
Math.Max
?

Diese Frage ist ganz einfach zu beantworten:
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:
function Max(const A, B: Integer): Integer;
begin
  if A > B then
    Result := A
  else
    Result := B;
end;
Und was macht der Code von mir:
Delphi-Quellcode:
  if (lTextHeigth > lMaxRowHeight) then
   begin
    lMaxRowHeight := lTextHeigth;
   end;
Er macht das Gleiche, nur wesentlich effizienter.

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 von Dejan Vu (Beitrag 1300801)
Und warum arbeitest Du nicht mit
Delphi-Quellcode:
lGrid.Canvas.TextHeight

Weil es damit nicht funktioniert.

Zitat:

Zitat von Dejan Vu (Beitrag 1300801)
Und wieso verzichtest Du auf den Resourcenschutzblock, um die Verwendung der Bitmap?

Man mag ja anderer Meinung sein, aber wenn es beim Erstellen des Bitmap mit Bitmap.Create() und beim Schreiben auf dessen Canvas knallt, dann hab ich ein ganz anderes Problem.

Ressourcenschutzblöcke sind sinnvoll, aber bei Weiten nicht unbedingt immer notwendig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 Uhr.
Seite 2 von 3     12 3      

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