Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datenbank mit Fehler in Read Anweisung (https://www.delphipraxis.net/82265-datenbank-mit-fehler-read-anweisung.html)

ghost1601 9. Dez 2006 20:44


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:
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

mkinzler 9. Dez 2006 20:53

Re: Datenbank mit Fehler in Read Anweisung
 
Aus einet textdatei kann man nur Text (Strings) lesen sonst mußt du File of TDaten nehmen.

Maja Jessica 9. Dez 2006 21:02

Re: Datenbank mit Fehler in Read Anweisung
 
Genau,

und
Delphi-Quellcode:
      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.
Delphi-Quellcode:
clankuerzel:string[25];
MJ

ghost1601 9. Dez 2006 21:27

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?

Maja Jessica 9. Dez 2006 22:17

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

ghost1601 10. Dez 2006 09:47

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...

Maja Jessica 10. Dez 2006 11:15

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 wunderschöne Tutorial

MJ

ghost1601 10. Dez 2006 11:21

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.

Maja Jessica 10. Dez 2006 12:05

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:
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

mkinzler 10. Dez 2006 12:07

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 22:11 Uhr.
Seite 1 von 2  1 2      

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