Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler bei REWRITE (https://www.delphipraxis.net/54630-fehler-bei-rewrite.html)

Chrissi91 8. Okt 2005 13:13


Fehler bei REWRITE
 
Delphi-Quellcode:
if fileexists('Eintrage.txt') then
 begin
  assignfile(datei2,'Eintrage.txt');
  reset(datei2);
  readln(datei2,hilf);
   if hilf <> '' then
    begin
     reset(datei2);
     append(datei2);
     writeln(datei2,edit1.text+' '+edit2.text);
    end else
    begin
     rewrite(datei2); <-- Hier Fehlermeldung
     writeln(datei2,edit1.text+' '+edit2.text);
    end;
   closefile(datei2);
  end else
  begin
   assignfile(datei2,'Eintrage.txt');
   rewrite(datei2);
   writeln(datei2,edit1.text+' '+edit2.text);
   closefile(datei2);
  end;
 end;
Fehlermeldung: ElnOutError I/0 error 32

Folgende Variablen wurden in der Procedur deklariert:

Delphi-Quellcode:
var
datei2: textfile;
hilf: string;
Keine Variablen wurden global deklariert.

Die Datei existiert. Sie ist aber leer. Deshalb habe ich mit der IF-Abfrage geprüft, ob sie leer ist, da der Befehl append bei leeren Dateien nicht funktioniert (meiner Meinung nach). Nun soll mit rewrite und writeln etwas in die Datei geschrieben werden. ICH HABE AUCH DIE SUCHMASCHINE BENUTZT, habe aber nichts gefunden, was mir weiterhelfen konnte.

Sharky 8. Okt 2005 13:25

Re: Fehler bei REWRITE
 
Hai Chrissi91,

ich habe deinen Code mal so formatiert das man die IF-ELSE die zusammen gehören auch erkennen kann ;-)
Was ich nicht verstehe: Was möchtest Du denn machen? Wenn etwas in der Datei steht möchtest Du sie erzeugen und dann etwas rein schreiben. Wenn aber schon etwas in der Datei steht möchtest Du noch etwas anhängen?
Delphi-Quellcode:
procedure TForm1.btn_TestClick(Sender: TObject);
var
  datei2: textfile;
  hilf: string;
begin
  if fileexists('Eintrage.txt') then
  begin
    assignfile(datei2, 'Eintrage.txt');
    reset(datei2);
    readln(datei2, hilf);
    if hilf <> '' then
    begin
      reset(datei2);
      append(datei2);
      writeln(datei2, edit1.Text + ' ' + edit2.Text);
    end
    else
    begin
      rewrite(datei2);// <-- Hier Fehlermeldung
      writeln(datei2, edit1.Text + ' ' + edit2.Text);
    end;
    closefile(datei2);
  end
  else
  begin
    assignfile(datei2, 'Eintrage.txt');
    rewrite(datei2);
    writeln(datei2, edit1.Text + ' ' + edit2.Text);
    closefile(datei2);
  end;
end;
Darum mag ich keine end-else in einer Zeile *g*

Chrissi91 8. Okt 2005 13:28

Re: Fehler bei REWRITE
 
Es ist ja für mein Adressverzeichnis.

Wenn die Datei nicht existiert, soll sie erstellt werden.
Wenn die Datei existiert, soll etwas angehängt werden.
Aber wenn die Datei leer ist, funktioniert ja der Befehl append nicht, ...

Sharky 8. Okt 2005 13:34

Re: Fehler bei REWRITE
 
Hai Chrissi91,

vergleiche noch einmal genau deinen Code und meinen. Du wirst bemerken das bei dir wohl ein end; zu viel ist.

Bei mir geht es nämlich ohne Probleme.

Zitat:

Zitat von Chrissi91
...Aber wenn die Datei leer ist, funktioniert ja der Befehl append nicht, ...

:?: Warum soll der nicht gehen?

Chrissi91 8. Okt 2005 13:41

Re: Fehler bei REWRITE
 
Weill dann eine Fehlermeldung kam ... ^^

Ich habe meinen Code durch deinen ersetzt und die Fehlermeldung kam trotzdem :'(

Sharky 8. Okt 2005 13:46

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Chrissi91
...Ich habe meinen Code durch deinen ersetzt und die Fehlermeldung kam trotzdem :'(

Verstehe ich jetzt nicht.
Mit dieser (verkürzten) Variante habe ich auch kein Problem:
Delphi-Quellcode:
procedure TForm1.btn_TestClick(Sender: TObject);
var
  datei2: textfile;
  filename : string;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';
  assignfile(datei2,filename);
  if not fileexists(filename) then
  begin
    rewrite(datei2);
  end
  else
  begin
    reset(datei2);
  end;
  append(datei2);
  writeln(datei2, edit1.Text + ' ' + edit2.Text);
  closefile(datei2);
end;

Chrissi91 8. Okt 2005 13:49

