StringGrid AutoAdjustColumns Probleme
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
StringGrid AutoAdjustColumns Probleme
Die in Stringgrid enthaltene procedure AutoAdjustColumns verhält sich meiner Meinung etwas komisch.
Ich wollte ein csv einlesen und dann sollte die Spaltenbreite automatisch angepasst werden.
Hierbei wir aber die Spalte "Name" zu breit bemacht. Im csv ist nicht zu erkennen was das bewirken könnte.
Anbei das Project dazu inkl. csv Datei um die es geht.
Ich wollte ein csv einlesen und dann sollte die Spaltenbreite automatisch angepasst werden.
Hierbei wir aber die Spalte "Name" zu breit bemacht. Im csv ist nicht zu erkennen was das bewirken könnte.
Anbei das Project dazu inkl. csv Datei um die es geht.
- Dateianhänge
-
GMA.zip
- (580.49 KiB) 202-mal heruntergeladen
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Ich habe den Fehler gefunden. Die LoadFromCSVFile Procedure hat ein Problem mit der Zeile 701 im CSV.
Und zwar damit ("Oberfeld "Edwinshoehe"") kommt es nicht zurecht.
Code: Alles auswählen
DA/AV-374,"Oberfeld "Edwinshoehe"",487,12.13750000,48.27850000,JN68BG,20161007,21991231,0,2,DL1DXA/P,21/06/2017,
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Oder gibt es noch eine andere Möglichkeit das CSV einzulesen, verarbeiten und dann ins Stringgrid?
StringList oder Zeile für Zeile einlesen?
StringList oder Zeile für Zeile einlesen?
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
- 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: StringGrid AutoAdjustColumns Probleme
Hi!
Nö - da ist ein Eintrag der zu dem merkwürdigen Verhalten führt:
Das ist EINE Zeile!
Garbage in - garbage out!
Winni
Nö - da ist ein Eintrag der zu dem merkwürdigen Verhalten führt:
Code: Alles auswählen
DA/AV-374 "Oberfeld ""Edwinshoehe"",487,12.13750000,48.27850000,JN68BG,20161007,21991231,0,2,DL1DXA/P,21/06/2017,
DA/AV-375,""Steinelberg" 434 12.04655000 48.83503000 JN68AU 20161011 21991231 0 0
Das ist EINE Zeile!
Garbage in - garbage out!
Winni
- 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: StringGrid AutoAdjustColumns Probleme
Hi!
Nu hab ich mit die CSV-Daten im Editor angesehen.
In der Zeile
DA/AV-374 "Oberfeld ""Edwinshoehe"",487,12.13750000,48.27850000,......
hast Du eine ungerade Anzahl von doppelten Anführungszeichen.
Ich vermute stark, dass die zwei doppelten Anführungszeichen der Fehler sind. Eins löschen!
Winni
PS.: Jo - das wars!!!!
Nu hab ich mit die CSV-Daten im Editor angesehen.
In der Zeile
DA/AV-374 "Oberfeld ""Edwinshoehe"",487,12.13750000,48.27850000,......
hast Du eine ungerade Anzahl von doppelten Anführungszeichen.
Ich vermute stark, dass die zwei doppelten Anführungszeichen der Fehler sind. Eins löschen!
Winni
PS.: Jo - das wars!!!!
Zuletzt geändert von Winni am Do 9. Apr 2020, 20:19, insgesamt 1-mal geändert.
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Danke Winni, ich werde das mal an den melden der das "Garbage in" macht.
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Ja habe ich schon, löst aber in Zukunft nicht das Problem, wie gesagt ich melde das dem Ersteller der CSV Datei.Winni hat geschrieben: DA/AV-374 "Oberfeld ""Edwinshoehe"",487,12.13750000,48.27850000,......
hast Du eine ungerade Anzahl von doppelten Anführungszeichen.
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
- 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: StringGrid AutoAdjustColumns Probleme
Sauerstoffmangel auf den Bergspitzen? ....
Ein anderer Vorschlag, falls das eine Excel-Datei ist:
Die kann fpc auch lesen!
Winni
Ein anderer Vorschlag, falls das eine Excel-Datei ist:
Die kann fpc auch lesen!
Winni
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Nein das ist keine Excel Datei die CSV wird, vermute ich, aus einer MySQL Datenbank heraus generiert. Und dann den Mitgliedern auf der Seite zum Download angeboten.
LG Maik und schöne Ostern.
LG Maik und schöne Ostern.
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
- 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: StringGrid AutoAdjustColumns Probleme
Hi!
Ich hab noch mal ein bischen losgehackt, um die CSV-Fehler loszuwerden.
edtCSVFileChange hab ich neu geschrieben und eine kleine Hilfsfunktion dazugebaut.
Es gibt ja für strings den DelimetedText, der eine String am Delimeter in Unterstrings "zersägt".
Das wurde genutzt:
Der gesamte CSV file wird in eine stringlist namens st geladen.
Die wird zeilenweise abgeklappert.
Jede Zeile wird in die stringlist fields zerlegt.
Dabei gibt der Parameter SkipLastLineBreak an, dass kein weiteres Feld mehr kommt , auch wenn das letzte Zeichen der Delimeter ist.
Der Fehler wird gerne genommen - so auch in Deiner Datei.
Weil StringGrid.InsertRowWithValues ein Array Of String und keine Stringlist braucht, muss das erst umgeformt werden in der function convert.
Wenn ich die FixedRows und FixedCols nicht erstmal auf Null stelle jammert er irgendwann nach einem crash rum, dass er keine 5000 und ein paar FixedRows abkann. ??????
Bunte Eier und schöne Tage
Winni
Ich hab noch mal ein bischen losgehackt, um die CSV-Fehler loszuwerden.
edtCSVFileChange hab ich neu geschrieben und eine kleine Hilfsfunktion dazugebaut.
Es gibt ja für strings den DelimetedText, der eine String am Delimeter in Unterstrings "zersägt".
Das wurde genutzt:
Code: Alles auswählen
function convert (stl : TStringList) : TStringArray;
var i : integer;
begin
setlength(Result,stl.count);
for i := 0 to stl.count - 1 do Result[i] := stl[i];
end;
procedure TForm1.edtCSVFileChange(Sender: TObject);
var st,fields : TStringList;
i : integer;
A: TStringArray;
begin
sg.FixedCols:= 0;
sg.FixedRows:=0;
sg.BeginUpdate;
st := TStringList.Create;
st.loadFromFile (edtCSVFile.FileName);
Fields:= TStringList.create;
Fields.Delimiter:=',';
Fields.SkipLastLineBreak;
Fields.StrictDelimiter:= true;
for i := 0 to st.Count - 1 do
begin
Fields.DelimitedText:= st[i];
A := Convert(Fields);
sg.InsertRowWithValues(i,A);
Fields.clear;
end; // i
st .free;
Fields.free;
sg.EndUpdate();
sg.AutoAdjustColumns;
sg.FixedCols:= 1;
sg.FixedRows:=1;
end;
Die wird zeilenweise abgeklappert.
Jede Zeile wird in die stringlist fields zerlegt.
Dabei gibt der Parameter SkipLastLineBreak an, dass kein weiteres Feld mehr kommt , auch wenn das letzte Zeichen der Delimeter ist.
Der Fehler wird gerne genommen - so auch in Deiner Datei.
Weil StringGrid.InsertRowWithValues ein Array Of String und keine Stringlist braucht, muss das erst umgeformt werden in der function convert.
Wenn ich die FixedRows und FixedCols nicht erstmal auf Null stelle jammert er irgendwann nach einem crash rum, dass er keine 5000 und ein paar FixedRows abkann. ??????
Bunte Eier und schöne Tage
Winni
Re: StringGrid AutoAdjustColumns Probleme
Es ist wie in Pascal: Ein String wird mit (einfachen) Anführungszeichen begrenzt. Wenn in dem String selbst ein Anührungszeichen vorkommt, dann muss man dieses doppelt nehmen. Genauso ist es hier: Wenn am Ende des problematischen Gipfels DREI (hier doppelte) Anführungszeichen stehen, dann wird alles richtig erkannt.
Deine Kunden müssten also darauf achten, standard-konforme CSV-Dateien herzustellen. Oder du musst selbst dafür Sorge tragen, dass der Fehler erkannt wird. Wenn die Dateien nicht riesig sind, reicht es wahrscheinlich, die Datei in eine StringList einzulesen, diese Zeile für Zeile zu durchlaufen und dabei nach doppelten Anführungszeichen zu durchsuchen, mit CommaText in die Bestandteile aufzutrennen und den Rows des Stringgrid zuzuweisen:DA/AV-374,"Oberfeld ""Edwinshoehe""",487,12.13750000,48.27850000,JN68BG,20161007,21991231,0,2,DL1DXA/P,21/06/2017,
Code: Alles auswählen
procedure TForm1.edtCSVFileChange(Sender: TObject);
var
L: TStrings;
i: Integer;
p: Integer;
s: String;
begin
sg.BeginUpdate;
L := TStringList.Create;
try
L.StrictDelimiter := true;
L.LoadFromFile(edtCSVFile.FileName);
sg.RowCount := L.Count+1;
for i := 0 to L.Count-1 do
begin
p := pos('""', L[i]);
if p > 0 then
begin
p := posEx('""', L[i], p+1);
if p > 0 then begin
s := Copy(L[i], 1, p) + copy(L[i], p, MaxInt);
sg.Rows[i].CommaText := s;
continue;
end;
end;
sg.Rows[i].CommaText := L[i];
end;
finally
L.Free;
sg.EndUpdate();
end;
sg.AutoAdjustColumns;
end;
- 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: StringGrid AutoAdjustColumns Probleme
Hi!
Eben dafür war meine Lösung gedacht.
Die kümmert sich nicht um eine falsche Anzahl von Anführungszeichen.
So wird die ganze Sache robuster.
Du glaubst garnicht, was ich schon alles an verhunzten CSV Dateien gesehen habe, die von Halbwissenden aus Excel oder sonstwo erstellt worden sind.
Da muss man die Einlese-Routine schon unempfindlich machen.
Winni
Eben dafür war meine Lösung gedacht.
Die kümmert sich nicht um eine falsche Anzahl von Anführungszeichen.
So wird die ganze Sache robuster.
Du glaubst garnicht, was ich schon alles an verhunzten CSV Dateien gesehen habe, die von Halbwissenden aus Excel oder sonstwo erstellt worden sind.
Da muss man die Einlese-Routine schon unempfindlich machen.
Winni
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Hi wp,wp_xyz hat geschrieben:Deine Kunden müssten also darauf achten, standard-konforme CSV-Dateien herzustellen.
Nix Kunden, das ist alles Hobby. Hier verdient und bekommt keiner Geld, nur die Hand auf die Schulter (ala gut gemacht).
Und vielleicht ein Stück Papier mit 1., ... Platz des Jahres 2020..., mehr nicht.
Ich konnte mir nur erst keinen Reim drauf machen.
Primär will ich dieses CSV in eine Sqlite DB einlesen, mit den Stringgrid wollte ich Testen ob das mit dem UTF/Unicode geschichten funktioniert.
Aber vielen lieben Dank an euch beide und schöne Ostern, Maik.
Bei Interesse hier mal schauen: https://www.cqgma.org/
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: StringGrid AutoAdjustColumns Probleme
Danke Winni, funktioniert wunderbar!Winni hat geschrieben: ...
Eben dafür war meine Lösung gedacht.
Die kümmert sich nicht um eine falsche Anzahl von Anführungszeichen.
So wird die ganze Sache robuster.
...
Schöne Ostern
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
- 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: StringGrid AutoAdjustColumns Probleme
Amateurfunk - damit kenne ich mich überhaupt nicht aus.
Aber ich bin mal darüber gestolpert, als ich über Linux-Kernel-
Parameter gelesen habe: Internet über Amateurfunk.
Da haben Leute aus Südafrika und Kentucky zusammen das
Modul entwickelt - TCP/IP über Amateurfunk - das fand ich
spannend.
Falls Du irgendwelche Probleme mit CSV-Daten hast - bescheid sagen.
Da kenn ich mich aus seit Turbo-Pascal-Zeiten.
Und dazu eine Anmerkung: Das Komma als Delimeter ist gefährlich:
Falls sich mal ein Komma in die Daten verirrt, stimmt die Zeile nicht mehr.
Besser sind solche ASCII-Exoten wie | oder µ .
Winni
Aber ich bin mal darüber gestolpert, als ich über Linux-Kernel-
Parameter gelesen habe: Internet über Amateurfunk.
Da haben Leute aus Südafrika und Kentucky zusammen das
Modul entwickelt - TCP/IP über Amateurfunk - das fand ich
spannend.
Falls Du irgendwelche Probleme mit CSV-Daten hast - bescheid sagen.
Da kenn ich mich aus seit Turbo-Pascal-Zeiten.
Und dazu eine Anmerkung: Das Komma als Delimeter ist gefährlich:
Falls sich mal ein Komma in die Daten verirrt, stimmt die Zeile nicht mehr.
Besser sind solche ASCII-Exoten wie | oder µ .
Winni