Delphi-Quellcode:
//Auf das Bild schreiben
procedure TForm1.BT_WriteClick(Sender: TObject);
var i,z,x,y: integer;
begin
SetLength(Bitmap2, Length(Bitmap2) + 1); // hier muss es Length heißen!
Bitmap2[High(Bitmap2)] := TPicture.Create;
Bitmap2[High(Bitmap2)].Bitmap.Assign(Image1.Picture);
inc(Bitmap2X);
...
...
end;
An dieser Stelle hängst du zwar das neue Bild an das Ende des Arrays dran, aber wer sagt dir denn, daß Bitmap2X auch wirklich am Ende des Arrays steht?
Für eine saubere Undo/Redo-Implementierung brauchst du zwei Stacks: einen für die Undo- und einen für die Redo-Operation.
Ich habe da mal vor ein paar Jahren etwas geschrieben, das du ja mal als Anregung anschauen kannst:
UndoManager