Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherfehler beim Schreiben & Lesen von Records (https://www.delphipraxis.net/54719-speicherfehler-beim-schreiben-lesen-von-records.html)

Kanne_Kaffe 10. Okt 2005 14:32


Speicherfehler beim Schreiben & Lesen von Records
 
Hallo...
Ich möchte gern einen Record speichern und wieder lesen. Beim lesen der Datei kommt es aber zu der Meldeung:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00453E35 in Modul 'Project1.exe'. Lesen von Adresse 00000005'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------

Ich bin leider zu doof den Fehler zufinden. Ich hoffe einer von Euch kann mir helfen. Hier mal mein Code
Delphi-Quellcode:
type
  pFileInfo = ^TFileInfo;
  TFileInfo = Packed Record
    Name: String;
    Adresse: String;
    Count: Cardinal; // ist grad nicht so wichtih -> wird später benötigt
    end;

var
  Form1: TForm1;
  FileInfo: pFileInfo;
  F: File of pFileInfo;

implementation

{$R *.dfm}
procedure SchreibeDatei(Filename, Name, Adresse: String; Count: Cardinal);
var
  I: Integer;
begin
  New(FileInfo);
  FileInfo.Name := Name;
  FileInfo.Adresse := Adresse;
  FileInfo.Count := Count;

  AssignFile (F, Filename);
  ReWrite(F);
  for I := 1 to 3 do
    write(F, pFileInfo(I));

  CloseFile(F);
  Dispose(FileInfo);
end;

function HoleAdresse(Filename, Name: String): String;
begin
  New(FileInfo);
  AssignFile(F, Filename);
  Reset(F);
  Read(F, FileInfo);
  CloseFile(F);
  Result := FileInfo.Adresse;
  Dispose(FileInfo);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SchreibeDatei('.\Adr.dat', 'Ulli', 'Zuhause', 0); // Einen Eintrag speichern

  showmessage(HoleAdresse('Adr.dat', 'Ulli')); // ausgabe soll sein 'Zuhause'
end;
Danke schonmal im Vorraus.

ste_ett 10. Okt 2005 14:38

Re: Speicherfehler beim Schreiben & Lesen von Records
 
Delphi-Quellcode:
type
  pFileInfo = ^TFileInfo;
  TFileInfo = Packed Record
    Name: String;
    Adresse: String;
    Count: Cardinal; // ist grad nicht so wichtih -> wird später benötigt
  end;

...


F: File of pFileInfo;
Du schreibst in deine Datei nur Pointer, keine Records. :)

Kanne_Kaffe 10. Okt 2005 14:52

Re: Speicherfehler beim Schreiben & Lesen von Records
 
Ich habe die Function jetzt mal geändert
Delphi-Quellcode:
procedure SchreibeDatei(Filename, Name, Adresse: String; Count: Cardinal);
var
  I: Integer;
begin
  New(FileInfo);
  FileInfo.Name := Name;
  FileInfo.Adresse := Adresse;
  FileInfo.Count := Count;

  AssignFile (F, Filename);
  ReWrite(F);
  write(F, FileInfo);

  CloseFile(F);
  Dispose(FileInfo);
end;
Leider ist aber das Result = ''

Muetze1 10. Okt 2005 14:57

Re: Speicherfehler beim Schreiben & Lesen von Records
 
Du schreibst immernoch nur Pointer. Ändere die Deklaration deines Dateityps und des Records von PFileInfo auf TFileInfo und dann nochmal probieren. Schon allein anhand der Anzahl der Einträge und der resultierenden Datei müsstest du dir leicht ausrechnen können, das es nicht hinhaut. Eine 4 Byte grosse Datei kann nicht die ganzen Daten ungepackt enhalten...

Flocke 10. Okt 2005 14:58

Re: Speicherfehler beim Schreiben & Lesen von Records
 
Du brauchst ein
Delphi-Quellcode:
file of TFileInfo
und kein
Delphi-Quellcode:
file of PFileInfo
weil du in letzteres nur die Adresse deines mit New alloziierten Records schreibst.

// Edit: Mal wieder zu langsam...

Kroko1999 10. Okt 2005 14:58

Re: Speicherfehler beim Schreiben & Lesen von Records
 
Zitat:

Zitat von Kanne_Kaffe
Ich habe die Function jetzt mal geändert
Delphi-Quellcode:
procedure SchreibeDatei(Filename, Name, Adresse: String; Count: Cardinal);
var
  I: Integer;
begin
  New(FileInfo);
  FileInfo.Name := Name;
  FileInfo.Adresse := Adresse;
  FileInfo.Count := Count;

  AssignFile (F, Filename);
  ReWrite(F);
  write(F, FileInfo^); // den INHALT schreiben

  CloseFile(F);
  Dispose(FileInfo);
end;
Leider ist aber das Result = ''

den Inhalt schreiben! s.o

Kanne_Kaffe 10. Okt 2005 15:31

Re: Speicherfehler beim Schreiben & Lesen von Records
 
F: File of TFileInfo; Der Compilier ist damit nicht einverstanden: Typ 'TFileInfo' benötigt Finalization - nicht im Dateityp erlaubt :gruebel:

Kroko1999 10. Okt 2005 15:40

Re: Speicherfehler beim Schreiben & Lesen von Records
 
äh, wie war das Strings sind nicht erlaubt, stelle mal auf kurze Strings um oder nimm TFileStream
Delphi-Quellcode:
 pFileInfo = ^TFileInfo;
  TFileInfo = Packed Record
    Name: String[100];
    Adresse: String[100];
    Count: Cardinal; // ist grad nicht so wichtih -> wird später benötigt
    end;
//EDIT: geht es hier nur um einen Record oder sollen später weitere folgen :?:

Kanne_Kaffe 10. Okt 2005 16:05

Re: Speicherfehler beim Schreiben & Lesen von Records
 
Nein es handelt sich nur um diesen einen Record.

Jetzt funtz mit dem Schreiben und Lesen bis hier her. Aber das nächte Problem wird nicht lange auf sich warten lassen. Dank an alle.

Kroko1999 10. Okt 2005 16:14

Re: Speicherfehler beim Schreiben & Lesen von Records
 
dann nimm eine Ini-Datei, dies dürfte viel einfacher sein!


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.
Seite 1 von 3  1 23      

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