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]) +  // es sei denn, du willst die Titel auf 45 zeichen abschneiden
        '  GesAnz falsch ' +
              format('%d', [n1]) + // da entfällt natürlich die umwandlung in einen String
        '   ');


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