Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Problem mit dem Speichern von Records (https://www.delphipraxis.net/104059-problem-mit-dem-speichern-von-records.html)

Damaster 26. Nov 2007 19:23


Problem mit dem Speichern von Records
 
Hallo Leute!

Ich sitze schon fast den ganzen Mittag an meinem Programm zur Verwaltung von Kontakten. Hedoch komm ich mit dem Speichern und VORALLEM mit dem auslesen nicht klar. Wenn ich auslese und versuche den ausgelesenen Inhalt anzuzeigen passiert nichts.

Hier mal der code:
Delphi-Quellcode:
type TMensch= record name,vname,tel,handy,email,ort,strasse,post,icq:string[100];
              end;
var typ:array of TMensch;
     i:integer;

procedure LoadFromFile(Source: string);
var f: file of TMensch;
    m: Cardinal;
begin
  m := 0;
  try
    assignFile(f, Source);
    reset(f);
    SetLength(typ, FileSize(f));
    while not eof(f) do
      begin
        read(f, Typ[m]);
        Inc(m);
      end;
  finally
    closeFile(f);
    i:=m;
  end;
end;

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

procedure TForm1.FormCreate(Sender: TObject);
begin

Loadfromfile('Kontakte.dat');
end;


procedure TForm1.Button1Click(Sender: TObject);
var
d,a:integer;
begin
a:=0;
if i=0 then i:=1;
setlength(typ,i);
   with typ[i-1] do begin
      name:=Edit2.text;
      vname:=Edit1.text;
      Ort:=Edit4.text;
      Handy:=Edit9.text;
      Tel:=Edit8.text;
      icq:=Edit7.text;
      Strasse:=Edit5.text;
      Post:=Edit3.text;
      email:=Edit6.text;
      end;
   inc(i);
   Form1.Leeren;
   Edit1.SetFocus;
end;


procedure TForm1.Button2Click(Sender: TObject);
var s:integer;
begin
Listbox1.clear;
   for s:=1 to i-1 do begin
      with typ[s-1] do begin
         with listbox1.Items do begin
            add('Vorname: '+vname);
            add('Name: '+name);
            add('Adresse: ');
            add('Postleitzahl: '+post);
            add('Ort: '+ort);
            add('Straße: '+strasse);
            add('Kontaktinformationen: ');
            add('E-Mail: '+email);
            add('ICQ: '+icq);
            add('Telefon: '+tel);
            add('Handy: '+handy);
            add('------------------------------------------------------');
         end;
      end;
   end;
end;


procedure TForm1.Leeren;
var a:integer;
begin
   for a := 1 to 9 do begin
      with TEdit(findcomponent('Edit'+inttostr(a))) do
         text := '';
   end;
end;


procedure TForm1.Restart1Click(Sender: TObject);
var t:file of TMensch;
k:file;
g:integer;
begin
   Listbox1.clear;
   Form1.Leeren;
   Edit1.SetFocus;
   i:=1;
   assignfile(t,'Kontakte.dat');
   rewrite(t);
      try
      for g:=low(typ) to high(typ) do
      write(t,typ[g]);
      finally Closefile(t);
    end;
    assignfile(k,'Anzahl.dat');
    rewrite(k,inttostr(i));
    closefile(k);
end;


procedure TForm1.Ende1Click(Sender: TObject);
var t:file of Tmensch;
g:integer;
begin
savetofile('Kontakte.dat');
close;
end;



procedure TForm1.Button3Click(Sender: TObject);
var a:integer;
begin
Listbox1.clear;
if radiobutton1.Checked then for a:=low(typ) to high(typ) do
if typ[a].name=Edit10.Text then
begin
 with typ[a] do begin
         with listbox1.Items do begin
            ...
         end;
      end;
end;
if radiobutton2.Checked then for a:=low(typ) to high(typ) do
if typ[a].vname=Edit10.Text then
begin
 with typ[a] do begin
         with listbox1.Items do begin
          ...
         end;
      end;
end;
if radiobutton3.Checked then for a:=low(typ) to high(typ) do
if typ[a].post=Edit10.Text then
begin
 with typ[a] do begin
         with listbox1.Items do begin
            ...
         end;
      end;
end;
end;
Was mach ich da falsch?
mfg
Damaster

jbg 26. Nov 2007 19:32

Re: Problem mit dem Speichern von Records
 
So auf den ersten Blick würde ich sagen, dass deine globale Variable i (schlechter Stil) den Wert 0 hat und somit die "for s:=1 to i-1 do"-Schleife nichts macht.

Damaster 26. Nov 2007 19:39

Re: Problem mit dem Speichern von Records
 
Werde ich mal überprüfen.
Wundert mich nur, da es ja in der Lade procedure nicht vorkommt. :?:
Was meinst du mit schlechtem Stil? Wegen der globalen Deklaration? Die vermeide ich meistens auch, aber hier wäre es eigentlich angenehmer. Sonst müsste man ja immer eine Variable übergeben. Oder geht das einfacher?

DP-Maintenance 26. Nov 2007 19:39

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage

jbg 26. Nov 2007 20:21

Re: Problem mit dem Speichern von Records
 
Zitat:

Zitat von Damaster
Oder geht das einfacher?

Length(Typ)

dominikkv 26. Nov 2007 20:31

Re: Problem mit dem Speichern von Records
 
Hi
Du solltest dir mal angewöhnen deinen code zu formatieren (zB einrücken), dann fällt einem das debuggen viel einfacher.
Ich hab mal ein bisschen in deinem Code rumgeschrieben...
Delphi-Quellcode:
type
  TMensch = record
    name, vname, tel, handy, email,
    ort, strasse, post, icq: string[100];
  end;

var
  typ: array of TMensch;


// ...

procedure LoadFromFile(Source: string);
var f: file of TMensch;
    m: Cardinal;
begin
  m := 0;
  try
    assignFile(f, Source);
    reset(f);
    SetLength(typ, FileSize(f));
    while not eof(f) do
      begin
        read(f, Typ[m]);
        Inc(m);
      end;
  finally
    closeFile(f);
  end;
end;

procedure SaveToFile(Dest: string);
var f: file of TMensch;
    m: Cardinal;
begin
  try
    assignFile(f, Dest);
    reWrite(f); //oder reset(f)
    for m := 0 to high(typ) do
      write(f, typ[m]);
  finally
    closeFile(f);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  setlength(typ, Succ(Length(typ)));
  with typ[high(typ)] do
    begin
      name := Edit2.text;
      vname := Edit1.text;
      Ort := Edit4.text;
      Handy := Edit9.text;
      Tel := Edit8.text;
      icq := Edit7.text;
      Strasse := Edit5.text;
      Post := Edit3.text;
      email := Edit6.text;
    end;
  Form1.Leeren;
  Edit1.SetFocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s: integer;
begin
  Listbox1.clear;
  for s := 0 to high(typ) do
    with typ[s] and listbox1.Items do
      begin
        add('Vorname: '+vname);
        add('Name: '+name);
        add('Adresse: ');
        add('Postleitzahl: '+post);
        add('Ort: '+ort);
        add('Straße: '+strasse);
        add('Kontaktinformationen: ');
        add('E-Mail: '+email);
        add('ICQ: '+icq);
        add('Telefon: '+tel);
        add('Handy: '+handy);
        add('------------------------------------------------------');
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Loadfromfile('Kontakte.dat');
end;

procedure TForm1.Leeren;
var
  a: integer;
begin
  for a := 1 to 9 do
    (FindComponent('Edit'+IntToStr(a)) as TEdit).text := '';
end;

procedure TForm1.Restart1Click(Sender: TObject);   // Sinn ?!?
var
  t: file of TMensch;
  g: integer;
begin
  Listbox1.clear;
  Form1.Leeren;
  Edit1.SetFocus;
  try
    assignfile(t, 'Kontakte.dat');
    rewrite(t);
    for g := 0 to high(typ) do
      write(t, typ[g]);
  finally
    Closefile(t);
  end;
end;

procedure TForm1.Ende1Click(Sender: TObject);
begin
  savetofile('Kontakte.dat');
  close;
end;



procedure TForm1.Button3Click(Sender: TObject);
var
  a: Integer;
begin
  Listbox1.clear;
  if radiobutton1.Checked then
    for a := 0 to high(typ) do
      if typ[a].name = Edit10.Text then
        with typ[a] and listbox1.Items do
          begin
            // ...
          end;
  if radiobutton2.Checked then
    for a := 0 to high(typ) do
      if typ[a].vname = Edit10.Text then
        with typ[a] and listbox1.Items do
          begin
            // ...
          end;
  if radiobutton3.Checked then
    for a := 0 to high(typ) do
      if typ[a].post = Edit10.Text then
        with typ[a] and listbox1.Items do
          begin
            // ...
          end;
end;

Damaster 26. Nov 2007 20:47

Re: Problem mit dem Speichern von Records
 
Mit der length Funktion hatte ich es anfangs auch probiert, nur bekam ich dann eine Fehlermeldung.
Length gibt doch die tatsächliche Länge an, fängt also an bei 1 zu zählen oder?
Aber wenn ich den Quellcode so lese, dann denk ich eher dass der Pc bei 0 anfängt. Dann hat unser Lehrer sich wohl verschrieben, dann weis ich auch, was mein Problem war.
Vielen Dank!
Es geht!

mfg
Damaster

dominikkv 26. Nov 2007 20:59

Re: Problem mit dem Speichern von Records
 
stell dir ein array wie ein schrank vor:
length liefert die anzahl der schubladen, high die nummer der letzten schublade.
da bei (dynamischen) arrays mit 0 angefangen wird zu zählen ist length = high+1

also:
length = anzahl elemente
high = nummer des letzten elements


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 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