![]() |
AW: Image (Canvas) Rückgängig Funktion
Das funktioniert in meinem Fall nicht. Es ist jeder Platz belegt. Ich habe praktisch ein Raster, dessen Werte und Eigenschaften der Felder in dem dynamischen, mehrdimensionalen Array gespeichert sind.
Ich hab es jetzt so:
Delphi-Quellcode:
Vor dem Zeichnen bzw verändern von Werten in den Feldern wird ZustandSpeichern ausgeführt.
procedure ZustandSpeichern;
var i,n : integer; begin for i := 1 to MaxZeilen do for n := 1 to MaxSpalten do begin SpeicherArray[i,n].zeichen := buchstabe[i,n].zeichen; SpeicherArray[i,n].attribut := buchstabe[i,n].attribut; end; end; procedure ZustandLaden; var i,n : integer; begin for i := 1 to MaxZeilen do for n := 1 to MaxSpalten do begin buchstabe[i,n].zeichen := SpeicherArray[i,n].zeichen; buchstabe[i,n].attribut := SpeicherArray[i,n].attribut; end; end;
Delphi-Quellcode:
Das sollte funktionieren, tut es aber nicht...
procedure TForm1.UndoClick(Sender: TObject);
begin ZustandLaden; end; |
AW: Image (Canvas) Rückgängig Funktion
Achtung: dynamische Arrays beginnen bei Index 0
|
AW: Image (Canvas) Rückgängig Funktion
Meins nicht =)
Ich habe alles um 1 nach rechts verschoben, damit es später logischer nachzuvollziehen ist. |
AW: Image (Canvas) Rückgängig Funktion
Du belegst vielleicht den 1. Index nichtnicht.
Hast du den Array dann entsprechend größer gemacht? |
AW: Image (Canvas) Rückgängig Funktion
Ja, das mit dem Array ist alles richtig, da bin ich mir sicher.
Delphi-Quellcode:
SetLength(Beispiel,MaxZeilen+1,MaxSpalten+1);
|
AW: Image (Canvas) Rückgängig Funktion
Was macht dein Code bzw. nicht?
|
AW: Image (Canvas) Rückgängig Funktion
Also kurz zur Erklärung:
Ich klicke ein Feld an, tippe einen Buchstaben und der belegt dann den dazugehörigen Platz im Array. Wenn ich dazu noch dem Feld eine Eigenschaft zuweise, dann wird im Array die Eigenschaft vermerkt (Bsp: feld[1,1].zeichen := 'A'; feld[1,1].attribut := clblue; ). Ich möchte bevor auf Tastendruck dem eigentlichen Array "feld" das zeichen zugewiesen wird, das Array erst kopieren in "Speicherarray" und dann erst das "feld" Array beschreiben. Dann möchte ich auf Tastendruck die Werte des "feld" Arrays mit denen des "Speicherarrays" überschreiben um den Zustand vor der letzten Taste herzustellen. Schreiben, Eigenschaften und alles andere funktioniert. Was nicht funktioniert ist die gesuchte Undo-Funktion. EDIT: Mit Copy(Array) kann man ein Array kopieren. Dies geht aber nur mit eindimensionalen Arrays, ich möchte ein zweidimensionales Array kopieren. Kann mir da wer helfen? |
AW: Image (Canvas) Rückgängig Funktion
Delphi-Quellcode:
Bei jeder neue Zuweisung
type
TChronologieElement = record Zeichen : char; attribut : byte; X : Integer; Y : Integer; end; var TChronologieArray : array of TChronologieElement;
Delphi-Quellcode:
damit hast Du alle Informationen um jeden Zeitpunkt wieder herzustellen, bei minimalem Speicheraufwand...
SetLength(TChronologieArray ,High(TChronologieArray ) + 2);
i := High(TChronologieArray); TChronologieArray[i].Zeichen := ... ..etc |
AW: Image (Canvas) Rückgängig Funktion
Hallo Bummi,
danke, das klingt super. Wenn ich immer nur den höchsten Wert kopieren, werden dann immer alle vorherigen Werte mitkopiert? Würde das kopieren dann so aussehen:
Delphi-Quellcode:
Ist das beides denn überhaupt "kompatibel", denn das TChronologieArray ist ja eindimensional.
SetLength(TChronologieArray ,High(TChronologieArray ) + 2);
i := High(TChronologieArray); TChronologieArray[i].Zeichen := Beispiel[i].Zeichen; TChronologieArray[i].attribut := Beispiel[i].attribut; ..etc Zitat:
Zitat:
Funktioniert das auch mit SetLenght nur von ChronologieArray auf BeispielArray? FG Dunkelbunt |
AW: Image (Canvas) Rückgängig Funktion
Irgendwie denken und reden wir aneinander vorbei, ich hatte Dich so verstanden du Du nacheinander Änderungen an "Zellen" vornimmst (Char und Farbe).
Wenn Du jede Änderung mitprotokollierst und Deinen Ausgangszustand kennst kannst Du entweder beim Rückgängig machen vom Ausgangszustand alle Schritte bis zu diesem gewünschten Punkt "abspielen" oder von Hinten jeweils den "Vorgängerzustand" der zurückzunehmenden Zelle suchen und diesen wiederherstellen. Möglicherweise habe ich Dich aber auch ganz falsch verstanden.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz