Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mi 20.05.20 00:13 
Hallo,
Ich habe ein Stringgrid mit einer Fix-Zeile. Setze also im Objekt-Inspektor den Wert FixedRows=1. Dann muss RowCount um mindestens 1 höher sein, also =2. Diese beiden Werte sind als absolute Zahlen einzutragen
Der RowCounter zählt jedoch ab Null. In FormCreate setzte ich den Fixtext per Schleife in alle Spalten: StringGrid1.Cells[0,j]:= Text[j] in Zeile Null.

Programmfunktionen füllen nun die einzelnen Zeilen. Es ist logisch, dass jede Programmkomponente vor dem Eintrag sich den Speicherplatz reserviert, in dem der Counter um eins erhöht wird. Im konkreten Fall führt dies zu einer Leerzeile (RowCount=2 ist die 3. sichtbare Zeile).
Geht man davon aus, dass der RowCounter schon um eins höher steht, könnte man die Daten einer Zeile direkt eintragen und anschließend den Counter erhöhen. Dann entsteht jedoch am Ende der Tabelle eine Leerzeile. Wie löst man das Problem?
Anmerkung: Setzt man im Programm den Wert RowCount:=1, dann wird automatisch der Wert FixedRows auf Null gesetzt. Lösche ich später die Gittereinträge bis auf die Fixedzeile, dann steht dort ggf. Null, was falsch wäre. D.h. der Befehl RowCount:=1 ist "verboten" wenn es Fix-Zeilen gibt.
hRb
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 20.05.20 09:08 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Wie löst man das Problemm?

Hey,
ich habe mir die TDrawGrid Komponente genommen und mir meinen eigenen TStringGrid gebaut umd das merkwürdige Verhalten wegzubekommen.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mi 20.05.20 09:41 
Hallo Sispin
Zitat:
ich habe mir die TDrawGrid Komponente genommen und mir meinen eigenen TStringGrid gebaut umd das merkwürdige Verhalten wegzubekommen.

Kannst Du freundlicherweise den Code veröffentlichen? Bin in "Vererbungslehre" nicht geschult.
Alternativ: was genau wurde im neuen TSringgrid verändert?
hRb
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 20.05.20 16:08 
Ich habe mir damit eine Kalender Komponente gebaut.
So dass farbige Felder möglich sind, Felder sich beim anclicken anders verhalten...
Insgesammt nix gewaltiges, nur damals mit Delphi7 war der StringGrid sowas von garnicht vernünftig zu nutzen dass es einfach sein musste.

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Kannst Du freundlicherweise den Code veröffentlichen? Bin in "Vererbungslehre" nicht geschult.

:zustimm:
Das Ding ist so alt dass ich mich damit nicht mehr Schöpferisch verbunden fühle, also ja.
Ich muss halt nur dran denken wenn ich am passenden Rechner sitze. :oops:

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 21.05.20 22:06 
Zitat:
Das Ding ist so alt dass ich mich damit nicht mehr Schöpferisch verbunden fühle, also ja.
Ich muss halt nur dran denken wenn ich am passenden Rechner sitze.
Habe nochmals darüber nachgedacht. Dein Angebot in Ehren, aber bemühe Dich nicht. Es muss ja noch andere Möglichkeiten geben. Es sollte ja nicht jeder eine eigene Komponente entwickeln nur damit es zwischen Fix-Zeilen keine Leerzeile gibt. Danke und Gruß
hRb
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 22.05.20 01:23 
Ich verstehe das Problem leider nicht. Wenn man noch keinen Inhalt hat, ist eine Leerzeile vorhanden, ja. Aber wo ist das ein Problem beim Füllen des Grids mit Daten?
Das ist kein Problem des Stringgrids, sondern des Codes.

Wie hier schon geschrieben ist eine Listview aber ohnehin sinnvoller.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 25.05.20 00:13 
Zitat:
Ich verstehe das Problem leider nicht. .... Wie hier schon geschrieben ist eine Listview aber ohnehin sinnvoller.

Der sichtbare "Effekt" ist im Image zu sehen (ungewollte Leerzeile).
Zitat:
Wenn man noch keinen Inhalt hat, ist eine Leerzeile vorhanden,
Richtig, es gilt aber auch: wenn FixedRow=1, dann ist gemäß Objekt-Inspektor RowCount um mindestens 1 höher; Startwert also = 2.
Zitat:
Aber wo ist das Problem beim Füllen des Grids mit Daten? Das ist kein Problem des Stringgrids, sondern des Codes.
Auch das ist richtig (ist aber auch meine Frage). Denn:
- 1. Zeile: RowCount[= 0] = Fix-Zeile (wird in FormCreate beschrieben.)
- 2. Zeile: RowCount[= 1] = Leerzeile (RowCount=2 zeigt aber auf die 3. Zeile)
- 3. Zeile: RowCount[= 2] = erster Eintrag.
Mehrere Funktionen tragen Daten ins Gitter. Der letzte Eintrag ist RowCount-1, also die zweite Zeile. Vor einem neuen Eintrag ist RowCount zu erhöhen, d.h. der nächste (bzw. der erste Nutzeintrag) ist die dritte Zeile.
Setzt man RowCount := 1 (um die 2. Zeile zu beschreiben), wird FixedRow automatisch auf Null setzt (was ja nicht gewünscht ist). Hierin sehe ich derzeit das Problem. Aus diesem "Konflikt" entsteht die Leerzeile. Etwas klarer?
hRb
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 25.05.20 05:53 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Mehrere Funktionen tragen Daten ins Gitter. [...] Aus diesem "Konflikt" entsteht die Leerzeile. Etwas klarer?
Ich vermute ja:
Du scheinst das Stringgrid zur Datenhaltung zu missbrauchen.

Normal wäre der Ablauf so:
Daten werden ermittelt, in Listen eingetragen. Dann werden diese Daten zur Anzeige an das Formular übertragen und dort in das Stringgrid eingetragen, dieses also ggf. geleert und neu gefüllt oder die neuen Daten ergänzt. Dabei hat man dann auch kein Problem zu erkennen in welchen Zeilen schon Daten sind oder ob es sich um Leerzeilen handelt.
Und wenn man Zugriff auf die Daten einer Zeile braucht, greift man auf diese Listen zu und nicht auf das Stringgrid.

Wenn du natürlich einfach in einer Funktion eine neue Zeile in das Stringgrid schreibst und dabei nur das Stringgrid selbst zur Verfügung hast, ist es natürlich unnötig kompliziert. Es würde allerdings auch reichen, wenn du dir separat in einem Feld deiner Formularklasse merkst wie viele Zeilen schon eingetragen sind.