Re: Fehler bei REWRITE
 
Ich versuch es dir nochmal zu erklären ;)

Ich habe eine Index-Datei, in der die Dateinamen der Datensätze für mein Adressverzeichnis drinstehen. Wenn der Benutzer sich das Programm runterlädt, ist meistens noch keine Index-Datei dabei. Diese soll beim Erstellen des ersten Eintrages miterstellt werden. Dann soll der Dateiname in die Index-Datei getan werden. Und zwar wollte ich das so machen:

Delphi-Quellcode:
var
datei: textfile;
begin
assignfile(datei,'Eintrage.txt'); //Das ist die Index-Datei
rewrite(datei);
writeln(datei, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
closefile(datei);
end;
Geht das so, wenn die Datei noch nicht existiert und erstellt werden soll?

Existiert die Index-Datei doch schon, dann soll einfach nur eine Zeile angefügt werden:

Delphi-Quellcode:
var
datei2: textfile;
begin
assignfile(datei2,'Eintrage.txt'); //Das ist die Index-Datei
append(datei2);
writeln(datei2, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
closefile(datei2);
end;
Um das zu verbinden will ich das so machen:

Delphi-Quellcode:
var
datei, datei2: textfile;
begin
if fileexists('Eintrage.txt') then
 begin
  assignfile(datei2,'Eintrage.txt'); //Das ist die Index-Datei
  append(datei2);
  writeln(datei2, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
  closefile(datei2);
 end
 else
 begin
  assignfile(datei,'Eintrage.txt'); //Das ist die Index-Datei
  rewrite(datei);
  writeln(datei, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
  closefile(datei);
 end;
end;
Soweit mitgekommen? ;)

Bei mir funktioniert das ganze mit Append aber nicht, wenn Eintrage.txt total leer ist.

Sharky 8. Okt 2005 14:30

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Chrissi91
... Bei mir funktioniert das ganze mit Append aber nicht, wenn Eintrage.txt total leer ist.

Wie gesagt: Bei mir geht es:

Zitat:

Um das zu verbinden will ich das so machen:
Hast Du denn jetzt mal mein zweites Codebeispiel getestet oder es Dir zumindest einmal angesehen?

Du sagst Du bekommst diesen Fehler "ElnOutError I/0 error 32". Hast Du schon einmal geschaut was der bedeutet?
Das F1 Ding sagt
Verletzung bei der gemeinsamen Benutzung

Eventuell hilft Dir das ja bei deiner Fehlersuche ;-)

Chrissi91 8. Okt 2005 14:36

Re: Fehler bei REWRITE
 
Dein 2. Code hat mir nicht weitergeholfen. Die Fehlermeldung hilft mir auch nicht weiter ... ;)

:coder: Dann werde ich mal weiter versuchen ...

Luckie 8. Okt 2005 14:39

Re: Fehler bei REWRITE
 
Dieser Code von Sharky tut wunderbar das, was du willst: Bei nicht vorhanden sein neu erstellen, bei vorhanden sein anhängen.

Chrissi91 8. Okt 2005 14:43

Re: Fehler bei REWRITE
 
Das Problem ist, ich weiß nicht ganz genau, was er da macht :duck:

Z.B.: Was bedeutet das:
Zitat:

Zitat von Sharky
Delphi-Quellcode:
filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';

Edit: Aber geht auch mein zuletzt erstellter Code? Auch wenn die Datei leer ist, oder gar nicht existiert?

devnull 8. Okt 2005 14:45

Re: Fehler bei REWRITE
 
Es sollte doch so sein, oder?


Delphi-Quellcode:
procedure TForm1.btn_TestClick(Sender: TObject);
var
  datei2: textfile;
  filename : string;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';
  assignfile(datei2,filename);
  if not fileexists(filename) then
     rewrite(datei2)
  end
  else
     reset(datei2);
 
  closefile (datei2);

  append(datei2);
  writeln(datei2, edit1.Text + ' ' + edit2.Text);
  closefile(datei2);
end;

Luckie 8. Okt 2005 14:46

Re: Fehler bei REWRITE
 
Dann schlag die unbekannten Befehle / Funktionen doch mal in der Hilfe nach. In Delphi brauchst du da nur den Cursor in das Wort zu stellen und F1 drücken. Also etwas Eigeninitiative schadet bestimmt nicht. Wir helfen bei Problmen hie rim Forum, sind aber kein Ersatz für die Delphi Hilfe.

@devnull:
Delphi-Quellcode:
closefile (datei2);

  append(datei2);
Viel Spass beim Schreiben in eine schon geschlossenen Datei. Und ohne Auswertung der Fehler(codes) noch mehr Spass bei der Fehlersuche beim Kunden. ;)

devnull 8. Okt 2005 14:49

Re: Fehler bei REWRITE
 
@Luckie: Append öffnet eine Datei an letzter Stelle...

