Danke Wolfgang
In einem ARRAY sind die Daten linear angeordnet. Wenn die Daten nur Verschoben werden sollen, braucht man nicht jedes Element zu verschieben, sonden man kann mit MOVEMEMORY einen Speicherbereich „am Stück“ verschieben. Was man braucht, sind Start- und Ziel-ADRESSEN und die Größe des Blockes in Byte.
Die Startadresse wäre die Adresse des 2. Elements von Dat (wenn dein ARRAY beim Index 0 anfängt, wäre das z.B. Dat[1]), das ist @Dat[1], und die Zieladresse wäre entsprechend die des ersten Elements: @Dat[0]. Die Größe des zu verschiebenden Blockes erhälst du durch SIZEOF(TDat) (also vom TYPE dessen, was du im ARRAY hast, z.B. Integer) mal die Anzahl der zu verschiebenden Elemente, also x. Das macht zusammen:
Var Von,Nach: Pointer; Bytes:Integer;
Von := @Dat[1];
Nach := @Dat[0];
Bytes := x*SizeOf(TDat);
MoveMemory(Nach,Von,Bytes);
Oder kurz: MoveMemory(@Dat[0],@Dat[1],x*SizeOf(TDat));
Ach ja, das klappt NICHT mit Strings, zumindest nicht mit nullterminierten Strings, da hier nur die Zeiger auf die Strings in einem Array gehalten werden. Mit MoveMemory macht man da nur durcheinander. Da sollte man die Verschiebung einzeln machen:
for i := 0 to x-1 do Dat[i] := Dat[i+1];
Jochen