Array imemr um 1000 statt 1 erhöhen reicht schon.
Aber die TList ist noch besser.
Hat aber eher den Grund das ich damit die Daten dann auch sortieren kann. Die Geschiwindigkeit ist nun angemessen.
Über das Soriteren (wovon ich noch keine Ahnung hab) recherchier ich erstmal im foum. Muss hier ja nicht auch noch breit getreten werden^^
Edit:
Und danke an alle die Geholfen haben.
Hier der Code, vll hilft es ja nochmal:
Delphi-Quellcode:
type
TDatensatz = record
ID: integer;
Text: AnsiString;
end;
TDatenPointer = ^TDatensatz;
procedure TForm1.btnReadClick(Sender: TObject);
var
daten1, daten2 : TList;
i : Integer;
p : TDatenPointer;
begin
daten1 := Tlist.create;
daten2 := Tlist.create;
Label1.Caption := 'Lese Datei: '+PathFrom.Text;
Label1.Update;
ReadData(PathFrom.Text, daten1);
Label1.Caption := 'Lese Datei: '+PathTo.Text;
Label1.Update;
ReadData(PathTo.Text, daten2);
//Merge - Muss nurnoch sortiert werden
Label1.Caption := 'Merge...';
Label1.Update;
MergeData( daten1, daten2 );
//Save - Fehlt noch
for i := 0 to daten1.count-1 do
begin
p := TDatenPointer( daten1.items[ i ] );
dispose( p );
end;
for i := 0 to daten2.count-1 do
begin
p := TDatenPointer( daten2.items[ i ] );
dispose( p );
end;
Daten1.Free;
Daten2.Free;
end;
procedure TForm1.ReadData(datei : string; var daten : TList );
var
fs : TStream;
p : TDatenPointer;
i,j, id, check : Integer;
Len : Short;
text : string;
begin
fs := TFileStream.Create(datei, fmOpenReadWrite);
ProgressBar.Max := fs.Size;
ProgressBar.Position := 0;
fs.Seek(6,soFromBeginning);
i := 0;
j := 1000;
repeat
inc(i);
//Array verlängern
//if Length( daten ) <= i then
//SetLength( daten, Length( daten )+3000);
check := fs.Read(id, SizeOf(id)); //Id auslesen
if check < SizeOf(id) then //Wenn keinem ehr gab abbrechen
break;
fs.Seek(1, soFromCurrent); //1 byte überspringen
fs.Read(Len, SizeOf(Len)); //Lenge des Strings
SetLength(text, Len); //Stringlänge setzten
fs.Read(PChar(text)^, Len); //String auslesen
//daten[i-1].id := id;
//daten[i-1].text := text;
new( p );
p.ID := id;
p.Text:= text;
daten.add( p );
//Label1.Caption := IntToStr(i);
//Label1.Update;
ProgressBar.StepBy(7+Len);
until check < SizeOf(id);
fs.Free;
end;
//Veorläufige Verison, kann sicher noch stark optimiert werden:
procedure TForm1.MergeData( Daten1: TList; Daten2: TList);
var
IDsToAdd : array of integer;
i,j:integer;
found : Boolean;
p, p1, p2 : TDatenPointer;
begin
ProgressBar.Position := 0;
ProgressBar.Max := Daten2.Count;
ListBox.Items.Add('Vor Merge Data1.Count: '+ inttostr(daten1.count));
ListBox.Items.Add('Vor Merge Data2.Count: '+ inttostr(daten2.count));
for i := 0 to Daten2.Count-1 do
begin //Data 2 durchgehen
p2 := TDatenPointer( daten2.items[ i ] );
ProgressBar.StepBy(1);
//Suchen ob data2 in data1 vorhanden ist
found := false;
for j:=0 to Daten1.Count-1 do
begin
p1 := TDatenPointer( daten1.items[ j ] );
if p1.ID = p2.ID then
begin
found := true;
break;
end;
end;
if found <> true then //Die ID ist in Data1 NICHT vorhanden
begin
//Dann muss sie in Data 1 eingefügt werden...
new( p );
p.ID := p2.ID;
p.Text:= p2.Text;
daten1.add( p );
end;
end;
ListBox.Items.Add('Nach Merge Data1.Count: '+ inttostr(daten1.count));
ListBox.Items.Add('Nach Merge Data2.Count: '+ inttostr(daten2.count));
Label1.Caption := 'Merge...Done ... Sort';
Daten1.Sort(??????????????)
end;
Wem hilft ist gut, wem nicht auch gut und die Sikusion endet dann erstmal hier