Delphi-Hilfe:

Beschreibung
Mit Append können Sie sicherstellen, dass eine Datei schreibgeschützt geöffnet und der Dateizeiger auf das Ende der Datei gesetzt wird. F ist eine Textdateivariable und muss zuvor mit AssignFile einer externen Datei zugeordnet werden. Ist die Datei mit dem angegebenen Namen nicht vorhanden, tritt ein Fehler auf. Wenn F bereits offen ist, wird sie geschlossen und anschließend erneut geöffnet. Die aktuelle Dateiposition wird dann auf das Dateiende gesetzt.

^^Deshalb ist es wohl auch egal, ob man ein Closefile schreibt oder nicht :roll:

Chrissi91 8. Okt 2005 14:53

Re: Fehler bei REWRITE
 
Schön, aber wie ihr sehen könnt, bin ich 14 Jahre alt ;)

Die Delphi - Hilfe ist Englisch. Zwr bin ich in der 9.Klasse auf dem Gymnasium und habe jedes Halbjahr eine 1 oder 2 auf dem Zeugnis *angeb* , aber ich verstehe keine spezifischen Ausdrücke, die z.T. noch nicht einmal im Langenscheidt Lexikon stehen ;)

Edit:

Geht das auch?

Delphi-Quellcode:
var
datei, datei2: textfile;
begin
if fileexists('Eintrage.txt') then
begin
  assignfile(datei2,'Eintrage.txt'); //Das ist die Index-Datei
  append(datei2);
  writeln(datei2, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
  closefile(datei2);
end
else
begin
  assignfile(datei,'Eintrage.txt'); //Das ist die Index-Datei
  rewrite(datei);
  writeln(datei, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
  closefile(datei);
end;
end;

Luckie 8. Okt 2005 14:55

Re: Fehler bei REWRITE
 
Zitat:

Zitat von devnull
@Luckie: Append öffnet eine Datei an letzter Stelle...

Delphi-Hilfe:

Beschreibung
Mit Append können Sie sicherstellen, dass eine Datei schreibgeschützt geöffnet und der Dateizeiger auf das Ende der Datei gesetzt wird. F ist eine Textdateivariable und muss zuvor mit AssignFile einer externen Datei zugeordnet werden. Ist die Datei mit dem angegebenen Namen nicht vorhanden, tritt ein Fehler auf. Wenn F bereits offen ist, wird sie geschlossen und anschließend erneut geöffnet. Die aktuelle Dateiposition wird dann auf das Dateiende gesetzt.

Das
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  datei2       : textfile;
  filename    : string;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';
  assignfile(datei2, filename);
  closefile(datei2);
  append(datei2);
end;
Bringt bei mir:
Zitat:

103 File not open Reported by CloseFile, Read Write, Seek, Eof, FilePos, FileSize, Flush, BlockRead, or BlockWrite if the file is not open.
Ist ja auch logisch, du hast mit CloseFile ja die Dateivariable datei2 schon in den Müll geworfen, willst sie aber bei Append noch benutzen. Es kann also gar nicht gehen!

marabu 8. Okt 2005 14:59

Re: Fehler bei REWRITE
 
Luckie, da war ursprünglich ein openfile (Rewrite / reset) zwischen AssignFile und CloseFile ...

Grüße vom marabu

Luckie 8. Okt 2005 15:02

Re: Fehler bei REWRITE
 
Aber nicht bei devnull:
Zitat:

Zitat von devnull
Es sollte doch so sein, oder?
Delphi-Quellcode:
procedure TForm1.btn_TestClick(Sender: TObject);
var
  datei2: textfile;
  filename : string;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';
  assignfile(datei2,filename);
  if not fileexists(filename) then
     rewrite(datei2)
  end
  else
     reset(datei2);
 
  closefile (datei2);

  append(datei2);
  writeln(datei2, edit1.Text + ' ' + edit2.Text);
  closefile(datei2);
end;


Sharky 8. Okt 2005 15:05

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Chrissi91
Schön, aber wie ihr sehen könnt, bin ich 14 Jahre alt ;)

Kein Problem. War ich auch mal ;-)

Zitat:

Die Delphi - Hilfe ist Englisch.
Damit habe ich auch meine Probleme. Also werde ich mal den Code von mir etwas kommentieren.
Delphi-Quellcode:
filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';
In Delphi-Referenz durchsuchenParamStr stehen die Parameter die deinem Programm übergeben werden.
Wenn Du zum Beispiel dein Programm so aufrufst Programm.exe /blubb steht in PraramStr(1) ein "blubb".
Eine Besonderheit ist ParamStr(0). In diesem "Parameter" seht immer der komplette Pfad und Dateiname des Programmes.
Zum Beispiel "c:\Programme\Sharky\Test.exe".

