Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Neue Daten werden sortiert, geöffnete Datei nicht


absentsilence - Fr 13.02.04 17:05
Titel: Neue Daten werden sortiert, geöffnete Datei nicht
Hallo!
Ich habe folgendes Problem: In meinem Programm, welches CDs verwaltet, kann ich das dynamische Array in der Listbox nach Interpret (alphabetisch) sortieren, wenn ich neue Datensätze eingebe. Aber wenn ich eine Datei öffne, wird diese nicht sortiert, stattdessen kommen nur Nullen. Was mache ich falsch?
Dies ist der entsprechende Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
implementation {$R *.dfm} 

type tCDname=Record 
interpret, album:string[20]; 
end

type tEintrag=Record 
CDname:tCDname; 
genre:string[15]; 
jahr:integer; 
preis:real; 
end

type 
  tAlleCDs = Array of tEintrag; 
var 
  daten:tAlleCDs; 
  i:integer;


Datei öffnen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
{Datenbank öffnen} 
procedure TForm1.Datenbankffnen1Click(Sender: TObject); 
VAR Zeile : string
datei:textfile; 
begin 
cd_listbox.Items.clear; 
if oeffnen_dialog.Execute then 
begin 
AssignFile (Datei,oeffnen_dialog.Filename); 
Reset (Datei); 
while not eof (Datei) do 
begin 
SetLength(daten,Length(daten)+1); 
i:=i+1
Readln (Datei, Zeile); 
cd_listbox.Items.Add (Zeile); 
end
CloseFile(Datei); 
anzahl_edit.text:=IntToSTr(cd_listbox.items.Count); 
end
end;



Und die Sortierroutine + Listbox füllen:

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:
procedure tausche(var l,j: tEintrag); 
var h: tEintrag; 
begin 
h:=l; 
l:=j; 
j:=h; 
end
 


Source: 

procedure TForm1.nachInterpret1Click(Sender: TObject); 
var 
ljahrstr, lmonatstr, ltagstr, lstdstr, lminstr, lsecstr:string
l,j: integer; 
begin 
cd_listbox.items.Clear; 
for l:=0 to high(daten)-1 do 
for j:=l+1 to high(daten) do 
begin 
if daten[j].cdname.interpret < daten[l].cdname.interpret then 
tausche(daten[l],daten[j]); 
end
with cd_listbox do 
begin 
For j:=0 to high(daten) do 
begin 
items.Add(daten[j].CDname.interpret+#9+daten[j].CDname.album+#9
daten[j].genre+#9+inttostr(daten[j].jahr)+#9+floattostrf(daten[j].preis,fffixed,8,2)); 
end 
end;


rokdd - Fr 13.02.04 18:55

hallo,
beim öffnen der datei schreibst du deine "daten" nur in die listbox. beim sortieren nach alphabet löschst du die listbox. beim anschließend sortieren benutz du die daten aus dem array und nciht aus der listbox. beim öffnen der datei solltest du also den array mit den geöffneten datei füllen.
Hoffe dass ich dein programm verstanden habe und geholfen habe!

rokdd


absentsilence - Fr 13.02.04 20:40

Hmm, klingt gut aber wie fülle ich das Array beim Öffnen der Datei? Für ein Stückchen Quellcode wäre ich dankbar. :?: :) :?:


rokdd - Fr 13.02.04 20:47

okay ich habe es also voll geschnallt was du meinst. das gleiche problem wie du hatte ich auch schon einmal(array speichern). du kannst denn array nicht einfach speichern sondern variable für variable, element für element ein und auslesen. ich habe das mittels eines tfilestreans gemacht und ihn auch schon mal hier im DF gepostet. wenn du ihn nicht findest melde dich bitte nochmal!


rokdd


absentsilence - Fr 13.02.04 21:03

puuh,... klingt etwas kompliziert. Wenn du den Code dafür noch hast, poste ihn bitte mal hier, ich find nämlich nichts gutes. Oder wenn du etwas Zeit hast, ICQ#104124934 :)
Danke für deine Hilfe! :)


rokdd - Fr 13.02.04 21:06

ja habe ein bisschen zeit aber ich besitze keine ICQ.

Rokdd

PS:Schau mal nach dem quelltext nach...


absentsilence - Di 17.02.04 14:30

Also ist das Problem, wie man ein dynamisches array speichert - und genau den quelltext hab ich nicht gefunden. Weiß einer, wie das geht...? :?:


rokdd - Di 17.02.04 14:39

ja habe ich schon mal im forum gepostet: Link [http://www.delphi-forum.de/viewtopic.php?t=21526&start=0&postdays=0&postorder=asc&highlight=]

Hoffe das hilft, bei fragen kannst du dich gerne an mich wenden(via PN oder Forum)

Rokdd


absentsilence - Di 17.02.04 16:00

Puh.... also ich glaub ich weiß, wie du es meinst, aber wie baue ich das in einen speichern bzw. öffnen-dialog ein, wo ich den Dateinamen festlege etc.?


rokdd - Di 17.02.04 16:09

also ich erkläre dir mal wie das so ungefähr funzt, aber du kannst mal bei google suchen.

der array wird beim öffnen auf die richtige länge gesetzt. diese variable wird aus der datei ausgelesen.
dann kommt ide schleife die die einzelen elemente mit den daten füttert(hast du auch ein recordtyp???).
wichtig ist hier die strings müssen pchar gelesen werden. dazu musst du die länge wissen. die hast du vor dem elmenent rausgelesen:

Quelltext
1:
2:
4
XXXX

Die 4 gibt also die länge an, und die nächste zeile ist dann der string selber. ansosnten musst beim lesen und schreiben mit der datei immer noch den buffer mit angeben. ansonsten ist wichtig dass alles in genau der gleichen reihenfolge gelesen und geschreiben wird.

Rokdd[/code]