![]() |
Datenbank mit Fehler in Read Anweisung
Hi Leutz,
ich wollte mich mal ranmachen und für meinen Clan eine Datenbank in Form eines Delphiprogrammes erstellen. Hat im Prinzip auch ganz gut geklappt bis ich dann irgendwann das Programm ausführen wollte und einen Fehler bekam...mitlerweile steh ich kurz vor dem Verzweifeln.
Delphi-Quellcode:
hat irgendjemand eine idee was dort falsch sein kann?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) MainMenu1: TMainMenu; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Datei1: TMenuItem; ffnen1: TMenuItem; speichern2: TMenuItem; beenden1: TMenuItem; Edit1: TEdit; Label1: TLabel; Edit2: TEdit; Label2: TLabel; Edit3: TEdit; Label3: TLabel; Edit4: TEdit; Label4: TLabel; Edit5: TEdit; Label5: TLabel; Edit6: TEdit; Label6: TLabel; ComboBox1: TComboBox; Label7: TLabel; Memo1: TMemo; Label8: TLabel; StatusBar1: TStatusBar; Button1: TButton; Button2: TButton; procedure beenden1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure speichern2Click(Sender: TObject); procedure ffnen1Click(Sender: TObject); private procedure ArrayinMaske; procedure MaskeinArray; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation type tdaten=record clanname:string; clankürzel:string; homepage:string; spiel:string; kontaktname:string; icq:integer; msn:string; kommentar:string; end; const max=100; var p:integer; daten:tdaten; datenfeld:array[1..max]of tdaten; datendatei:textfile; {$R *.dfm} procedure TForm1.ArrayinMaske; begin daten:=datenfeld[p]; edit1.text:=daten.clanname; edit2.text:=daten.clankürzel; edit6.text:=daten.homepage; combobox1.text:=daten.spiel; edit3.text:=daten.kontaktname; edit4.Text:=inttostr(daten.icq); edit5.Text:=daten.msn; memo1.Text:=daten.kommentar; statusbar1.panels[0].text:='Position: '+inttostr(p) + '/' + inttostr(max); daten:=datenfeld[p]; end; procedure TForm1.MaskeinArray; begin daten.clanname:=edit1.text; daten.clankürzel:=edit2.text; daten.homepage:=edit6.text; daten.spiel:=combobox1.Text; daten.kontaktname:=edit3.text; daten.icq:=strtoint(edit4.text); daten.msn:=edit5.Text; daten.kommentar:=memo1.text; datenfeld[p]:=daten; end; procedure TForm1.Button2Click(Sender: TObject); begin MaskeinArray; if p<max then inc(p); ArrayinMaske; end; procedure TForm1.Button1Click(Sender: TObject); begin MaskeinArray; if p>1 then dec(p); ArrayinMaske; end; procedure TForm1.ffnen1Click(Sender: TObject); var zaehler:integer; begin maskeinarray; if opendialog1.execute then begin assignfile(datendatei, opendialog1.filename); reset(datendatei); for zaehler:=1 to max do begin read(datendatei,daten); [b]---->Hier wird der Fehler angezeigt![/b] datenfeld[zaehler]:=daten; [b]---->[Fehler] Unit1.pas(125): E2055[/b] end; [b]---->Ungültiger Typ in[/b] closefile(datendatei) [b]---->Read/Readln-Anweisung[/b] end; end; procedure TForm1.speichern2Click(Sender: TObject); var zaehler:integer; begin MaskeinArray; if savedialog1.execute then begin assignfile(datendatei,savedialog1.filename); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei) end; end; procedure TForm1.FormCreate(Sender: TObject); begin p:=1; arrayinmaske; end; procedure TForm1.beenden1Click(Sender: TObject); begin close; end; end. Der Fehler wird in der markierten Zeile, bei daten angezeigt. Thx |
Re: Datenbank mit Fehler in Read Anweisung
Aus einet textdatei kann man nur Text (Strings) lesen sonst mußt du File of TDaten nehmen.
|
Re: Datenbank mit Fehler in Read Anweisung
Genau,
und
Delphi-Quellcode:
geht durch den Kompiler? Meiner mosert immer bei ä ü ö - Sonderzeichen.
clankürzel:string;
Warscheinlich musst du, wenn du anstelle von "Textfile" "File of TDaten" nimmst, auch noch die Stringlänge angeben wie z.B.
Delphi-Quellcode:
MJ
clankuerzel:string[25];
|
Re: Datenbank mit Fehler in Read Anweisung
tatsächlich es lag nur an den fehlenden angaben für die stringlängen... :lol: :oops:
was die ü, ö etc. angeht, da ist bei mir noch nie ein problem gewesen...höchstens bei den dateinamen thx für die hilfe add-on: das programm kommt schonmal in die gänge, läuft auch alles so wie es soll, nurdie gespeicherten daten können hinterher nicht eingelesen werden...der quelltext ist noch ziemlich der selbe. hat jemand eine idee weshalb die datei nicht richtig geöffnet werden kann? |
Re: Datenbank mit Fehler in Read Anweisung
Hi,
was genau funktioniert denn nicht? Sehe du hast in Create schon einen Aufruf "ArrayInMaske" ... im Array steht aber noch nichts. Ist das so gewollt? Seltsam, habe gerade mal ausprobiert, "Textfile" anstelle von File of TDaten funktioniert. Normalerweise (oder besser immer) nimmt man aber, wie mkinzler schon schrieb, "File of Datentyp", also File of TDaten und greift mit read, write und seek darauf zu. Bei Textfile mit writeln und readln. Liegt es etwa daran? MJ |
Re: Datenbank mit Fehler in Read Anweisung
wenn ich aber textfile nehme, so wie du es schreibst, dann kommt wieder:
[Fehler] Unit1.pas(125): E2055 Ungültiger Typ in Read/Readln-Anweisung und der kommt wenn ich den tdaten-datentyp nehme nicht. und das hauptproblem wird dann auch noch nicht abgedeckt. es handelt sich hierbei ganz einfach nur um das ausgabeproblem. die an zu legende datei, wird wie geplant erzeugt. auch mit dem inhalt der zuvor in der Form eingetragen wurde. nur wird, wenn ich die gespeicherte datei wieder öffnen will nichts in die form geladen...ich hab keinen plan warum. bei anderen programmen is der selbe algorithmus und da geht es komischer weise... |
Re: Datenbank mit Fehler in Read Anweisung
Hallo ...
Überprüfe doch mal die Reihenfolge des Programm. Zum Zeitpunkt create steht noch garnichts (vernünftiges) im Array. Du zeigst es aber mit ArrayinMaske an. Und was passiert nach dem öffnen der Datei? Du lädst die Daten ins Array, zeigst sie aber nicht an. Sorry, aber irgendwie ist der Aufbau des Programm ein wenig verwirrend. Stell' doch bitte nocheinmal deinen aktuellen Code ins Forum. Was aber auch sehr gut ist, ist dieses ![]() MJ |
Re: Datenbank mit Fehler in Read Anweisung
na klar den stell ich gerne rein!
das mit dem oncreate und dem arrayinmaske ist allerdings schon lange raus^^ das mit dem anzeigen ist auch so ziemlich das ursprüngliche problem...da haperts auch noch :oops:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) MainMenu1: TMainMenu; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Datei1: TMenuItem; ffnen1: TMenuItem; speichern2: TMenuItem; beenden1: TMenuItem; Edit1: TEdit; Label1: TLabel; Edit2: TEdit; Label2: TLabel; Edit3: TEdit; Label3: TLabel; Edit4: TEdit; Label4: TLabel; Edit5: TEdit; Label5: TLabel; Edit6: TEdit; Label6: TLabel; ComboBox1: TComboBox; Label7: TLabel; Memo1: TMemo; Label8: TLabel; StatusBar1: TStatusBar; Button1: TButton; Button2: TButton; procedure beenden1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure speichern2Click(Sender: TObject); procedure ffnen1Click(Sender: TObject); private procedure ArrayinMaske; procedure MaskeinArray; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation type tdaten=record clanname:string[20]; clankuerzel:string[6]; homepage:string[30]; spiel:string[20]; kontaktname:string[30]; icq:integer; msn:string[30]; kommentar:string[150]; end; const max=100; var p:integer; daten:tdaten; datenfeld:array[1..max]of tdaten; datendatei:file of tdaten; {$R *.dfm} procedure TForm1.ArrayinMaske; begin daten:=datenfeld[p]; edit1.text:=daten.clanname; edit2.text:=daten.clankuerzel; edit6.text:=daten.homepage; combobox1.text:=daten.spiel; edit3.text:=daten.kontaktname; edit4.Text:=inttostr(daten.icq); edit5.Text:=daten.msn; memo1.Text:=daten.kommentar; statusbar1.panels[0].text:='Position: '+inttostr(p) + '/' + inttostr(max); daten:=datenfeld[p]; end; procedure TForm1.MaskeinArray; begin daten.clanname:=edit1.text; daten.clankuerzel:=edit2.text; daten.homepage:=edit6.text; daten.spiel:=combobox1.Text; daten.kontaktname:=edit3.text; daten.icq:=strtoint(edit4.text); daten.msn:=edit5.Text; daten.kommentar:=memo1.text; datenfeld[p]:=daten; end; procedure TForm1.Button2Click(Sender: TObject); begin MaskeinArray; if p<max then inc(p); ArrayinMaske; end; procedure TForm1.Button1Click(Sender: TObject); begin MaskeinArray; if p>1 then dec(p); ArrayinMaske; end; procedure TForm1.ffnen1Click(Sender: TObject); var zaehler:integer; begin maskeinarray; if opendialog1.execute then begin assignfile(datendatei, opendialog1.filename); reset(datendatei); for zaehler:=1 to max do begin read(datendatei,daten); datenfeld[zaehler]:=daten; end; closefile(datendatei) end; end; procedure TForm1.speichern2Click(Sender: TObject); var zaehler:integer; begin MaskeinArray; if savedialog1.execute then begin assignfile(datendatei,savedialog1.filename); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei) end; end; procedure TForm1.FormCreate(Sender: TObject); begin p:=1; end; procedure TForm1.beenden1Click(Sender: TObject); begin close; end; end. |
Re: Datenbank mit Fehler in Read Anweisung
Hi,
mit kleinen Modifikationen geht es zumindest, es werden Datensätze angezeigt, wobei aber noch so einiges zu beachten wäre: - close ohne Nachfrage ob speichern? - Probleme wenn du irgendwann mehr als 100 Einträge machen möchtest - Bei vor/zurück wird immer der aktuelle Satz ins Array übertragen (ungewollte Änderungen abfangen)? - Vorbelegung mit open-/savedialog1.InitialDir
Delphi-Quellcode:
Auch vom Grundsatz her würde ich es wie im Tut mit direkten Zugriff auf das Datenfile (seek) machen, damit wäre dann auch das Problem mit dem Array und Max gelöst.
const max=100;
var p:integer; daten:tdaten; datenfeld:array[1..max]of tdaten; datendatei: file of tdaten; {$R *.dfm} procedure TForm1.ArrayinMaske; begin daten:=datenfeld[p]; edit1.text:=daten.clanname; edit2.text:=daten.clankuerzel; edit6.text:=daten.homepage; combobox1.text:=daten.spiel; edit3.text:=daten.kontaktname; edit4.Text:=inttostr(daten.icq); edit5.Text:=daten.msn; memo1.Text:=daten.kommentar; statusbar1.SimpleText:='Position: '+inttostr(p) + '/' + inttostr(max); end; procedure TForm1.MaskeinArray; begin daten.clanname:=edit1.text; daten.clankuerzel:=edit2.text; daten.homepage:=edit6.text; daten.spiel:=combobox1.Text; daten.kontaktname:=edit3.text; daten.icq:=strtoint(edit4.text); daten.msn:=edit5.Text; daten.kommentar:=memo1.text; datenfeld[p]:=daten; end; procedure TForm1.FormCreate(Sender: TObject); begin p:=1; end; procedure TForm1.Button2Click(Sender: TObject); begin MaskeinArray; if p<max then inc(p); ArrayinMaske; end; procedure TForm1.Button1Click(Sender: TObject); begin MaskeinArray; if p>1 then dec(p); ArrayinMaske; end; procedure TForm1.ButtonOeffnenClick(Sender: TObject); var zaehler:integer; begin if opendialog1.execute then begin assignfile(datendatei, opendialog1.filename); reset(datendatei); for zaehler:=1 to max do begin read(datendatei,daten); datenfeld[zaehler]:=daten; end; closefile(datendatei) p:=1; ArrayInMaske; end; end; procedure TForm1.speichernClick(Sender: TObject); var zaehler:integer; begin if savedialog1.execute then begin assignfile(datendatei,savedialog1.filename); rewrite(datendatei); for zaehler:=1 to max do begin daten:=datenfeld[zaehler]; write(datendatei,daten); end; closefile(datendatei) end; end; procedure TForm1.beendenClick(Sender: TObject); begin // Abfrage speichern??? close; end; MJ |
Re: Datenbank mit Fehler in Read Anweisung
Noch ein Tipp versuche auf den exzessiven Einsatz von globalen Variablen zu verzichten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 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