Die Funktion Delphi-Referenz durchsuchenExtractFilePath extrahiert aus diesem String nun den Pfad zu dem Programm inkl. des letzten Backslash.
In dem Beispiel würde also
Code:
ExtractFilePath(ParamStr(0))
den String "c:\Programme\Sharky\" ergeben. An diesen String hänge ich jetzt einfach mit dem + den Namen der Datei.
Also ergibt
Code:
filename := ExtractFilePath(ParamStr(0)) + 'Eintrage.txt';
"c:\Programme\Sharky\Eintrag.txt".

Warum das ganze? Wenn Du nur den Namen der Datei angibst und keinen Pfad wird diese immer im aktuellen Verzeichniss erstellt/geöffnet. Dies ist aber nicht zwingend das Verzeichniss deiner Anwendung. Noch schlimmer: Das aktuelle Verzeichniss kann sich jederzeit (auch während dein Programm läuft) ändern!!

Code:
assignfile(datei2,filename);
hier wird der Variable datei2 der Dateiname inkl. Pfad zugewiesen. Da Du dies in jedem fall brauchst reicht es dies einmal im Code zu machen.
Delphi-Quellcode:
if not fileexists(filename) then //Wenn die Datei nicht Vorhanden ist dann:
  begin
    rewrite(datei2); // erzeuge sie
  end
  else // ansonsten
  begin
    reset(datei2); // öffne sie nur
  end;
  append(datei2); // Zum leten "Eintrag in der Datei" springen
  writeln(datei2, edit1.Text + ' ' + edit2.Text); // Etwas in die Datei schreiben
  closefile(datei2); // die Datei schliessen.
end;
Ich hoffe jetzt siehst Du etwas mehr Licht im dunklen.

Chrissi91 8. Okt 2005 15:07

Re: Fehler bei REWRITE
 
Grrr ... ;) Geht dieser Code nun bei existierenen Dateien, die entweder leer oder nicht leer sind (mit Text ;)) und auch, wenn die Datei nicht existiert?

Delphi-Quellcode:
var
datei, datei2: textfile;
begin
if fileexists('Eintrage.txt') then
begin
  assignfile(datei2,'Eintrage.txt'); //Das ist die Index-Datei
  append(datei2);
  writeln(datei2, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
  closefile(datei2);
end
else
begin
  assignfile(datei,'Eintrage.txt'); //Das ist die Index-Datei
  rewrite(datei);
  writeln(datei, edit1.text+' '+edit2.text+'.txt') //Daraus setzt sich der Dateiname zusammen
  closefile(datei);
end;
end;

Luckie 8. Okt 2005 15:15

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Chrissi91
Grrr ... ;) Geht dieser Code nun bei existierenen Dateien, die entweder leer oder nicht leer sind (mit Text ;)) und auch, wenn die Datei nicht existiert?

Probier es doch aus.

marabu 8. Okt 2005 15:16

Re: Fehler bei REWRITE
 
Klar geht der Code - ich würde ihn aber anders schreiben - wenn ich es nicht sogar ganz anders machen würde:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
const
  INDEX_FILENAME = 'Eintrage.txt';
var
  tf: TextFile;
  fileName: string;
begin
  fileName := Edit1.Text + ' ' + Edit2.Text + '.txt';
  AssignFile(tf, INDEX_FILENAME);
  if FileExists(INDEX_FILENAME)
    then Append(tf)
    else Rewrite(tf);
  WriteLn(tf, fileName);
  CloseFile(tf);
end;
Die von dir verwendeten Dateioperationen sind veraltet und stammen aus einer Zeit, als es noch keine Netzwerke und vor allem kein Multitasking gab. Unter Windows ist es gang und gäbe, dass du beim Testen eine Datei bearbeitest, die du nebenher in einem Editor offen hältst. Da musst du dann noch jede Menge Code zur Fehlerprüfung einbauen.

Du solltest die Standardnamen deiner Komponenten auf der Form möglichst schnell abändern - Edit1 ist einfach kein guter Name...

Grüße vom marabu

turboPASCAL 8. Okt 2005 16:05

Re: Fehler bei REWRITE
 
:gruebel: Nur mal so:
Delphi-Quellcode:
function GetIOResultErrString(Error: Integer): String;
begin
  case Error of
      2: Result:= 'Datei nicht gefunden';
      3: Result:= 'Ungültiger Dateiname';
      5: Result:= 'Zugriff verweigert';
     32: Result:= 'Verletzung bei der gemeinsamen Benutzung / kein Filesharing';

    100: Result:= 'EOF / Fehler beim Lesen vom Datenträger';
    101: Result:= 'Festplatte voll / Fehler beim Schreiben auf Datenträger';
    102: Result:= 'Dateivariable nicht zugewiesen';
    103: Result:= 'Datei nicht geöffnet';
    104: Result:= 'Datei nicht für Leseoperationen geöffnet';
    105: Result:= 'Datei nicht für Schreiboperationen geöffnet';
    106: Result:= 'Ungültige Eingabe / Ungültiges numerisches Format';
    107: Result:= 'Datei ist bereits geöffnet';
  end;
