Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Records (https://www.delphipraxis.net/90287-records.html)

The Lord 14. Apr 2007 18:40


Records
 
Hallo DP-lers!

Ich habe eigentlich noch nie wirklich mit Records gearbeitet, jedoch wollte ich es gerne ändern.
Im Prinzip ist das Programm, was ich zum üben schreiben möchte eine Adressbuchverwaltung.

Ich habe dafür einen Typ 'Datensatz' deklariert:

Delphi-Quellcode:
type Datensatz = record
       vorname: string[25];
       nachname: string[25];      
       tag: integer;
       monat: integer;
       jahr: integer;    
       bild: string[100];
     end;
Danach habe ich die Variable 'datei' deklariert:

Delphi-Quellcode:
var datei: file of Datensatz;

Des Weiteren habe ich laut Tutorial folgende Prozeduren erstellt:
Delphi-Quellcode:
//Zum Öffnen der Datei

procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei,'daten.dat');
  if FileExists('daten.dat') then ReSet(datei)
  else ReWrite(datei);
end;

//Zum Schließen der Datei


procedure TForm1.FormDestroy(Sender: TObject);
begin
  CloseFile(datei);
end;
Weitergehend verstehe ich das Umgehen mit den Records nicht wirklich.
Also wenn ich jetzt mehrere Personen abspeichern will, wie mache ich das?
Und wie kann ich diese wider aufrufen?
Eigentlich will ich nur Strings aus Edit-Feldern speichern und dann den gewünschten Datensatz wieder in diese Felder laden.

Kann mir das jemand nochmal erklären?

Danke :)

PS: Tutorial

Klaus01 14. Apr 2007 19:12

Re: Records
 
Also:

Delphi-Quellcode:
var
  data : Datensatz;
..
  Read(datei,data);
  Write(datei,data);

data.vorname:=edit1.text;
data.nachname:=edit2.text;
..
Mit FileSize(datei) bekommst Du heraus wie viele Datensätze Deine Datei enthält.
Mit Seek(datei,DatensatzNummer) kannst Du direkt zu einem Datensatz gelangen.

Grüße
Klaus

CCRDude 14. Apr 2007 19:18

Re: Records
 
Erstmal vorweg: den Dateinamen ohne jeden Pfad ist schonmal gefährlich, denn falls mal ne Verknüpfung drauf erstellt wird, vielleicht mit anderem Arbeitspfad, sucht das Programm die schon woanders, und dann wundert man sich natürlich, warum das Programm die Daten auf einmal nicht mehr findet...

Die Daten im Programmverzeichnis an sich sind natürlich auch so eine don't-do-Sache, aber fürs üben...

Bleibt zu meinem Vorredner noch EoF (End-of-File) zu erwähnen, will man einfach alle Daten nacheinander auslesen:
Delphi-Quellcode:
while not EoF(datei) do begin
   Read(datei, satz);
   Verarbeite(satz);
end;
Und in ganz weiter Ferne merkt man dann irgendwann, daß es mit einer TCollection irgendwie komfortabler ist ;)

The Lord 14. Apr 2007 19:56

Re: Records
 
Delphi-Quellcode:
var z : integer;
    person : Datensatz;

z:=FileSize(datei);

Seek(datei,z);
Write(datei,person);
person.vorname:=edit1.text;
Schreibe ich so am Ende der Datei den String aus Edit1 ?

dominikkv 14. Apr 2007 20:24

Re: Records
 
Delphi-Quellcode:
type TDatensatz = record
       vorname: string[25];
       nachname: string[25];      
       tag: integer;
       monat: integer;
       jahr: integer;    
       bild: string[100];
     end;

var Tabelle: Array of TDatensatz;

//...

procedure SaveToFile(Dest: string);
var f: file of TDatensatz;
    I: Cardinal;
begin
  try
    assignFile(f, Dest);
    reWrite(f); //oder reset(f)
    for I := low(Tabelle) to high(Tabelle) do
      write(f, Tabelle[i]);  
  finally
    closeFile(f);
  end;
end;


function LoadFromFile(Source: string);
var f: file of TDatensatz;
    I: Cardinal;
begin
  I := 0;
  try
    assignFile(f, Source);
    reset(f);
    SetLength(Tabelle, FileSize(f));
    while not eof(f) do
      begin
        read(f, Tabelle[I]);
        Inc(I);
      end;  
  finally
    closeFile(f);
  end;
end;

procedure irgendwas;
begin
  LoadFromFile('C:\Test.dat');
 
  if high(Tabelle) > 0 then
    begin
      Tabelle[0].Vorname := editVorname.text;
      editNachname.Text := Tabelle[0].Nachname;
    end;

  SaveToFile('C:\Test.dat');
end;
[edit] paar fehler beseitigt^^[/edit]

TonyR 14. Apr 2007 20:33

Re: Records
 
Ich will bloß mal kurz sagen, dass es nach dem Lesen dieses wunderbaren Tutorials eigentlich keine probleme mehr geben sollte! Jedenfalls nicht, wenn man es ordentlich durchgelsen hat und auch mal ein bisschen rumgebastelt hat!!!
Ich hatte damals auf jeden Fall sofort typisierte Dateien anwenden können... mithilfe jenes Tutorials von dsdt!!!

The Lord 15. Apr 2007 10:52

Re: Records
 
Im Prinzip funktionieren Records doch wie INI-Files. Nur das es jetzt nicht mehr egal ist, ob man es an Anfang oder Ende schriebt!?

Ok danke, ich glaube ich werde es hinbekommen. :dp:

The Lord 1. Mai 2007 11:34

Re: Records
 
Es funktioniert doch noch nicht :(

1. Fehlermeldung:

Delphi-Quellcode:
function LoadFromFile(Source: string);
benötigt Ereigenistyp. Ist das dann auch 'string' ?

2. Fehler:

Delphi-Quellcode:
procedure SaveToFile(Dest: string);
var f: file of TDatensatz;
    I: Cardinal;
begin
  try
    assignFile(f, Dest);
    reWrite(f); //oder reset(f)
    for I := low(Tabelle) to high(Tabelle) do
      write(f, Tabelle[i]);
  finally
    closeFile(f);
  end;
end;
Das Programm stürzt wegen Zeile 9 ab.


Delphi-Quellcode:
LoadFromFile('C:\test.dat');
  if high(Tabelle) > 0 then
    begin
      Tabelle[0].Vorname := Edit1.Text;
      //Edit2.Text := Tabelle[0].Nachname;
    end;
  SaveToFile('C:\test.dat');
So kann man doch nur an die Stelle 0 der Tabelle schreiben!?


Helft mir bitte :)

mkinzler 1. Mai 2007 11:38

Re: Records
 
Delphi-Quellcode:
Tabelle[1].

The Lord 1. Mai 2007 11:40

Re: Records
 
ok, da nehm ich halt ne Schleife. Aber das Programm stürzt ja ab. Ich kann es gar nicht ausprobieren :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.
Seite 1 von 4  1 23     Letzte »    

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-2025 by Thomas Breitkreuz