TPascal Daten - Verschiebung im Record

Hallo, wer kann helfen, da noch Anfänger.
Wie kann ich in TP7 Daten in einem Array im Record von Dat[x-2] nach Dat[x-3], von Dat[x-1] -> Dat[x-2] und Dat[x] -> Dat[x-1] verschieben ??.
D. h. Datei lesen, Daten schieben und speichern. Auf Dat[x] werden dann neue Werte eingetragen. Aber schon dabei geht der Rest wieder verloren.

with rec_A do begin
Dat[x] := zahl_1;

end
write(File,rec_A);

Ist bestimmt einfach, aber ich komme nicht drauf.
Danke Wolfgang

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