end;

procedure TForm.ButtonClick...
var
  fDatei: TextFile;
  FileName: String;
  Err: Integer;
begin
  FileName := 'Eintraege.txt';

  AssignFile(fDatei, FileName);

  {$I-}
  Append(fDatei);
  {$I+}
  Err := IOResult;
  if Err <> 0 then
  begin
    {$I-}
    rewrite(fDatei);
    {$I+}
    Err := IOResult;
  end;

  if Err = 0 then
  begin
    writeln(fDatei, edit1.text + ' ' + edit2.text);
    CloseFile(fDatei);
  end else
  begin
    ShowMessage('Fehler beim öffnen oder schreiben der Datei: "' +
      FileName + '"' + #13#10 +
      '(Fehler #' + IntTostr(Err) + ' - ' + GetIOResultErrString(Err) + ')');
  end;
end;

Luckie 8. Okt 2005 16:14

Re: Fehler bei REWRITE
 
Oder kürzer:
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
;)

turboPASCAL 8. Okt 2005 16:20

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Luckie
Oder kürzer: [...] ;)

jupp, aber hat man(n) dann noch was zu tippen ? soll ja Grundsätzliches sein mit Aha-Effekt ;)

Chrissi91 8. Okt 2005 16:28

Re: Fehler bei REWRITE
 
Delphi-Quellcode:
assignfile(datei2,'Eintrage.txt');
  if not fileexists('Eintrage.txt') then
  begin
  rewrite(datei2);
  end
  else
  begin
  reset(datei2);
  end;
  closefile (datei2);

  append(datei2);
  writeln(datei2, edit1.Text + ' ' + edit2.Text);
  closefile(datei2);
end;
Hier kommt wieder die Fehlermeldung ...

Sharky 8. Okt 2005 16:29

Re: Fehler bei REWRITE
 
Hai Chrissi91,

wie marabu ja schon angemerkt hat sollte man mit [oh]assignfile, Append, Writeln[/oh] und Co nicht mehr arbeiten. Es gibt da viel bessere möglichkeiten. Eine wäre zum Beispiel so:
*gg* Ich weiss, die sieht kompliziert aus. Ist sie aber nicht ;-)
Delphi-Quellcode:
resourcestring
  Env_AppData = 'APPDATA';

const
  INDEX_FILENAME = 'Eintrage.txt';

function AppDataDir: string;
begin
  //  Result := IncludeTrailingBackslash(GetEnvironmentVariable(ENV_APPDATA));
  Result := ExtractFilePath(ParamStr(0)); // Nur zum Test !!!!
end;

procedure Tfrm_Main.AdressList2Index(aValue: string);
var
  idx_List: TStream;
  mode : Word;
  tmpString: string;
  fileName : string;
begin
  fileName := AppDataDir + INDEX_FILENAME;
  try
    if (FileExists(fileName)) then
      mode := fmOpenReadWrite
    else
      mode := fmCreate;
    idx_List := TFileStream.Create(fileName,mode);
    idx_List.Seek(0,soFromEnd);
    tmpstring := aValue + #10 + #13;
    idx_List.Write(tmpString[1], Length(tmpString));
  finally
    idx_List.Free;
  end;
end;

procedure Tfrm_Main.btn_StoreAdressList2IndexClick(Sender: TObject);
var
  feld1 : string;
  feld2 : string;
begin
  if (dlg_Save_Adresslist.Execute) then
  begin
    feld1 := Edit1.Text;
    feld2 := Edit2.Text;
    AdressList2Index(feld1 + ' ' + feld2);
  end;
end;
Ansonsten solltest Du dir einmal eine Delphi-Referenz durchsuchenTStringList und deren Methoden [oh].Items.LoadFromFile, Items.SaveToFile , Items.Add[/oh] ansehen.

Chrissi91 8. Okt 2005 16:37

Re: Fehler bei REWRITE
 
Ich versuche es noch einmal zu erkläre ;), indem ich euch mal die ganze Prozedur zeige. Ich weiß: "Einrücken" :duck: Aber das Programm ist noch von früher, wo ich sowas noch nicht gemacht habe. Die Prozedur soll folgendes machen:

Delphi-Quellcode:
procedure TForm2.BitBtn1Click(Sender: TObject);
var
datei, datei2: textfile;
hilf: string;
begin
if (combobox1.text='')or
   (edit1.text='') or
   (edit2.text='')then
   begin
   showmessage('Bitte geben Sie Anrede, Vor - und Nachnamen an, um den Datensatz speichern zu können.');
   end else
   begin
