Autor Beitrag
z1dirk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mi 27.08.03 18:44 
Das ist meine procedure, doch die funktioniert nicht richtig.
Mein Ziel ist es die Ordnung der Sortierung in einer index datei zu speichern und nicht gleich in der daten.dat. Dies soll das program etwas beschleunigen(meint mein lehrer).
Wenn ich das program starte werden mir zu wenig datensätze angezeigt und wenn ich vorher schon eine andere ausgabe benutzt habe, erscheinen manche Datensätze doppelt und die sortierung stimmt nicht.

Neue procedure und darunter ist die alte, die funktioniert.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type
  Tindexreg = record
           nr:integer;
           end;
  Tartikel = record
           alter:string[35];
           name:string[35];
           genre:string[35];
           Ersch:string[35];
           reg:string[35];
           dar:string[35];
           FSK:string[35];
           wer:string[35];
           wann:string[35];
           end;


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:
procedure Tform1.sortierenreg;
var datei: file of Tartikel;
    index: file of Tindexreg;
    indexreg1,indexreg2,indexreg:Tindexreg;
    artikel2,artikel1,artikel:tartikel;
    pos,pos1,n,durchl,erg:integer;
begin
     //Verbindung zu indexreg.dat und daten.dat (öffnen dieser)
     assignfile(datei,'daten.dat');
     reset (datei);
     assignfile(index,'indexreg.dat');
     //Überprüfung für indexreg.dat und öffnen
     if not fileexists('indexreg.dat') then
     rewrite (index) else reset(index);
     pos1:=filesize(datei)-1;
     //Vergleich von index(Datei) und datei(Datei) Größe um sicherzugehen, dass die index datei auf die datei anwendbar ist.
     if filesize(index)=filesize(datei)then
     begin
     //lesen der index Nummer und anwenden auf artikel, die veränderte Reinfolge die in der indexreg.dat steht wird auf artikel angewandt.
     for n:=1 to pos1 do begin
     read(index,indexreg);
     seek(datei,indexreg.nr);
     read(datei,artikel);
     //Ausgabe in stringgrid der sortierten reinfolge.
      with stringgrid1 do  begin
       Cells[0,n] := IntToStr(filepos(datei));
       Cells[1,n] := artikel.name;
       Cells[2,n] := artikel.ersch;
       Cells[3,n] := artikel.genre;
       Cells[4,n] := artikel.reg;
       Cells[5,n] := artikel.dar;
       Cells[6,n] := artikel.FSK;
       Cells[7,n] := artikel.wer;
       Cells[8,n] := artikel.wann;
       Cells[9,n] := artikel.alter;
      end;end;
     end else begin
     //Vergleich der Regisseur namen
     pos:= filesize(datei)-2;
     durchl:=4*filesize(datei);
     repeat
           for n:=0 to pos do begin
                // jeder indexreg wird die stelle des datensatzes zugewiesen der Verglichen wird.
                seek(datei,n);
                read(datei,artikel1);
                indexreg1.nr:=filepos(datei);
                seek(datei,n+1);
                read(datei,artikel2);
                indexreg2.nr:=filepos(datei);
                erg:=AnsiCompareStr(artikel1.reg,artikel2.reg);
                //Die veränderte Reinfolge wird in der Index.dat gespeichert.
                if erg < 0 then
                   begin
                        seek(index,n);
                        write(index,indexreg1);
                        seek(index,n+1);
                        write(index,indexreg2);
                   end;
                 if erg  >= 0 then
                   begin
                        seek(index,n);
                        write(index,indexreg2);
                        seek(index,n+1);
                        write(index,indexreg1);
                   end;
           end;
           Dec(durchl);
     until durchl=0;
     //lesen der index Nummer und anwenden auf artikel, die veränderte Reinfolge die in der indexreg.dat steht wird auf artikel angewandt.
     for n:=1 to pos1 do begin
     read(index,indexreg);
     seek(datei,indexreg.nr);
     read(datei,artikel);
     //Ausgabe in stringgrid der sortierten reinfolge.
      with stringgrid1 do  begin
       Cells[0,n] := IntToStr(filepos(datei));
       Cells[1,n] := artikel.name;
       Cells[2,n] := artikel.ersch;
       Cells[3,n] := artikel.genre;
       Cells[4,n] := artikel.reg;
       Cells[5,n] := artikel.dar;
       Cells[6,n] := artikel.FSK;
       Cells[7,n] := artikel.wer;
       Cells[8,n] := artikel.wann;
       Cells[9,n] := artikel.alter;
      end; end;
     end;
     //schließen und speichern
     closefile(datei);
     closefile(index);
end;


Dies ist die ursprungsprocedure die perfekt alles sortiert, ohne Fehler.
Doch sie speichert halt direkt in die daten.dat.

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:
procedure Tform1.sortierenname;
var datei: file of Tartikel;
    artikel2,artikel1:tartikel;
    pos,n,durchl,erg:integer;
begin
     assignfile(datei,'daten.dat');
     reset (datei);
     pos:= filesize(datei)-2;
     durchl:=4*filesize(datei);
     repeat
           for n:=0 to pos do begin
                seek(datei,n);
                read(datei,artikel1);
                seek(datei,n+1);
                read(datei,artikel2);
                erg:=AnsiCompareStr(artikel1.name,artikel2.name);
                if erg < 0 then
                   begin
                        seek(datei,n);
                        write(datei,artikel1);
                        seek(datei,n+1);
                        write(datei,artikel2);
                   end;
                 if erg  >= 0 then
                   begin
                        seek(datei,n);
                        write(datei,artikel2);
                        seek(datei,n+1);
                        write(datei,artikel1);
                   end;
           end;
           Dec(durchl);
     until durchl=0;
     closefile(datei);
end;


Vieleicht findet ihr was oder gibt mir einen Tip.

Gruß Dirk!