@TheAn00bis:
Da ein dynamisches Array immer bei null beginnt, kannst du das
Low(...) auch durch
0 ersetzen, oder halt weglassen.
Warum das Array doppel kopieren?
es reicht doch, wenn die Daten nach dem zu entfernenden Eintrag um eine Position vorrücken ... also statt immer 200%-1 zu kopieren wird so durchschnittlich nur 50%-1 kopiert/verschoben ... und schneller geht es, wenn man alle nötigen Einträge auf einmal verschiebt (siehe Move)
Delphi-Quellcode:
procedure DeleteEntry(var pArray: Array of String; pPos: integer);
var i: integer;
begin
for i := pPos to High(pArray) do
pArray[i] := pArray[i + 1];
SetLength(pArray, High(pArray));
end;
function ChoseRandomString: String;
var i:integer;
begin
i := Random(Length(StringArray));
Result := StringArray[i];
DeleteEntry(StringArray, i);
end;
Hie mal die Variante mit
Move.
Bei deiner For-Variante werdne ja im Grunde alle String 2-mal Kopiert (na ja, bei AnsiStrings werden nur die Refferenzzähler erhöht/verringert, aber bei anderen Stukturen, ohne Refferenzzählung, werden die Inhalte 2mal kopiert).
Delphi-Quellcode:
procedure DeleteEntry(var pArray: Array of String; pPos: integer);
begin
// String löschen
pArray[i] := '';
// die zu nötigen StringPointer vorkopieren
Move(@pArray[pPos + 1], @pArray[pPos], (High(pArray) - pPos) * SizeOf(Pointer));
// letzen Pointer löschen ... dieser wurde ja eine Stelle vorkopiert
Pointer(pArray[High(pArray)]) = nil; SetLength(pArray, High(pArray));
end;
// ich hove bei Move war es Source-Dest-Length und nicht Dest-Source-Length ._.