if fileexists(edit1.text+' '+edit2.text+'.txt') then
begin
showmessage('Achtung! Es existiert schon ein Eintrag unter diesem Namen! Abbruch ...');
form2.visible:=false;
form1.Visible:=true;
combobox1.Text:='';
edit1.text:='';
edit2.text:='';
edit3.text:='';
edit4.text:='';
edit5.text:='';
edit6.text:='';
edit7.text:='';
edit8.text:='';
edit9.text:='';
edit10.text:='';
memo1.Text:='';
end else
begin
assignfile(datei,edit1.text+' '+edit2.text+'.txt');
rewrite(datei);
writeln(datei,combobox1.text);
writeln(datei,edit1.text);
writeln(datei,edit2.text);
writeln(datei,edit3.text);
writeln(datei,edit4.text);
writeln(datei,edit5.text);
writeln(datei,edit6.text);
writeln(datei,edit7.text);
writeln(datei,edit8.text);
writeln(datei,edit9.text);
writeln(datei,edit10.text);
writeln(datei,memo1.text);
closefile(datei);
assignfile(datei2,'Eintrage.txt');
  if not fileexists('Eintrage.txt') then
  begin
  rewrite(datei2);
  end
  else
  begin
  reset(datei2);
  end;
  closefile (datei2);

  append(datei2);
  writeln(datei2, edit1.Text + ' ' + edit2.Text);
  closefile(datei2);
end;

combobox1.Text:='';
edit1.text:='';
edit2.text:='';
edit3.text:='';
edit4.text:='';
edit5.text:='';
edit6.text:='';
edit7.text:='';
edit8.text:='';
edit9.text:='';
edit10.text:='';
memo1.Text:='';
form2.visible:=false;
form1.visible:=true;
end;
end;
- Eine Datei speichern mit den ganzen Infos aus den edit-Feldern, deren dateiname sich aus edit1.text+' '+edit2.text zusammensetzt.
- in eine datei eintrage.txt soll der dateiname rein:

wenn die datei eintrage.txt nicht existiert, soll sie erstellt werden und edit1.text+' '+edit2.text soll eingetragen werden

wenn die datei eintrage.txt existiert und leer ist, soll edit1.text+' '+edit2.text reingeschrieben werden

wenn die datei eintrage.txt existiert und schon einige dateinamen drinstehen, soll edit1.text+' '+edit2.text hinzugefügt werden.

wie mache ich das? der code funktioniert mittlerweile überhaupt nicht mehr ... :(

turboPASCAL 8. Okt 2005 16:39

Re: Fehler bei REWRITE
 
Mal so gefragt, welche Rechte besitzt Du auf dem Rechner und wo wird die Datei hingeschrieben. Ist die Datei irgend wo noch offen?
Welche Fehlermeldung, die selbe wie in deinem ersten Post ?

//Edit: Oha, ebend stand hier noch 'ne andere Frage ;)

Chrissi91 8. Okt 2005 16:54

Re: Fehler bei REWRITE
 
An meinem Rechner bin nur ich ... Es gibt nur 1 Benutzer. Die Datei ist 100%ig nicht offen vorher. Aber ich programmiere es gerade und habe es gleich geschafft. Eine Frage noch :-D:

Bei dem Befehl append:

Ist das so richtig?

assignfile(datei4,'Eintrage.txt');
append(datei4);
writeln(datei4,edit1.Text+' '+edit2.Text);
closefile(datei4);

Chrissi91 8. Okt 2005 17:02

Re: Fehler bei REWRITE
 
Nachtrag:

Delphi-Quellcode:
procedure TForm2.BitBtn1Click(Sender: TObject);
var
datei, datei2, datei3, datei4, datei5: textfile;
hilf: string;
begin
 if (combobox1.text='')or
    (edit1.text='') or
    (edit2.text='')then
      begin
       showmessage('Bitte geben Sie Anrede, Vor - und Nachnamen an, um den Datensatz speichern zu können.');
      end else
      begin
       if fileexists(edit1.text+' '+edit2.text+'.txt') then
        begin
         showmessage('Achtung! Es existiert schon ein Eintrag unter diesem Namen! Abbruch ...');
         form2.visible:=false;
         form1.Visible:=true;
         combobox1.Text:='';
         edit1.text:='';
         edit2.text:='';
         edit3.text:='';
         edit4.text:='';
         edit5.text:='';
         edit6.text:='';
         edit7.text:='';
         edit8.text:='';
         edit9.text:='';
         edit10.text:='';
         memo1.Text:='';
        end else
        begin
         assignfile(datei,edit1.text+' '+edit2.text+'.txt');
         rewrite(datei);
         writeln(datei,combobox1.text);
         writeln(datei,edit1.text);
         writeln(datei,edit2.text);
         writeln(datei,edit3.text);
         writeln(datei,edit4.text);
         writeln(datei,edit5.text);
         writeln(datei,edit6.text);
         writeln(datei,edit7.text);
         writeln(datei,edit8.text);
         writeln(datei,edit9.text);
         writeln(datei,edit10.text);
         writeln(datei,memo1.text);
         closefile(datei);
        end;
       if fileexists('Eintrage.txt') then
        begin
         assignfile(datei2,'Eintrage');
         reset(datei2);
         readln(datei2,hilf);
         closefile(datei2);
          if hilf = '' then
           begin
            deletefile('Eintrage.txt');
            assignfile(datei3,'Eintrage.txt');
            rewrite(datei3);
            writeln(datei3,edit1.Text+' '+edit2.Text);
            closefile(datei);
           end else
           begin
            assignfile(datei4,'Eintrage.txt');
            append(datei4);
            writeln(datei4,edit1.Text+' '+edit2.Text);
            closefile(datei4);
           end;
        end else
        begin
         assignfile(datei5,'Eintrage.txt');
         rewrite(datei5);
         writeln(datei5,edit1.Text+' '+edit2.Text);
         closefile(datei5);
        end;

combobox1.Text:='';
edit1.text:='';
edit2.text:='';
edit3.text:='';
edit4.text:='';
edit5.text:='';
edit6.text:='';
edit7.text:='';
edit8.text:='';
edit9.text:='';
edit10.text:='';
memo1.Text:='';
form2.visible:=false;
form1.visible:=true;
end;
end;
So! Jetzt sieht das ganze schon besser aus! Trotzdem kommen immer wieder Fehlermeldungen!
1. Wenn Eintrage.txt nicht existiert, wird sie ganz korrekt erstellt. So weit, so gut ... ;)
2. Wenn aber die Datei schon angelegt ist und einige Einträge drin sind, kann er die Datei nicht finden.
3. Wenn aber die Datei schon angelegt ist und noch keine Einträge drin sind, kann er die Datei nicht finden.

