AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbank mit Fehler in Read Anweisung

Ein Thema von ghost1601 · begonnen am 9. Dez 2006 · letzter Beitrag vom 10. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#1

Datenbank mit Fehler in Read Anweisung

  Alt 9. Dez 2006, 20:44
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:
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.
hat irgendjemand eine idee was dort falsch sein kann?
Der Fehler wird in der markierten Zeile, bei daten angezeigt.
Thx
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Datenbank mit Fehler in Read Anweisung

  Alt 9. Dez 2006, 20:53
Aus einet textdatei kann man nur Text (Strings) lesen sonst mußt du File of TDaten nehmen.
Markus Kinzler
  Mit Zitat antworten Zitat
Maja Jessica

Registriert seit: 16. Apr 2005
Ort: Dortmund
95 Beiträge
 
Delphi 4 Standard
 
#3

Re: Datenbank mit Fehler in Read Anweisung

  Alt 9. Dez 2006, 21:02
Genau,

und       clankürzel:string; geht durch den Kompiler? Meiner mosert immer bei ä ü ö - Sonderzeichen.

Warscheinlich musst du, wenn du anstelle von "Textfile" "File of TDaten" nimmst, auch noch die Stringlänge angeben wie z.B.
clankuerzel:string[25]; MJ
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Datenbank mit Fehler in Read Anweisung

  Alt 9. Dez 2006, 21:27
tatsächlich es lag nur an den fehlenden angaben für die stringlängen...
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?
  Mit Zitat antworten Zitat
Maja Jessica

Registriert seit: 16. Apr 2005
Ort: Dortmund
95 Beiträge
 
Delphi 4 Standard
 
#5

Re: Datenbank mit Fehler in Read Anweisung

  Alt 9. Dez 2006, 22:17
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
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Datenbank mit Fehler in Read Anweisung

  Alt 10. Dez 2006, 09:47
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...
  Mit Zitat antworten Zitat
Maja Jessica

Registriert seit: 16. Apr 2005
Ort: Dortmund
95 Beiträge
 
Delphi 4 Standard
 
#7

Re: Datenbank mit Fehler in Read Anweisung

  Alt 10. Dez 2006, 11:15
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 wunderschöne Tutorial

MJ
  Mit Zitat antworten Zitat
ghost1601

Registriert seit: 26. Aug 2006
64 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Datenbank mit Fehler in Read Anweisung

  Alt 10. Dez 2006, 11:21
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
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.
  Mit Zitat antworten Zitat
Maja Jessica

Registriert seit: 16. Apr 2005
Ort: Dortmund
95 Beiträge
 
Delphi 4 Standard
 
#9

Re: Datenbank mit Fehler in Read Anweisung

  Alt 10. Dez 2006, 12:05
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:
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;
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.

MJ
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Datenbank mit Fehler in Read Anweisung

  Alt 10. Dez 2006, 12:07
Noch ein Tipp versuche auf den exzessiven Einsatz von globalen Variablen zu verzichten.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz