Problem mit CommaText
spacer
Autor Nachricht
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107


Delphi4
BeitragVerfasst: Do 02.02.12 20:35 
Ein freundliches Hallo an alle,

wieder mal habe ich ein Problem mit CommaText. Ich lese eine Datei in eine Stringliste. Ein darin enthaltener Datenblock wird extrahiert und in einer weiteren Stringliste der folgenden Routine übergeben:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Procedure LoadGridStrLst( G: TStringGrid; Sl : TStringList  );
var
I : Integer;
H : TStringList;
S : String;

begin
H := TStringList.Create;
H.CommaText := Sl.Strings[0];
G.ColCount := H.Count;
G.RowCount := Sl.Count;
for I := 0 to G.RowCount-1 do
begin
S := Sl.Strings[I];
G.Rows[I].commatext := S;
end;
H.Free;
end;

es geschieht folgendes:
ausblenden Quelltext markieren
1:
2:
S:                   '"01.09.2010 11:15",Termin,,,,,,,Hamburg,Fritz,,,'
G.Rows[I].commatext: '"01.09.2010 11:15",Termin,Hamburg,Fritz,,,,,,,'


Statt dessen Assign zu verwenden funktioniert nicht. Muss ich die Daten selbst auseinandernehmen? An anderer Stelle lade ich Daten direkt aus einer Datei und übertrage sie in ein StringGrid; dort funktioniert es. Anscheinend funktioniert es nur mit direkt geladenen Daten.

Hoffe jemand hat einen Tipp.

Grüße von der immer noch sonnigen Nordsee

Peter
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Administrator
Beiträge: 8371
Erhaltene Danke: 244

W2k, WXPpro
TP3 - D7pro
BeitragVerfasst: Do 02.02.12 22:38 
Moin!

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
es geschieht folgendes:
ausblenden Quelltext markieren
1:
2:
S:                   '"01.09.2010 11:15",Termin,,,,,,,Hamburg,Fritz,,,'
G.Rows[I].commatext: '"01.09.2010 11:15",Termin,Hamburg,Fritz,,,,,,,'
Das sollte nicht passieren und mit D7(pro) habe ich sowas auch noch nie beobachtet. :nixweiss:

Verwendest du tatsächlich D4 wie im Profil angegeben?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Fr 03.02.12 01:02 
Ich habe es ausprobiert. Das ist erst mit Delphi 5 korrigiert. Bei Delphi 3 passiert es, Delphi 4 habe ich zwar nicht, aber da wissen wir es ja, bei Delphi 5 läuft es korrekt. Die Erklärung findet sich im Quelltext der grids.pas, direkt auch als Kommentar:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
{ Changes the meaning of Add to mean copy to the first empty string }
function TStringGridStrings.Add(const S: string): Integer;
var
I: Integer;
begin
for I := 0 to Count - 1 do
if Strings[I] = '' then
begin
Strings[I] := S;
Result := I;
Exit;
end;
Result := -1;
end;
Add wiederum wird in SetCommaText aufgerufen. Das Verhalten ist dort also vom Prinzip her Absicht, es hat nur niemand an leere Strings gedacht. In Delphi 5 wurde das dann geändert, jetzt wird bei einem hinzugefügten Leerstring ein Leerzeichen eingefügt, damit der Platz freigehalten ist. ;-)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107


Delphi4
BeitragVerfasst: Fr 03.02.12 11:53 
Hallo Narses, hallo jaenicke,

dank Euch für die Antwort. Ich verwende tatsächlich Delphi 4.

Jaenicke, Deine Antwort erklährt einiges, aber nicht alles. Wenn ich eine Datei direkt in eine Stringliste lese und die Strings dann "StringGrid.Rows[I].CommaText" zuweise funktioniert es. Es muss also noch einen anderen Mechanismus geben. Vielleicht kann man diesen Weg nutzen.

Auf jeden Fall kann ich mir einen "work around" einfallen lassen. :D

Auch mit Leerschritt in der Datei ist der Effekt der gleiche:
ausblenden Quelltext markieren
1:
2:
S:                   '"01.09.2010 11:15",Termin, , , , , , ,Hamburg,Fritz, , ,'
G.Rows[I].CommaText: '"01.09.2010 11:15",Termin,Hamburg,Fritz,,,,,,,'


Grüße von der noch immer sonnigen Nordsee

Peter
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Fr 03.02.12 15:10 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
Auf jeden Fall kann ich mir einen "work around" einfallen lassen. :D
Der sollte einfach sein:
Eine TStringList temporär nutzen (die hat ja die veränderte Add-Methode nicht) und den Inhalt mit Assign an die Zeile übertragen.

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
Auch mit Leerschritt in der Datei ist der Effekt der gleiche:
ausblenden Quelltext markieren
1:
2:
S:                   '"01.09.2010 11:15",Termin, , , , , , ,Hamburg,Fritz, , ,'
G.Rows[I].CommaText: '"01.09.2010 11:15",Termin,Hamburg,Fritz,,,,,,,'
Weil das Leerzeichen als Trennzeichen behandelt und gelöscht wird. StrictDelimiter gab es in deiner Delphiversion wie so vieles noch nicht, damit würde man das verhindern.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107


Delphi4
BeitragVerfasst: Fr 03.02.12 17:08 
Hallo jaenicke,

danke für Deine Antwort. Und so funktioniert es: :D

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Procedure LoadGridStrLst( G: TStringGrid; Sl : TStringList  );
var
I : Integer;
H : TStringList;
S : TStringList;

begin
H := TStringList.Create;
S := TStringList.Create;
H.CommaText := Sl.Strings[0];
G.ColCount := H.Count;
G.RowCount := Sl.Count;
for I := 0 to G.RowCount-1 do
begin
S.CommaText := Sl.Strings[I];
G.Rows[I].Assign( S );
S.Clear;
end;
H.Free;
S.Free;
end;

Hatte ich zwar schon mal probiert, aber dabei einen Fehler gemacht und gefrustet aufgegeben.

Nochmals danke und Grüße von der noc immer sonnigen Nordsee

Peter
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home