Bei 2. und 3. steht dort "File not found".

Vielleicht könnt ihr mir jetzt weiterhelfen ;)

Luckie 8. Okt 2005 17:08

Re: Fehler bei REWRITE
 
Delphi-Quellcode:
if fileexists('Eintrage.txt')
Wo soll denn die Datei sein? Das aktuelle Verzeichnis ist nicht immer das Anwendungsverzeichnis. Ich hoffe, dass das irgendwann mal begriffen wird, zu mal es fast jedes mal erwähnt wird, wenn eine Datei ohne Pfad angegeben wird.
Das Anwendungsverzeichnis inklusive Anwendungsdateiname bekommst du mit ParamStr(0). Der Rest sollte sich durch Nachdenken ergeben.

Chrissi91 8. Okt 2005 17:11

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Luckie
Wo soll denn die Datei sein? Das aktuelle Verzeichnis ist nicht immer das Anwendungsverzeichnis. Ich hoffe, dass das irgendwann mal begriffen wird, zu mal es fast jedes mal erwähnt wird, wenn eine Datei ohne Pfad angegeben wird.
Das Anwendungsverzeichnis inklusive Anwendungsdateiname bekommst du mit ParamStr(0).

Das will ich ja danach machen ... Schon klar, dass später der Anwender nicht 50 Dateien auf dem Desktop haben will ...

Zitat:

Zitat von Luckie
Der Rest sollte sich durch Nachdenken ergeben.

Was meinst du was ich die ganze Zeit mache? ;)

Edit: Wäre schön, wenn du mich auf meine Fehler aufmerksam machen könntest :-D

Luckie 8. Okt 2005 17:15

Re: Fehler bei REWRITE
 
Habe ich doch gerade: Er findet die Datei nicht, weil du nur den Dateinamen angegeben hast, aber nicht das Verzeichnis! Woher soll also dein Programm oder Windows wissen WO es die Datei findet?

Chrissi91 8. Okt 2005 17:16

Re: Fehler bei REWRITE
 
Aber ich erstelle sie doch im Verzeichnis der EXE - Datei ... Das mache ich seit 2 Jahren so ... WArum soll das jetzt aus einmal nicht mehr gehen? Aber nun gut ... Ich probier es ... ;)

Luckie 8. Okt 2005 17:18

Re: Fehler bei REWRITE
 
Zitat:

Zitat von Chrissi91
Aber ich erstelle sie doch im Verzeichnis der EXE - Datei ... Das mache ich seit 2 Jahren so ... WArum soll das jetzt aus einmal nicht mehr gehen?

Zitat:

I was looking into the bug with Gordon Letwin, the architect for DOS 4. I looked at the code and commented “Maybe this is what was happening? But if that were the case, it’d take a one in a million chance for it to happen”.

Gordon’s response was simply: “In our business, one in a million is next Tuesday”.
Quelle: One in a million is next Tuesday
:mrgreen:

Daniel 8. Okt 2005 17:19

Re: Fehler bei REWRITE
 
Du gehst implizit davon aus, dass Programmverzeichnis und Arbeitsverzeichnis identisch sind. Das ist oftmals der Fall, aber darauf kannst Du Dich eben nicht verlassen. Das ist es, was Michael Dir zu sagen versucht.

