Autor Beitrag
Slice
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Sa 24.01.09 20:30 
Hey,
also wir sollen Namen, alter usw. in einer typisierten Datei speichern, dann laden und in einer Listbox ausgeben. Diese sollen dann in der Listbox sortiert werden, was mein 1. Problem ist. Dann ist das 2. Problem, dass wenn ich die Liste aus der Datei lade und in die Listbox einfüge, wird der Name usw. 100mal angezeigt (array ist 1 bis 100). Schaut euch am besten mal den Quelltext an.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
 Tliste = record
  vorname,nachname,ort: string[100];
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    ListBox1: TListBox;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button4: TButton;
    Button5: TButton;
    Label5: TLabel;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  datei: File of Tliste;
  i: Integer;
  liste: array [1..100] of Tliste;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);  //In Listbox einfügen und Array speichern
begin
i:= i+1;
 liste[i].vorname:= Edit1.Text;
  liste[i].nachname:= Edit2.Text;
   liste[i].ort:= Edit3.Text;
    Listbox1.Items.Add(liste[i].vorname+' '+liste[i].nachname+' aus '+liste[i].ort)
end;

procedure TForm1.Button2Click(Sender: TObject);   //Speichern in Datei
begin
   assignfile(datei,'C:\Klassenliste.txt');
   rewrite(datei);
   for i:=1 to 100 do write(datei,liste[i]);
   closefile(datei);
end;

procedure TForm1.Button3Click(Sender: TObject);        // Laden und in Listbox einfügen
var
c: integer;
begin
 assignfile(datei,'C:\Klassenliste.txt');
  reset(datei);
   Listbox1.Clear;
    for c:=1 to filesize(datei) do
     begin
      read(datei,liste[i]);
       Listbox1.Items.Add(liste[i].vorname+' '+liste[i].nachname+' aus '+liste[i].ort);
     end;
     closefile(datei);

      end;

procedure TForm1.Button4Click(Sender: TObject);       //Listbox leeren
begin
Listbox1.Clear;
end;

procedure TForm1.Button6Click(Sender: TObject);        //Liste löschen
begin
DeleteFile('C:\Klassenliste.txt');
end;

end.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.01.09 20:37 
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for c:=1 to filesize(datei) do //die Laufvariable heißt hier c und nicht i
     begin
       read(datei,liste[i]);
       Listbox1.Items.Add(liste[i].vorname+' '+liste[i].nachname+' aus '+liste[i].ort);
     end;

Wenn ich so etwas versuche, sagt mein Delphi immer, dass es sich bei der Schleifenvariablen um eine einfache lokale Variable handeln muss.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 24.01.09 21:04 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
for c:=1 to filesize(datei) do //die Laufvariable heißt hier c und nicht i
     begin
       read(datei,liste[i]);
Wenn ich so etwas versuche, sagt mein Delphi immer, dass es sich bei der Schleifenvariablen um eine einfache lokale Variable handeln muss.
Umgekehrt. ;-)
Die Schleifenvariable c ist schon richtig, aber in der Schleife muss die dann auch benutzt werden und nicht i...

Bei Button2Click allerdings sollte der Fehler kommen, dass es eine lokale Variable sein muss.

Sowas kommt davon, wenn man globale Variablen so aussagekräftig bezeichnet wie i, das i sagt einem doch schon ganz genau beim Hinsehen exakt was die Variable machen soll... :roll:
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.01.09 21:42 
Das hab ich doch gemeint *seufz*. Ich muss mich echt schwer ausdrücken.
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 25.01.09 14:53 
hab bei der schleife jetzt c anstatt dem i eingesetzt, aber es hat sich leider rein gar nichrts geändert. und bei Button2Click kommt kein Fehler!?

PS: Muss wenn möglich bis heute abend fertig sein^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 25.01.09 15:02 
Hast du denn mal den Debugger benutzt?
(Haltepunkt setzen (F5), Programm ausführen (F9), wenn das Programm am Haltepunkt ankommt, zeilenweise durch den Code gehen (F8), Variablen durch Maus drüberhalten oder Markieren und Strg + F7 auswerten)

Sonst häng doch mal das komplette Programm an, dann probiere ich es einmal aus.

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das hab ich doch gemeint *seufz*.
Jetzt wo du es sagst, stimmt, so kann mans auch verstehen. :oops:
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 25.01.09 15:36 
Hier ist mal das komplette Programm, denke das wird helfen^^
Einloggen, um Attachments anzusehen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 25.01.09 15:42 
Außer dass i nicht initialisiert wird (und praktisch keine Fehlerbehandlung stattfindet), fällt mir nichts Besonderes auf.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 25.01.09 15:49 
Mir aber:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
   for i:=1 to 100 do write(datei,liste[i]);
// Du schreibst alle 100 in die Datei, egal wie viele belegt sind...

for c:=1 to filesize(datei) do
// und liest alle wieder...
Deshalb erscheinen dann ggf. leere Einträge. ;-)

Beim ersten Start kam eine Fehlermeldung, dass der Dateiname ungültig sei.

Denn du benutzt absolute feste Dateipfade (auch wenn du das im Quelltext auf C:\Klassenliste.txt geändert hast):
C:\Users\Slice\Documents\Klassenliste.txt
Das ist nicht sinnvoll, das geht dann nur bei dir...
Mehr dazu findest du hier:
www.delphi-library.d...ewtopic.php?p=499701
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 25.01.09 15:52 
Da er mit statischen Arrays arbeitet, ist es doch egal, ob er leere Einträge speichert. Mich würde eher interessieren, welchen Wert i nach dem Inkrementieren haben soll.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 25.01.09 15:56 
Auch wenn ich es absolut nicht schön finde, das nicht explizit selbst zu machen, aber i wird automatisch mit 0 initialisiert. Das ist bei globalen Variablen immer so.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 25.01.09 16:03 
Aha, und nach dem Speichern? 100, oder nicht?
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 25.01.09 16:39 
kann mir dann wenigstens noch jmd sagen, wie ich die Einträge sortieren kann (nach Alphabet am besten)?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 25.01.09 16:42 
Hier stehen ein paar mögliche Algorithmen beschrieben:
www.delphitutorials....den-vorgestellt.html
Bubblesort wäre sicherlich der am einfachsten zu verstehende.
de.wikipedia.org/wiki/Bubblesort
www.stefan-baur.de/cs.algo.bubblesort.html