| Autor |
Beitrag |
Slice
      
Beiträge: 28
|
Verfasst: 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.
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 public end;
var Form1: TForm1; datei: File of Tliste; i: Integer; liste: array [1..100] of Tliste;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); 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); 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); 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); begin Listbox1.Clear; end;
procedure TForm1.Button6Click(Sender: TObject); begin DeleteFile('C:\Klassenliste.txt'); end;
end. |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 24.01.09 20:37
| Zitat: | Delphi-Quelltext 1: 2: 3: 4: 5:
| 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; | |
Wenn ich so etwas versuche, sagt mein Delphi immer, dass es sich bei der Schleifenvariablen um eine einfache lokale Variable handeln muss.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 24.01.09 21:04
DeddyH hat folgendes geschrieben : | | Zitat: | Delphi-Quelltext 1: 2: 3:
| for c:=1 to filesize(datei) do 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... 
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 24.01.09 21:42
Das hab ich doch gemeint *seufz*. Ich muss mich echt schwer ausdrücken.
|
|
Slice 
      
Beiträge: 28
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 (F  , 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.
DeddyH hat folgendes geschrieben : | | Das hab ich doch gemeint *seufz*. |
Jetzt wo du es sagst, stimmt, so kann mans auch verstehen. 
|
|
Slice 
      
Beiträge: 28
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 25.01.09 15:49
Mir aber: Delphi-Quelltext 1: 2: 3: 4: 5:
| for i:=1 to 100 do write(datei,liste[i]);
for c:=1 to filesize(datei) do | 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
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
|
Verfasst: So 25.01.09 16:03
Aha, und nach dem Speichern? 100, oder nicht?
|
|
Slice 
      
Beiträge: 28
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
|
|
|