Wenn ich eine Verknüpfung zu Deiner Anwendung anlege, kann ich dort zum Beispiel ein Arbeitsverzeichnis meiner Wahl angeben. Du bist auf der sicheren Seite, wenn Du das korrekte Verzeichnis ermittelst und dann explizit mit angibst.

Chrissi91 8. Okt 2005 17:34

Re: Fehler bei REWRITE
 
Delphi-Quellcode:
if fileexists('C:\WINDOWS\Desktop\'+edit1.text+' '+edit2.text+'.txt') then
Ist diese Schreibweise so korrekt?

Dann müsste das Ganze so aussehen, oder?

Delphi-Quellcode:
procedure TForm2.BitBtn1Click(Sender: TObject);
var
datei, datei2, datei3, datei4, datei5: textfile;
hilf: string;
begin
 if (combobox1.text='')or
    (edit1.text='') or
    (edit2.text='')then
      begin
       showmessage('Bitte geben Sie Anrede, Vor - und Nachnamen an, um den Datensatz speichern zu können.');
      end else
      begin
       if fileexists('C:\WINDOWS\Desktop\'+edit1.text+' '+edit2.text+'.txt') then
        begin
         showmessage('Achtung! Es existiert schon ein Eintrag unter diesem Namen! Abbruch ...');
         form2.visible:=false;
         form1.Visible:=true;
         combobox1.Text:='';
         edit1.text:='';
         edit2.text:='';
         edit3.text:='';
         edit4.text:='';
         edit5.text:='';
         edit6.text:='';
         edit7.text:='';
         edit8.text:='';
         edit9.text:='';
         edit10.text:='';
         memo1.Text:='';
        end else
        begin
         assignfile(datei,'C:\WINDOWS\Desktop\'+edit1.text+' '+edit2.text+'.txt');
         rewrite(datei);
         writeln(datei,combobox1.text);
         writeln(datei,edit1.text);
         writeln(datei,edit2.text);
         writeln(datei,edit3.text);
         writeln(datei,edit4.text);
         writeln(datei,edit5.text);
         writeln(datei,edit6.text);
         writeln(datei,edit7.text);
         writeln(datei,edit8.text);
         writeln(datei,edit9.text);
         writeln(datei,edit10.text);
         writeln(datei,memo1.text);
         closefile(datei);
        end;
       if fileexists('C:\WINDOWS\Desktop\Eintrage.txt') then
        begin
         assignfile(datei2,'C:\WINDOWS\Desktop\Eintrage');
         reset(datei2);
         readln(datei2,hilf);
         closefile(datei2);
          if hilf = '' then
           begin
            deletefile('C:\WINDOWS\Desktop\Eintrage.txt');
            assignfile(datei3,'C:\WINDOWS\Desktop\Eintrage.txt');
            rewrite(datei3);
            writeln(datei3,edit1.Text+' '+edit2.Text);
            closefile(datei);
           end else
           begin
            assignfile(datei4,'C:\WINDOWS\Desktop\Eintrage.txt');
            append(datei4);
            writeln(datei4,edit1.Text+' '+edit2.Text);
            closefile(datei4);
           end;
        end else
        begin
         assignfile(datei5,'C:\WINDOWS\Desktop\Eintrage.txt');
         rewrite(datei5);
         writeln(datei5,edit1.Text+' '+edit2.Text);
         closefile(datei5);
        end;

combobox1.Text:='';
edit1.text:='';
edit2.text:='';
edit3.text:='';
edit4.text:='';
edit5.text:='';
edit6.text:='';
edit7.text:='';
edit8.text:='';
edit9.text:='';
edit10.text:='';
memo1.Text:='';
form2.visible:=false;
form1.visible:=true;
end;
end;

Daniel 8. Okt 2005 17:38

Re: Fehler bei REWRITE
 
Leider nein. Oder ja - aber im Endeffekt doch nein. *g*

Du kanst mit Deinem Code abfragen, ob es eine bestimmte Datei im Ordner 'c:\windows\desktop\' gibt. Das ist in sich nicht falsch - nur nicht das, was Du vermutlich möchtest. Ich kann Windows in jedem beliebigen Verzeichnis installieren und auch der Desktop ist mal hier und mal dort.

Wenn Du also rausfinden willst, welches Verzeichnis auf den Desktop verweist, so musst Du nur Windows dazu befragen - und für den Code dazu die Suche der DP. ;-)
Irgendwas mit "Special", "Folder" und "Location", wenn ich nicht irre.

PierreB 8. Okt 2005 17:39

Re: Fehler bei REWRITE
 
Zitat:

if fileexists('C:\WINDOWS\Desktop\'+edit1.text+' '+edit2.text+'.txt') then
Du kannst doch nicht davon ausgehen das jeder Windows auf C:\ installiert hat !

Wie Luckie schon sagte:
ParamStr(0)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz