Dynamisches Array oder StringGrid
- stoffel_hessen
- Beiträge: 66
- Registriert: Sa 18. Jun 2022, 12:27
- OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
- CPU-Target: x86 64Bit
- Wohnort: Riedstadt
Dynamisches Array oder StringGrid
Hallo Gemeinde,
ich habe mal eine Frage, in einem Programm verwende ich einige StringGrid Tabellen zum zwischenspeichern von Informationen, welche in Semikolon separierten Dateien vorliegen. Dies Dateien werden nur eingelesen und im Programm nicht verändert, auch werden die Daten nicht dargestellt. Es befinden sich pro Zeile zwischen 2 und 6 Werten, in einer Tabelle variiert die Länge aber nicht.
Ist es hier nun sinnvoller StringGrid Tabellen zu verwenden oder dynamische Arrays.
Danke für eure Meinungen und Unterstützungen.
Gruß Christopher
ich habe mal eine Frage, in einem Programm verwende ich einige StringGrid Tabellen zum zwischenspeichern von Informationen, welche in Semikolon separierten Dateien vorliegen. Dies Dateien werden nur eingelesen und im Programm nicht verändert, auch werden die Daten nicht dargestellt. Es befinden sich pro Zeile zwischen 2 und 6 Werten, in einer Tabelle variiert die Länge aber nicht.
Ist es hier nun sinnvoller StringGrid Tabellen zu verwenden oder dynamische Arrays.
Danke für eure Meinungen und Unterstützungen.
Gruß Christopher
Gruß Christopher
- h-elsner
- Lazarusforum e. V.
- Beiträge: 282
- Registriert: Di 24. Jul 2012, 15:42
- OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
- CPU-Target: X86-64; arm 32bit
- Wohnort: Illertissen
- Kontaktdaten:
Re: Dynamisches Array oder StringGrid
Ich persönlich würde eine TStringList benutzen. Mann kann leicht auf die einzelnen Werte zugreifen: Zeilen über den Index in der Liste 0..Count-1 und die Spalten über die Position im String:
Beispiel: Substring s, Zeile i, Spalte k
Ist nur mein Geschmack, weil die StringListe eine Menge schöner Sachen mitbringt, wie z.B: aStringList.LoadFromFile, aber ob es die elegenteste Lösung ist, weiß ich nicht.
Gruß HE
Beispiel: Substring s, Zeile i, Spalte k
Code: Alles auswählen
s:=aStringList[i].Split([';'])[k];
Gruß HE
Zuletzt geändert von m.fuchs am Mo 27. Jun 2022, 23:15, insgesamt 1-mal geändert.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Dynamisches Array oder StringGrid
Hi!
StringGrid ist schon das richtige Werkzeug.
Bringt so komfortable Proceduren wie
sowie den problemlosen Zugriff auf die Zelle X/Y die hier Col/Row genannt werden.
Winni
StringGrid ist schon das richtige Werkzeug.
Bringt so komfortable Proceduren wie
Code: Alles auswählen
StringGrid.LoadFromCSVFile
Winni
Re: Dynamisches Array oder StringGrid
h-elsner, wunderst du dich warum der Text in deinem Beitrag plötzlich kursiv wird? Schaue dir den Rohtext nochmals genau an, und du wirst sehen, dass das genau da passiert, wo in deinem Text die StringList am Index i ausgelesen wird: aStringlist[ i]. Das i in eckigen Klammern ist aber der Startcode für kursive Schrift. Um das zu vermeiden, füge nach der öffnenden Klammer ein Leerzeichen ein, oder besser, weil das Code-fragment schon in einer eigenen Zeile steht, schließe den Code mit [ code]...[/ code] Tags ein:
Code: Alles auswählen
s:=aStringList[i].Split([';'])[k];
Re: Dynamisches Array oder StringGrid
Vielleicht bin ich altmodisch, aber ich würde nie eine visuelle Komponente für Non-Gui Aufgaben missbrauchen.
Ich empfehle TCSVDocument.
Ich empfehle TCSVDocument.
Code: Alles auswählen
uses csvdocument;
var CSVDoc:TCSVDocument;
begin
CSVDoc:=TCSVDocument.Create;
CSVDoc.Delimiter:=';';
CSVDoc.LoadFromFile('/home/theo/test.csv');
ShowMessage(CSVDoc.Cells[2,2]);
CSVDoc.Free;
end;
Re: Dynamisches Array oder StringGrid
Absolut! Aber auch TCSVDocument wäre mir zuviel Aufwand und Overhead, solange die Datei keine problematischen Fälle wie Zeilenumbruch oder Anführungs- oder Spaltentrennzeichen im Zell-Text o.ä. enthält. Für Quick-and-dirty reichen ein paar Zeilen mit TStringList. Ungetestet:theo hat geschrieben: Di 28. Jun 2022, 09:56 Vielleicht bin ich altmodisch, aber ich würde nie eine visuelle Komponente für Non-Gui Aufgaben missbrauchen.
Ich empfehle TCSVDocument.
Code: Alles auswählen
type
TDoubleArray2D = array of array of Double;
procedure ReadCSV(AFileName: String; out AData: TDoubleArray2D);
const
SPALTEN_TRENNER = ';'; // Spalten-Trenner soll der Strichpunkt sein. Ggfs. anpassen.
var
L: TStringList;
i, j: Integer;
sa: TStringArray;
begin
L := TStringList.Create;
try
L.LoadFromFile(AFileName);
// Ich nehme an, in der 1.Zeilen stehen die Spaltenüberschriften, und das definiert die Zahl der Spalten
sa := L[0].Split(SPALTEN_TRENNER);
SetLength(data, L.Count, Length(sa));
for i := 1 to L.Count-1 do // i beginnt mit 1, denn die Spaltenüberschriften sollen nicht ins data-Array.
begin
sa := L[i].Split(SPALTEN_TRENNER);
for j := 0 to Length(sa)-1 do
data[i,j] := StrToFloatDef(sa[j], 999.999);
end;
finally
L.Free;
end;
end;
Re: Dynamisches Array oder StringGrid
Das sehe ich nicht so. TCSVDocument ist eine saubere Lösung ohne wenn-und-aber, mit einem sehr vertretbaren Overhead.wp_xyz hat geschrieben: Di 28. Jun 2022, 13:35 Absolut! Aber auch TCSVDocument wäre mir zuviel Aufwand und Overhead, solange die Datei keine problematischen Fälle wie Zeilenumbruch oder Anführungs- oder Spaltentrennzeichen im Zell-Text o.ä. enthält. Für Quick-and-dirty reichen ein paar Zeilen mit TStringList. Ungetestet:
Was dabei der "Aufwand" sein soll, erschliesst sich mir nicht. Einfacher geht's doch nicht?
Man muss heute auf einem PC ja nun wirklich nicht jedes Byte mehr einzeln zählen, sonst kommt man nirgends hin.
Auf gewissen Microcontrollern mag das noch sein.
- stoffel_hessen
- Beiträge: 66
- Registriert: Sa 18. Jun 2022, 12:27
- OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
- CPU-Target: x86 64Bit
- Wohnort: Riedstadt
Re: Dynamisches Array oder StringGrid
Danke für deinen Beitrag, ich verwende StringGrid schon einige Jahre, wusste aber nicht das es diese Procedere gibt, hab diese immer selbst geschrieben.Winni hat geschrieben: Mo 27. Jun 2022, 22:48
StringGrid ist schon das richtige Werkzeug.
Bringt so komfortable Proceduren wie
Code: Alles auswählen
StringGrid.LoadFromCSVFile
Gruß Christopher
- stoffel_hessen
- Beiträge: 66
- Registriert: Sa 18. Jun 2022, 12:27
- OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
- CPU-Target: x86 64Bit
- Wohnort: Riedstadt
Re: Dynamisches Array oder StringGrid
Auch dir ein Dankeschön, dies kannte ich überhaupt nicht, ist auch eine Alternativetheo hat geschrieben: Di 28. Jun 2022, 09:56 Vielleicht bin ich altmodisch, aber ich würde nie eine visuelle Komponente für Non-Gui Aufgaben missbrauchen.
Ich empfehle TCSVDocument.
Gruß Christopher
Re: Dynamisches Array oder StringGrid
Bei CSV führen viele Wege nach Rom.stoffel_hessen hat geschrieben: Di 28. Jun 2022, 20:20 Auch dir ein Dankeschön, dies kannte ich überhaupt nicht, ist auch eine Alternative
Man kann es auch ganz "modern" machen:

Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
{$modeswitch nestedprocvars}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, lcsvutils, fgl;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
TCSVList = specialize TFPGObjectList<TStringList>;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var CSVList: TCSVList;
procedure CSVLineProc(Fields: TStringList);
var SL: TStringList;
begin
SL := TStringList.Create;
SL.Assign(Fields);
CSVList.Add(SL);
end;
begin
CSVList := TCSVList.Create;
LoadFromCSVFile('/home/theo/test.csv', @CSVLineProc, ';');
ShowMessage(CSVList[1][0]);
CSVList.Free;
end;
end.
Z.B Delimiter oder Zeilenumbrüche innerhalb von Anführungszeichen.
Bsp.
1eins;zwei;drei;vier
"2e
ins";"zw;ei";drei;vier
3eins;zwei;drei;vier
4eins;zwei;drei;vier
- BoraBora
- Beiträge: 50
- Registriert: So 11. Apr 2021, 16:00
- OS, Lazarus, FPC: FPC 3..2.2, L 2.2.0 , Linux Mint, WIN 10&11, Android,
- CPU-Target: xxBit
Re: Dynamisches Array oder StringGrid
Hallo Theo,
benutze bisher auch TStringgrid und würde lieber mit Non-Gui-Elementen arbeiten,
daher blöde Frage: wo finde ich denn TCSVDocument?
Schon mal Danke an dieser Stelle.
BB
benutze bisher auch TStringgrid und würde lieber mit Non-Gui-Elementen arbeiten,
daher blöde Frage: wo finde ich denn TCSVDocument?
Schon mal Danke an dieser Stelle.
BB
- stoffel_hessen
- Beiträge: 66
- Registriert: Sa 18. Jun 2022, 12:27
- OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
- CPU-Target: x86 64Bit
- Wohnort: Riedstadt
Re: Dynamisches Array oder StringGrid
Hallo,
wie Theo oben 28. Jun 2022, 09:56 schon geschrieben hatte
Code: Alles auswählen
uses csvdocument;
Gruß Christopher
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Dynamisches Array oder StringGrid
Die Frage ist nicht blöd. So wie stoffel_hessen schieb, einfach in uses aufnehmen.
Der Grund, das Paket ist im fpc enthalten und zwar unter fpcsrc/packages/fcl-base/src/csvdocument.pas .
Der Artikel in der Wiki https://wiki.freepascal.org/CsvDocument dürfte nicht mehr ganz taufrisch sein, da dort als Ort noch das Lazarus-CCR angegeben ist und noch nicht, das es auch im fpc enthalten ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- BoraBora
- Beiträge: 50
- Registriert: So 11. Apr 2021, 16:00
- OS, Lazarus, FPC: FPC 3..2.2, L 2.2.0 , Linux Mint, WIN 10&11, Android,
- CPU-Target: xxBit
Re: Dynamisches Array oder StringGrid
Vielen Dank af0815,
in der Zwischenzeit habe ich dann auch bemerkt, dass TCSVDocument in einem Package steckt...
Funktioniert jetzt.
BB
in der Zwischenzeit habe ich dann auch bemerkt, dass TCSVDocument in einem Package steckt...
Funktioniert jetzt.
BB
- stoffel_hessen
- Beiträge: 66
- Registriert: Sa 18. Jun 2022, 12:27
- OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
- CPU-Target: x86 64Bit
- Wohnort: Riedstadt
Re: Dynamisches Array oder StringGrid
Ich bin nun noch über ein kleines Problem mit StringGrid gestolpert, wie kann ich zwei csv-Dateien mit StringGrid.LoadFromCSVFile in die gleiche Tabelle laden, so das die Daten beider csv-Dateien zeitgleich im StringGrid stehen.
Das einfache laden der zweiten Datei überschreibt den Inhalt der ersten.
Das einfache laden der zweiten Datei überschreibt den Inhalt der ersten.
Gruß Christopher