![]() |
Datenbank: .txt Dateien • Zugriff über: Delphi? oO
Datei Frei geben
Guten Morgen liebe DelphiPraxis Member ^^
Ich hab hier ein kleines Problem, an dem ich mir schon seit längerem die Zähne ausbeiße und einfach keine Lösung finde. Ich hab auch schon in der Suche gesucht ohne Ende, aber einfach nichts helfendes gefunden. Mein Problem ist, das ich mit folgendem Befehl eine txt-Datei erstelle, falls noch keine Vorhanden ist. Das funktioniert auch einwandfrei. Aber wenn ich mit einem anderen Befehl auf die txt-Datei zugreife kommt immer eine Win32 Fehlermeldung. Auch wenn ich normal über Windows die Datei öffnen will, kommt immer eine Meldung, das die Datei gerade wo anders geöffnet ist. Erst wenn ich das Programm geschloßen und neu gestartet habe kann ich auf die txt-Datei zugreifen. Hiermit erstelle ich die txt-Datei und will Sie damit nachher auch wieder Auslesen
Delphi-Quellcode:
Ich hab nicht sooo die Ahnung von Delphi, da ich programmieren ja erst in der Ausbildung angefangen hab ^^
const LDB : String = 'LampenDB.txt';
function Auslesen(Datenbank: string):TStringArray; var f: Textfile; a, Auswertung: integer; Zeile: TStringArray; Path: String; begin Zeile:= Nil; Path:= extractfilepath(paramStr(0)) + 'LampenDB\'; if DirectoryExists(Path) = False then //Wenn Pfad nicht angelegt ist begin CreateDir(Path); Auswertung:= FileCreate(Path + Datenbank); CreateDir(Path + 'Pics\'); if Auswertung = -1 then begin ShowMessage('Datenbank konnt nicht erstellt werden.' + #13#10 + 'Eine Lösung wäre vielleicht, das Programm als Administrator zu starten.'); end; //hier die erstellte LampenDB.txt wieder frei geben? Exit; end; Path:= Path + Datenbank; AssignFile(f,Path); //Die daten aus dem Dokument werden in die Variable f "geschoben" reset(f); //Geht an anfang der variable f A:= 0; while not EOF(f) do //wenn nicht das ende vom dokument erreicht ist, dann begin Setlength(Zeile,A+1); readln(f,Zeile[A]); if Zeile[A] <> '' then A:= A + 1; end; CloseFile(f); //schließt das dokument wieder result := Zeile; end; Vielen Dank schonmal für die Hilfe MfG Timbuktu |
Re: Datei Frei geben
Gerade erst ein paar Tage alt:
![]() ![]() Selbes Problem, nur aus anderer Sicht und selbe Lösung. dort: anderes Programm = zuerst geöffnet | eigenes Programm will öffnen hier: eigenes Programm = zuerst geöffnet | anderes Programm will öffnen |
Re: Datei Frei geben
"Auswertung" ist nicht einfach ein Flag, ob die Datei richtig erzeugt wurde, sondern auch - im Erfolgsfall - das Dateihandle. d.h. wenn Auswertung nicht -1 ist, musst Du die Datei mit "FileClose(Auswertung)" wieder schließen, sonst kann niemand anderes drauf zugreifen.
Nochwas: Wenn Du "Zeilen" als TStringList deklarierst, kannst Du den Teil von "AssignFile" bis "CloseFile" durch "Zeilen.LoadFromFile(Path)" ersetzen. |
Re: Datei Frei geben
Vielen Dank Frickler. Das "FileClose(Auswertung)" war das Richtige. Und den Tipp werd ich auch nochmal ausprobieren ;)
MfG Timbuktu |
Re: Datei Frei geben
[edit]
ahhh stimmt, das FileCreate, welches nie geschlossen wird, hab ich übersehn. :oops: man wertet sofort aus, und hofft nicht, daß zwischendrin nix passiert (oder man verwendet einen Resourcenschutzblock)
Delphi-Quellcode:
CreateDir(Path + 'Pics\');
Auswertung:= FileCreate(Path + Datenbank); if Auswertung = INVALID_HANDLE_VALUE then begin ShowMessage('Datenbank konnt nicht erstellt werden.' + sLineBreak + 'Eine Lösung wäre vielleicht, das Programm als Administrator zu starten.'); end else CloseHandle(Auswertung); Exit; außerdem könnte ein bissl "ordentliche" Fehlerbehandlung nicht schaden
Delphi-Quellcode:
oder mit Resourcenschutzblöcken (Try-Finally)
const LDB : String = 'LampenDB.txt';
function Auslesen(Datenbank: string):TStringArray; var f: Textfile; a, Auswertung: integer; Zeile: TStringArray; Path: String; begin Zeile:= Nil; Path:= extractfilepath(paramStr(0)) + 'LampenDB\'; if DirectoryExists(Path) = False then //Wenn Pfad nicht angelegt ist begin CreateDir(Path); CreateDir(Path + 'Pics\'); Auswertung:= FileCreate(Path + Datenbank); if Auswertung = INVALID_HANDLE_VALUE then begin ShowMessage('Datenbank konnt nicht erstellt werden.' + sLineBreak + 'Eine Lösung wäre vielleicht, das Programm als Administrator zu starten.'); end else CloseHandle(Auswertung) Exit; end; AssignFile(f,Path + Datenbank); //Die daten aus dem Dokument werden in die Variable f "geschoben" reset(f); //Geht an anfang der variable f {$I-} A:= 0; while not EOF(f) do //wenn nicht das ende vom dokument erreicht ist, dann begin Setlength(Zeile,A+1); readln(f,Zeile[A]); if Zeile[A] <> '' then A:= A + 1; end; CloseFile(f); //schließt das dokument wieder {$I-} if IOResult <> 0 then FehlerMeldung; result := Zeile; end;
Delphi-Quellcode:
const LDB : String = 'LampenDB.txt';
function Auslesen(Datenbank: string):TStringArray; var f: Textfile; a, Auswertung: integer; Zeile: TStringArray; Path: String; begin Zeile:= Nil; Path:= extractfilepath(paramStr(0)) + 'LampenDB\'; if DirectoryExists(Path) = False then //Wenn Pfad nicht angelegt ist begin CreateDir(Path); Auswertung:= FileCreate(Path + Datenbank); try CreateDir(Path + 'Pics\'); if Auswertung = INVALID_HANDLE_VALUE then begin ShowMessage('Datenbank konnt nicht erstellt werden.' + sLineBreak + 'Eine Lösung wäre vielleicht, das Programm als Administrator zu starten.'); end finally CloseHandle(Auswertung) end; Exit; end; * AssignFile(f,Path + Datenbank); //Die daten aus dem Dokument werden in die Variable f "geschoben" reset(f); //Geht an anfang der variable f try A:= 0; while not EOF(f) do //wenn nicht das ende vom dokument erreicht ist, dann begin Setlength(Zeile,A+1); readln(f,Zeile[A]); if Zeile[A] <> '' then A:= A + 1; end; finally CloseFile(f); //schließt das dokument wieder end; result := Zeile; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
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 by Thomas Breitkreuz