Hallo,
ich habe ein StringGrid, welches ich mit einer CSV-Datei befülle (StringGrid1.LoadFromCSVFile(FileName, ';');). Das funktioniert so weit.
Aber nun möchte ich dynamisch einzelne Spalten ausblenden. Dazu habe ich folgende Funktion gefunden: StringGrid1.Columns.Items[x].Visible := FALSE;
Mein Problem ist, es scheint kerine Columns zu existieren.
ShowMessage('IntToStr(StringGrid1.Columns.Count)); Ergibt 0. Obwohl das Striggrid gut gefüllt ist. Wenn ich auf ein Column zugreifen möchte (StringGrid1.Columns.Items[x].Visible:=false;) dann bekomme ich auch die Meldung, dass der Index außerhalb der Grenzen liegt.
Wenn ich mit LoadFromCSV das StrigGrid befülle, müssten dann nich auch pro Spalte je ein Column-Objekt in StringGrid.Columns existieren? Oder verstehe ich hier was nicht?
liebe Grüße
StringGrid LoadFromCSV Spalten ausblenden
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2636
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: StringGrid LoadFromCSV Spalten ausblenden
Nein, die Columns-Objekte werden nicht automatisch angelegt. Müsstest du selber im Designer machen oder per Quellcode, falls das CSV-Format nicht immer gleich ist.
Du kannst aber auch so jederzeit eine Spalte ausblenden:
Du kannst aber auch so jederzeit eine Spalte ausblenden:
Code: Alles auswählen
StringGrid1.ColWidths[2] := 0;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 153
- Registriert: Sa 30. Jan 2010, 18:17
- OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: StringGrid LoadFromCSV Spalten ausblenden
Hallo,
danke für deine Antwort. Ich würde die Zeilen gerne wirklich ausblenden in der hoffnung, dass diese dann nicht mehr vom Programm berechnet werden. Die CSV-Datei kann manchmal sehr groß werden > 20k Zeilen. Mit einem "Hide" erhoffe ich mir Rechenzeit zu sparen.
Die Datein können unterschiedlich aufgebaut sein. Heißt also die Columns dynamisch erstellen...
Gibt es hierfür eine Anleitung, wie mann dies machen muss? Komme in Googel gerade nicht auf das richtige Ergebnis.
Wenn ich für jede Spalte eine Column hinzufüge ist anschließend die gasammte Tabelle überschrieben.
Ich gehe mal davon aus, dass ich die Columns mit den Daten im StringGrid verknüpfen muss? Aber Wie?
(Denn "StringGrid1.Cols[1].Strings[0]" gibt dennoch den richtigenn Wert zurück.)
liebe Grüße
danke für deine Antwort. Ich würde die Zeilen gerne wirklich ausblenden in der hoffnung, dass diese dann nicht mehr vom Programm berechnet werden. Die CSV-Datei kann manchmal sehr groß werden > 20k Zeilen. Mit einem "Hide" erhoffe ich mir Rechenzeit zu sparen.
Die Datein können unterschiedlich aufgebaut sein. Heißt also die Columns dynamisch erstellen...
Gibt es hierfür eine Anleitung, wie mann dies machen muss? Komme in Googel gerade nicht auf das richtige Ergebnis.
Wenn ich für jede Spalte eine Column hinzufüge ist anschließend die gasammte Tabelle überschrieben.
Code: Alles auswählen
for i := 0 to CSV_View_Unit.Form2.StringGrid1.ColCount-1 do begin
Form2.StringGrid1.Columns.Add;
end;
Ich gehe mal davon aus, dass ich die Columns mit den Daten im StringGrid verknüpfen muss? Aber Wie?
(Denn "StringGrid1.Cols[1].Strings[0]" gibt dennoch den richtigenn Wert zurück.)
liebe Grüße
Re: StringGrid LoadFromCSV Spalten ausblenden
Am einfachsten kann man eine CSV-Datei mit einer StringList einlesen (StringList.LoadfromFile(..)). Man muss die Datei Zeile für Zeile durchgehen und die Zeilen mit Hilfe der String-Helper-Funktion .Split() am Spaltentrennzeichen auftrennen. Das beigefügte Demo-Programm zeigt dies anhand einer einfachen Test-Datei. Es wird angenommen, dass in der 1.Zeile die Spaltenbeschriftungen stehen und nach dem Einlesen der 1.Zeile die Anzahl der Spalten bekannt ist. Das Programm verwendet gleich Grid-Columns, so dass du die unerwünschten per Visible = false ausblenden kannst.
Allerdings hat ein StringGrid den Nachteil, dass die komplette Datei auf einmal eingelesen wird, was bei SEHR großen Dateien ein Problem werden kann (aber dann hat man mMn eh schon verloren). Alternativ kann man statt einer StringListe eine normale Pascal Text-Datei nehmen und die Datei Zeile für Zeile einlesen, Rest wie oben.
Alternativ könnte man auch den TCSVParser nehmen (unit csvReadWrite), der nur immer so viel einliest wie nötig. Dazu gibt es ein Beispiel im wiki: https://wiki.lazarus.freepascal.org/Csv ... StringGrid.
Allerdings hat ein StringGrid den Nachteil, dass die komplette Datei auf einmal eingelesen wird, was bei SEHR großen Dateien ein Problem werden kann (aber dann hat man mMn eh schon verloren). Alternativ kann man statt einer StringListe eine normale Pascal Text-Datei nehmen und die Datei Zeile für Zeile einlesen, Rest wie oben.
Alternativ könnte man auch den TCSVParser nehmen (unit csvReadWrite), der nur immer so viel einliest wie nötig. Dazu gibt es ein Beispiel im wiki: https://wiki.lazarus.freepascal.org/Csv ... StringGrid.
- Dateianhänge
-
- csv_columns.zip
- (2.78 KiB) 88-mal heruntergeladen
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2636
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: StringGrid LoadFromCSV Spalten ausblenden
Thandor hat geschrieben:Ich würde die Zeilen gerne wirklich ausblenden in der hoffnung, dass diese dann nicht mehr vom Programm berechnet werden.
Was meinst du mit "berechnet"? Benutzt dein Programm die Daten aus jeder Zelle um damit Berechnungen anzustellen?
In diesem Falle wird dir das Hide nichts helfen, da die Spalten zwar nicht angezeigt werden, aber trotzdem noch da sind.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de