Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Append geht nicht korrekt!
D. Annies - Mi 21.04.10 10:32
Titel: Append geht nicht korrekt!
Hi, Delpher,
die TextDatei to_do.txt ist nicht vorhanden - sie wird erstellt = ok
sie ist vorhanden, es wird Text angehängt = ok
es wird noch einmal Text angehängt = ok
ich lösche aus der Textdatei einige Zeilen und speichere ab = ok
dann will ich erneut Text anhängen, es werden nur irgendwelche
Sonderzeichen eingetragen == NICHT OK !!
Den Code habe ich zur Sicherheit mit angegeben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| AssignFile(t1, label30.caption + 'OUTTXT\to_do.txt'); if FileExists(label30.caption + 'OUTTXT\to_do.txt') then begin Append(t1) end else begin Rewrite(t1) end;
for k := 1 to 3 do writeln(t1); writeln(t1, 'Übereinstimmungen, Abweichungen und Fehler in der Büchertabelle: ', datetostr(now) + ' ' + timetostr(time)); writeln(t1); gauge1.MinValue := 0; gauge1.MaxValue := QBuecher.recordcount; screen.Cursor := crhourglass; QBuecher.first; k := 1; gauge1.Visible := true; while not qBuecher.eof do begin gauge1.Progress := k; gef1 := TbBuchstamm.locate('TITEL', QBuecher.fieldbyname('TITEL').asstring, []); gef2 := TbLektstamm.locate('TITEL', QBuecher.fieldbyname('TITEL').asstring, []); if gef1 or gef2 then begin ages := 0; aakt := 0; if gef1 then begin aTit := TbBuchstamm.fieldbyname('Titel').AsString; ages := TbBuchstamm.fieldbyname('GES').asinteger; aakt := TbBuchstamm.fieldbyname('AKT').asinteger; end else if gef2 then begin aTit := TbLektstamm.fieldbyname('Titel').AsString; ages := TbLektstamm.fieldbyname('GES').asinteger; aakt := TbLektstamm.fieldbyname('AKT').asinteger; end;
tt := QBuecher.fieldbyname('TITEL').asstring; n1 := 0; n2 := 0; repeat inc(n1); if QBuecher.fieldbyname('A_DATUM').asstring = '' then inc(n2); QBuecher.next; inc(k); until (QBuecher.Fieldbyname('TITEL').asstring <> tt) or QBuecher.eof;
if n1 <> ages then writeln(t1, format('%-45s', [aTit]), ' GesAnz falsch ', format('%5s', [inttostr(n1)]), ' ');
if n2 <> aakt then writeln(t1, format('%-45s', [aTit]), ' AktAnz falsch! ', format('%5s', [inttostr(n2)])); end else begin writeln(t1, 'Buch ', QBuecher.fieldbyname('TITEL').asstring, ' fehlt in der Stammdatei!'); helpstr := QBuecher.fieldbyname('TITEL').asstring; repeat QBuecher.next; until QBuecher.fieldbyname('TITEL').asstring <> helpstr; end; end; |
Was kann da bloß los sein??
Danke für Hilfe / Lösungen (äh, eine reicht :)) )
Gruß, Detlef
Chemiker - Mi 21.04.10 10:59
Hallo D.Annies,
auf jeden Fall mal IOResult einsetzen für E/A-Operation.
Bis bald Chemiker
delphi10 - Mi 21.04.10 12:20
Vorher:
{$I-}
Nachher:
{$I+}
sonst wirds nix mit IOResult. Zu beginn mal den IOResult abfragen um den Puffer zu löschen. Sonst zeigt dir IOResult bei der ersten Abfrage möglicherweise einen alten Fehler an der mit dieser Procedure nichts zu tun hat.
Tastaro - Mi 21.04.10 13:29
AssignFile sehe ich, Append und Rewrite auch. Gibt es auch ein Close?
Beste Grüße
D. Annies - Do 22.04.10 07:46
Ja, close hatte ich nicht vergessen, auf diesem Schnipsel aber vergessen, ihn hinzuschreiben - danke für deine Aufmerksamkeit. Nein, ich dachte, IOResult wäre langsam out, deshalb habe ich jetzt mal eine Stringlist genommen, aber jetzt ist es noch schlechter, jetzt werden nicht nur Steuerzeichen angehängt, sondern die - vorher aus 15 Zeilen bestehende Textdatei besteht dann aus EINER Zeile mit Steuerzeichen:
Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| if FileExists(label30.caption + 'OUTTXT\to_do.txt') then begin strliste := Tstringlist.create; strliste.loadfromfile(label30.caption+'OUTTXT\to_do.txt'); for k := 1 to 3 do strliste.append(' '); strliste.Append('Übereinstimmungen, Abweichungen und Fehler in der Büchertabelle: ' + datetostr(now) + ' ' + timetostr(time)); strliste.append(' '); gauge1.MinValue := 0; gauge1.MaxValue := QBuecher.recordcount; screen.Cursor := crhourglass; QBuecher.first; k := 1; gauge1.Visible := true; while not qBuecher.eof do begin gauge1.Progress := k; gef1 := TbBuchstamm.locate('TITEL', QBuecher.fieldbyname('TITEL').asstring, []); gef2 := TbLektstamm.locate('TITEL', QBuecher.fieldbyname('TITEL').asstring, []); if gef1 or gef2 then begin ages := 0; aakt := 0; if gef1 then begin aTit := TbBuchstamm.fieldbyname('Titel').AsString; ages := TbBuchstamm.fieldbyname('GES').asinteger; aakt := TbBuchstamm.fieldbyname('AKT').asinteger; end else if gef2 then begin aTit := TbLektstamm.fieldbyname('Titel').AsString; ages := TbLektstamm.fieldbyname('GES').asinteger; aakt := TbLektstamm.fieldbyname('AKT').asinteger; end;
tt := QBuecher.fieldbyname('TITEL').asstring; n1 := 0; n2 := 0; repeat inc(n1); if QBuecher.fieldbyname('A_DATUM').asstring = '' then inc(n2); QBuecher.next; inc(k); until (QBuecher.Fieldbyname('TITEL').asstring <> tt) or QBuecher.eof;
if n1 <> ages then strliste.append(format('%-45s', [aTit]) + ' GesAnz falsch ' + format('%5s', [inttostr(n1)]) + ' ');
if n2 <> aakt then strliste.append(format('%-45s', [aTit]) + ' AktAnz falsch! ' + format('%5s', [inttostr(n2)])); end else begin strliste.append('Buch ' + QBuecher.fieldbyname('TITEL').asstring + ' fehlt in der Stammdatei!'); helpstr := QBuecher.fieldbyname('TITEL').asstring; repeat QBuecher.next; until QBuecher.fieldbyname('TITEL').asstring <> helpstr; end; end;
strliste.append(' '); strliste.append('************* Gegenprobe ************ (ok, wenn kein Eintrag)'); strliste.append(' ');
sucheInBuchLekt(TbBuchstamm);
sucheInBuchLekt(TbLektstamm);
strliste.SaveToFile(label30.caption+ 'OUTTXT\to_do.txt'); strliste.free; |
Das nenne ich verschlimmbessern!
Wer kann helfen? Soll ich wieder zurückgehen auf den alten Code?
zuma - Do 22.04.10 07:49
StringListe mit Append ??
pro Zeile ein
Delphi-Quelltext
1:
| StrListe.add(DeinStr); |
dürfte dir mehr als eine Zeile speichern ;)
btw: Dein Code liest sicher sehr unbequem. Pro Befehl eine Zeile und hier und da mal ne einrückung und schon liest es sich besser.
Das du evtl. Speicherlöcher machst, ist dir klar ??
wenn dein programm vor dem strliste.free aussteigt (durch fehler z.b.), bleibt die strliste im speicher. Besser ist
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| strliste := TStringList.Create; Try ... finally Strliste.free; end; |
D. Annies - Do 22.04.10 08:52
Hi, Zuma,
danke für deine Hinweise - klingt gut, werde ich mal gleich umsetzen! Melde mich wieder.
Detlef
D. Annies - Do 22.04.10 10:19
Hi, Zuma,
ich weiß nicht weiter, bist du gescheiter?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| if FileExists(label30.caption + 'to_do.txt') then begin strliste := Tstringlist.create; try strliste.loadfromfile(label30.caption+'to_do.txt'); for k := 1 to 3 do strliste.add(' '); strliste.Add('Übereinstimmungen, Abweichungen und Fehler in der Büchertabelle: ' + datetostr(now) + ' ' + timetostr(time)); strliste.add(' '); gauge1.MinValue := 0; gauge1.MaxValue := QBuecher.recordcount; screen.Cursor := crhourglass; QBuecher.first; k := 1; gauge1.Visible := true; while not qBuecher.eof do begin gauge1.Progress := k; gef1 := TbBuchstamm.locate('TITEL', QBuecher.fieldbyname('TITEL').asstring, []); gef2 := TbLektstamm.locate('TITEL', QBuecher.fieldbyname('TITEL').asstring, []); if gef1 or gef2 then begin ages := 0; aakt := 0; if gef1 then begin aTit := TbBuchstamm.fieldbyname('Titel').AsString; ages := TbBuchstamm.fieldbyname('GES').asinteger; aakt := TbBuchstamm.fieldbyname('AKT').asinteger; end else if gef2 then begin aTit := TbLektstamm.fieldbyname('Titel').AsString; ages := TbLektstamm.fieldbyname('GES').asinteger; aakt := TbLektstamm.fieldbyname('AKT').asinteger; end;
tt := QBuecher.fieldbyname('TITEL').asstring; n1 := 0; n2 := 0; repeat inc(n1); if QBuecher.fieldbyname('A_DATUM').asstring = '' then inc(n2); QBuecher.next; inc(k); until (QBuecher.Fieldbyname('TITEL').asstring <> tt) or QBuecher.eof;
if n1 <> ages then strliste.add(format('%-45s', [aTit]) + ' GesAnz falsch ' + format('%5s', [inttostr(n1)]) + ' ');
if n2 <> aakt then strliste.add(format('%-45s', [aTit]) + ' AktAnz falsch! ' + format('%5s', [inttostr(n2)])); end else begin strliste.add('Buch ' + QBuecher.fieldbyname('TITEL').asstring + ' fehlt in der Stammdatei!'); helpstr := QBuecher.fieldbyname('TITEL').asstring; repeat QBuecher.next; until QBuecher.fieldbyname('TITEL').asstring <> helpstr; end; end;
strliste.add(' '); strliste.add('************* Gegenprobe ************ (ok, wenn kein Eintrag)'); strliste.add(' '); strliste.SaveToFile(label30.caption+ 'to_do.txt'); finally strliste.free; end; QBuecher.first; screen.Cursor := crdefault; gauge1.Visible := false; button11.setfocus; maussprung(button11); buchDM_Dlg.opendialog1.InitialDir := label30.caption; buchDM_Dlg.opendialog1.filename := label30.caption+ 'to_do.txt'; end else showmessage('Datei ' + label30.caption+ 'to_do.txt' + ' ist nicht vorhanden'); |
Hab gedacht, ich hätte deine Anweisungen richtig umgesetzt, aber - EINE Zeile aus Steuerzeichen. Hilf doch noch mal.
Bis denne, Detlef
zuma - Do 22.04.10 10:41
hm, grundlegend falsches sehe ich da nicht so auf den ersten blick ... (wobei (wie erwähnt) dein Schreibstil nicht die leserlichkeit erhöht)
hast du deine Datei mal gelöscht und dann neu erstellt ? oder lädst du den 'alten Müll' immer wieder ?
prüfe mal bei jedem add, mit showmessage, was in deinen Parametern zur laufzeit drin steht
deine Formatanweisung is mir auch nich ganz klar, warum du das so machst
Delphi-Quelltext
1: 2:
| if n1 <> ages then strliste.add(format('%-45s', [aTit]) + ' GesAnz falsch ' + format('%5s', [inttostr(n1)]) + ' '); |
würde ich so machen
Delphi-Quelltext
1: 2: 3: 4: 5:
| if n1 <> ages then strliste.add(format('%s', [aTit]) + ' GesAnz falsch ' + format('%d', [inttostr(n1)]) + ' '); |
mach mal den test mit showmessage, wenn's dann immer noch nicht klappt, zeig mal den Inhalt der Datei
Edit: in der eile ist mir ein kleiner fehler unterlaufen (danke Tastaro)
Delphi-Quelltext
1: 2: 3: 4: 5:
| if n1 <> ages then strliste.add(format('%s', [aTit]) + ' GesAnz falsch ' + format('%d', [n1]) + ' '); |
D. Annies - Do 22.04.10 11:37
Hi, Zuma,
ich habe jedesmal die Datei gelöscht, also die ist ok.
die Formatanweisung '%-45s' sorgt für linksbündige Ausgabe 45 Zeichen, auch ok.
showmessage ist ebenfalls ok.
ja, ich weiß nicht, was da sein kann. Das Speichern?
Det :roll:
zuma - Do 22.04.10 12:56
Zeig mal den dateiinhalt
D. Annies - Do 22.04.10 13:25
Hi, Zuma,
es geschehen noch Zeichen und Wunder - ich wollte ja das abspeichern noch mal überprüfen - und daran lag es. Irgendwie ist es also nicht möglich, innerhalb des try-Blockes schon zu speichern.
Ich habe es jetzt ganz elegant ;) direkt in ein Memo geschrieben, im Memo mit .add angehängt, sehe es mir an und irgendwann, wenn ich genug gesehen habe, speichere ich es denn mal ab. -- Und das funnzt!
Dank dir sehr für deine Anregungen!
Grüße aus HL, Detlef
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!