AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Stringgrid, Zeile automatisch an Textgrösse anpassen
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid, Zeile automatisch an Textgrösse anpassen

Ein Thema von Luckner · begonnen am 8. Dez 2014 · letzter Beitrag vom 19. Mai 2015
Antwort Antwort
Seite 2 von 3     12 3      
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#11

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 23. Apr 2015, 16:41
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?
Ralph
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 26. Apr 2015, 14:46
Hallo Jumpy,

das funktioniert nicht. Grid ist immer 1-Zeilig und blinkt ständig.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#13

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 26. Apr 2015, 16:06
Hallo Jumpy,
das funktioniert nicht. Grid ist immer 1-Zeilig und blinkt ständig.
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 4. Mai 2015, 17:11
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#15

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 8. Mai 2015, 20:04
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#16

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 9. Mai 2015, 08:34
Da habe ich aber ewig gebraucht, um zu verstehen, was diese vier Zeilen machen.
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 lGrid.Canvas.TextHeight und Math.Max ?
Und wieso verzichtest Du auf den Resourcenschutzblock, um die Verwendung der Bitmap?

Fragen über Fragen
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#17

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 9. Mai 2015, 09:27
http://www.delphipraxis.net/25365-op...ringgrids.html
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 9. Mai 2015, 11:25
Und wo ist der Link zur Zeilenhöhe?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#19

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 9. Mai 2015, 18:59
Fragen über Fragen
Die Antwort hierauf verbirgt sich schon im Post über Deinem.

Falls Du es nicht gelesen hast:
Ist mit Sicherheit noch verbesserungswürdig und soll als Gedankenanstoß dienen.

Da habe ich aber ewig gebraucht, um zu verstehen, was diese vier Zeilen machen.
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.


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

Aber es geht hier um die Zellenhöhe.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#20

AW: Stringgrid, Zeile automatisch an Textgrösse anpassen

  Alt 12. Mai 2015, 14:33
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.

Und warum arbeitest Du nicht mit .... 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


Und warum arbeitest Du nicht mit lGrid.Canvas.TextHeight
Weil es damit nicht funktioniert.

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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz