Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Stringgrid ColWidth (https://www.delphipraxis.net/187452-stringgrid-colwidth.html)

juelin 1. Dez 2015 11:55


Stringgrid ColWidth
 
Hallo Alle,
wie kann man die ColWidth sehr groß setzen (10000 oder mehr).
StringGrid1.ColWidths[Nummer}:=10000; funktioniert nicht.
Gib es da eine Begrenzung?
Gruß Jürgen
Benutze Delphi 7

TiGü 1. Dez 2015 12:53

AW: Stringgrid ColWidth
 
in Delphi Seattle geht das
Delphi-Quellcode:
StringGrid1.ColWidths[0] := 10000;
Hast du schon mal in den Setter
Delphi-Quellcode:
procedure TCustomGrid.SetColWidths(Index: Longint; Value: Integer);
in der Unit Grids.pas reindebuggt?
Gibt es da eine Prüfung, die das verhindert?

juelin 1. Dez 2015 13:26

AW: Stringgrid ColWidth
 
Der Befehl: StringGrid1.ColWidths[2]:=10000; geht zwar
aber es werden nur 152 Zeichen des Textes angezeigt.
Der Text ist 512 Zeichen lang.

p80286 1. Dez 2015 13:28

AW: Stringgrid ColWidth
 
Zitat:

Zitat von juelin (Beitrag 1323061)
StringGrid1.ColWidths[Nummer}:=10000; funktioniert nicht.

was bedeutet "funktioniert nicht"? Der Bildschirm explodiert, das Form wird schwarz und bekommt zartrosa Punkte?

etwas genauer wäre schon nicht schlecht.

Gruß
K-H

baumina 1. Dez 2015 13:35

AW: Stringgrid ColWidth
 
Screenshot? Codezeilen? Beispielprogramm?

HolgerX 1. Dez 2015 13:39

AW: Stringgrid ColWidth
 
Selbst bei Delphi 6 geht

StringGrid1.ColWidths[1] := 10000;

Das Problem ist eher, dass die Spalte breiter ist wie die Breite des Grids und somit immer nur der linke Bereich angezeigt wird.

Wenn Du dann nach rechts Scollst, dann wandert diese (überbreite) Spallte aus der Anzeige heraus, da das Grid immer nur Spaltenweise scollt..

nahpets 1. Dez 2015 13:45

AW: Stringgrid ColWidth
 
Delphi 7

dashier funktioniert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
          i : Integer;
          s : String;
begin
  stringgrid1.ColWidths[0] := 10000;
  for i := 0 to 1024 do begin
    s := s + Chr((i mod 10) + 48);
  end;
  stringgrid1.Cells[0,1] := s;
end;
Als Ergebnis erhalte ich dieses:
Code:
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
Statt 1024 funktioniert das 10fache auch problemlos.

Uwe Raabe 1. Dez 2015 13:50

AW: Stringgrid ColWidth
 
Zitat:

Zitat von juelin (Beitrag 1323077)
Der Befehl: StringGrid1.ColWidths[2]:=10000; geht zwar
aber es werden nur 152 Zeichen des Textes angezeigt.
Der Text ist 512 Zeichen lang.

Auch das funktioniert unter Seattle wie erwartet - mal abgesehen davon, daß man das Form schon über zwei Bildschirme ziehen muss, damit es das anzeigen kann.

Vielleicht ein Hinweis: Horizontales Scrolling im Grid scrollt die Spalten aber nicht den Spalteninhalt. Wenn die Spalte also nicht komplett darstellbar ist, dann nutzt scrollen auch nichts.

juelin 1. Dez 2015 14:01

AW: Stringgrid ColWidth
 
Formular Width ist 1024
StringGrid Width ist 1008
Wenn ich Formular und StringGrid breiter mache ist der Text komplett.
Will ich aber nicht.
Warum kann man nicht weiter scrollen?

HolgerX hat recht.
gibt es da keine Möglichkeit das scrollen anders zu machen?

Perlsau 1. Dez 2015 14:54

StringGrid-Inhalte vollständig darstellen
 
Es gibt Situationen, in denen es hilfreich ist, den Abstand zum bearbeiteten Objekt etwas zu vergrößern – das altbekannte Wald-Bäume-Thema. Hier schient mir eine solche Situation zu bestehen. Erreicht werden soll, daß der Anwender beim Betrachten eines Stringgrids deren Inhalte auch dann vollständig sehen kann, wenn sie aufgrund der Spaltenbreite nicht vollständig dargestellt werden können. Die bereits vorgeschlagene Lösung, die Spaltenbreite der betreffenden Zeile ins schier Unendliche zu verbreitern, stößt dabei auf gewisse Probleme. Betrachten wir die anderen Optionen:

1. Möglichkeit: Hint einsetzen

Da es sich offenbar nur um eine problematische Spalte handelt, die zu lange Texte enthält, um vollständig darstellbar zu sein, könnte man beim Zeilenwechsel (z.B. in OnClick) die Hint-Eigenschaft des StringGrids dazu verwenden, den gesamten Text anzuzeigen. Nehmen wir an, es ist die vierte Spalte mit dem Index 3 (weil nullbasierend):
Delphi-Quellcode:
procedure TFormMain.GridClick(Sender: TObject);
begin
  Grid.Hint := Grid.Cells[3,Grid.Row];
end;
Das Property ShowHint der Grid-Komponente sollte dabei natürlich True sein. Einen Nachteil hat diese Lösung: Der Hint wird möglicherweise nicht lange genug angezeigt, um den gesamten Text lesen zu können.

2. Möglichkeit: WordWrap simulieren mit Text via Code in Zelle schreiben

Im Ereignis OnDrawCell der StringGrid-Komponente werden die Parameter Spalte (ACol) und Zeile (ARow) als Integerwerte übergeben sowie der Bereich, den die Zelle einnimmt: Integer; Rect: TRect. Nun kann man wie oben gezeigt den Text dieser Zelle daraufhin überprüfen, ob er in die Spaltenbreite hineinpaßt. Je nach Länge unterteilt man den Text dann in geeignete Teile und schreibt sie in der Zelle untereinander – ein selbstgebasteltes WordWrap also.

3. Möglichkeit: TjvDBGrid einsetzen

Das TjvDBGrid – die Jedi-Erweiterung des TDBGrid – bietet die Möglichkeit, Zeilen umzubrechen. Nun benötigt das TjvDBGrid jedoch eine Datenquelle. Diese kann man selbst erstellen, indem man ein TClientDataset verwendet und es entsprechend mit Daten befüllt. Nun weist man dem TClientDataset einfach ein DataSource zu, welches man als DataSource im entspreochenden TjvDBGrid-Property einträgt. Danach setzt man im OI das Property WordWrap auf True, wonach Zeilen, die zu lang sind, automatisch umbrochen werden. Ich hab's nicht getestet, aber das könnte der TE ja jetzt tun ...

Vielleicht gibt es noch weitere Möglichkeiten, dieses Problem zu lösen, mir fallen aber im Moment keine ein ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 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