Registriert seit: 5. Mai 2016
5 Beiträge
|
Rewrite I/O-Error 'Ungültiger Dateiname
5. Mai 2016, 22:57
Guten Abend und frohen Männertag allen zusammen.
Das ist das erste Mal, dass ich ein Forum dieser Art schreibe, da ich normal alle meine Probleme selber löse oder schon jemand anderes einen Lösungsansatz in einem dieser Foren hat.
Zur Übersicht:
Ich schreibe für meine Abschlussarbeit im Abitur ein Programm, welches Lehrern zum Erstellen von Tabellen (u.a. Sportveranstaltungen, etc.) dienen soll, was auch später noch mit dem Internet zusammenarbeitet und momentan aber nur lokal funktionieren muss für die Zwischenpräsentation.
Gestern bin ich mit dem Rohaufbau fertig geworden (ich nutze, da ich die meiste Zeit nicht zuhause bin, Ubuntu) und wollte es heute unter Windows das Programm nochmal testen. Da ist mir ein Fehler aufgefallen, der unter Ubuntu 16.04 LTS gar nicht auftritt.
Und zwar wird mir ein I/O-Error angezeigt mit der Meldung "Ungültiger Dateiname".
Das Programm sieht wie in ansicht.jpg aus. Im rechten Formular werden die verfügbaren Dateien aufgelistet (momentan keine) und mit einem Doppelklick wird auf dem Formular in der Mitte entsprechend alle Daten aus der entsprechenden Textdatei ausgelesen und angezeigt. Erstellt werden die Tabellen in einem Extraformular mit Namen "Tabelle_Erstellen". Zur Randinfo: das Formular in der Mitte und rechts im Bild werden beim Einloggen sofort gleichzeitig angezeigt.
Code von dem Formular in der Mitte "Verwaltung_Lehrer". (Ich lasse das raus, was eigentlich nicht von Belangen ist)
Delphi-Quellcode:
unit Verwaltung_Lehrer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Grids, Tabellenliste, StdCtrls;
var
Verwaltung: TVerwaltung;
Grid: TStringGrid;
Daten: TTabellendaten;
Tabelleninhalt: TTabelle;
Tabellendaten: TTabellendaten;
Spalten, Zeilen: integer;
implementation
uses Veranstaltung_Schueler, Einloggen, Erstelle_Tabelle;
{$R *.dfm}
procedure TVerwaltung.FormActivate(Sender: TObject);
var i, k: integer;
begin
{
record
Name : string;
Datumvon : string[10];
Datumbis : string[10];
Spalte : string;
Zeile : string;
Information : string;
end;}
Tabelleninhalt:= Tabellenliste.FTabellenliste.Tabelle; //Wert aus der Unit Tabellenliste übergeben
Tabellendaten:= Tabellenliste.FTabellenliste.Daten;
LName.Caption:= Tabellendaten. Name;
LDatum.Caption:= (' Von: ' + Tabellendaten.Datumvon + ' . Bis: ' + Tabellendaten.Datumbis);
MInformationstext.Clear;
MInformationstext.Lines.Add(Tabellendaten.Information);
VAL(Tabellendaten.Zeile,Zeilen,Fehler);
VAL(Tabellendaten.Spalte,Spalten,Fehler);
if (Tabellendaten.Zeile <> ' ') AND (Tabellendaten.Spalte <> ' ')
then begin
SGTabelle.ColCount := Spalten + 1;
SGTabelle.RowCount := Zeilen + 1;
for i:= 0 to Zeilen do
for k:= 0 to Spalten do
begin
SGTabelle.Cells[k, i] := Tabelleninhalt[i,k];
end;
end
end;
Das Formular bekommt hier den Variableninhalt von dem Record und dem dynamischen zweidimensionalen Array aus Tabellenliste übergeben und soll damit weiterarbeiten
Der Code von dem Formular rechts "Tabellenliste"
Delphi-Quellcode:
unit Tabellenliste;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TTabellendaten = record
Name : string;
Datumvon : string[10];
Datumbis : string[10];
Spalte : string;
Zeile : string;
Information : string;
end;
TTabelle = array of array of string;
.
.
.
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
Tabelle : TTabelle;
Daten: TTabellendaten;
end;
var
FTabellenliste: TFTabellenliste;
implementation
{$R *.dfm}
procedure TFTabellenliste.FormActivate(Sender: TObject);
var Filetxt: TSearchRec; //Record mit allen Informationen zur Datei
begin
LBTabellenListe.Items.Clear;
{TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;}
if FindFirst(' table_data\' + ' *.txt', faAnyFile, Filetxt) = 0 //gibt 0 zurück, wenn gefunden; wenn nicht dann negativer Wert
then begin
repeat
LBTabellenliste.Items.Add(Filetxt. Name);
until
FindNext(Filetxt) <> 0; //gibt ebenfalls 0 zurück, wenn gefunden
FindClose(Filetxt);
end
else
showmessage(' Keine Tabellen vorhanden!');
end;
procedure TFTabellenliste.LBTabellenlisteDblClick(Sender: TObject);
var textdatei: TextFile;
var k, i, j: integer;
var Zeilen, Spalten, Fehler, Position: integer;
var hilf: string;
begin
{record
Name : string;
Datumvon : string[10];
Datumbis : string[10];
Spalte : string[30];
Zeile : string;
Information : string;
end;}
i:= LBTabellenListe.ItemIndex;
AssignFile(textdatei, ' table_data\' + LBTabellenliste.Items[i]);
Reset(textdatei);
//Zeile für Zeile aus organisierter txt lesen
with Daten do
begin
readln(textdatei, Name);
readln(textdatei, Datumvon);
readln(textdatei, Datumbis);
readln(textdatei, Spalte);
readln(textdatei, Zeile);
readln(textdatei, Information);
end;
VAL(Daten.Zeile,Zeilen,Fehler);
VAL(Daten.Spalte,Spalten,Fehler);
// Tabelle: array of array of string;
setLength(Tabelle, Zeilen + 1, Spalten + 1); //Tabelle((Zeilen), (Zeilen), ..)
repeat
for k:= 0 to Zeilen do
begin
j:= 0;
readln(textdatei, hilf);
repeat
Position:= pos(' |', hilf);
if Position <> 0
then begin
Tabelle[k, j]:= Copy(hilf, 1, Position - 1);
delete(hilf, 1, Position);
j:= j + 1;
end
else
until
Position = 0;
end
until EoF(textdatei);
closefile(textdatei);
end;
end.
Hier wird entsprechend alles aus den Dateien nach dem Doppelklick ausgelesen und in das Record und das Array "eingeschrieben" (mir fällt gerade kein besseres Wort dafür ein).
Und schlussendlich noch der Code zum Erstellen der Tabelle aus Formular "Erstelle_Tabelle"
Delphi-Quellcode:
unit Erstelle_Tabelle;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, Grids;
var
Erstelle: TErstelle;
spalte, zeile, datumvon, datumbis, name_table, information, spaltenkopf, zeilenkopf: string;
spaltenanz, zeilenanz, fehler: integer;
implementation
{$R *.dfm}
procedure TErstelle.BErstellenClick(Sender: TObject);
var textdatei : TextFile;
var name_text: string;
var i, k: integer;
begin
//spalte, zeile, datumvon, datumbis, name_table
name_table:= EName_Tabelle.Text;
datumvon:= EDatum_Von.Text;
datumbis:= EDatum_Bis.Text;
spalte:= CBAnzahlSpalten.Text;
zeile:= CBAnzahlZeilen.Text;
information:= MInformationstext.Lines.Text;
name_text:= name_table + ' _' + datumvon + ' _' + datumbis + ' .txt' ;
AssignFile(textdatei,' table_data\' + name_text);
Rewrite(textdatei);
write(textdatei, name_table + #13#10
+ datumvon + #13#10
+ datumbis + #13#10
+ spalte + #13#10
+ zeile + #13#10
+ information + #13#10);
for i:= 0 to SGTabelle.RowCount - 1 do //von i = 0 bis Ende Zeile - 1
for k:= 0 to SGTabelle.ColCount - 1 do //von k = 0 bis Ende Spalte - 1
begin
write(textdatei, SGTabelle.Cells[k, i] + ' |'); //Schreibe in Zeile
if (k = SGTabelle.ColCount - 1) //Wenn k = Endwert der Spalten dann Zeilenumbruch
then write(textdatei, #13#10); //Zeilenumbruch erfolgt
end;
closefile(textdatei);
showmessage(' Erfolgreich!');
end;
Hier tritt der anscheinende Fehler bei rewrite(textdatei) auf, der eigentlich gar kein Fehler ist, da syntaktisch alles stimmt.
Ich wäre sehr froh darüber, wenn mir jemand bei dem Problem zu einer Lösung verhelfen könnte, da ich momentan absolut nicht weiter weiß. Programmdateien kann ich in einer .zip noch anhängen, falls gewünscht.
Mit freundlichen Grüßen
|