![]() |
AW: Image (Canvas) Rückgängig Funktion
Also, das mit den Zellen ist richtig, man kann es auch einfach so sehen, die Zellen bilden ein Raster und du schreibst praktisch einen Text, indem in ejde Zelle ein Buchstabe kommt. Mit der Rückgängig funktion wollte ich versuchen, den aktuellen zustand vor jeder Änderung abzuspeichern, bestenfalls so, dass man mehrere Schritte abspeichert.
Da in einem einzigen mehrdimensionalen Array die Daten für alle Zellen gespeichert sind, müsste ich eigentlich nur wissen, wie ich ein Array verdoppeln kann. Die Copy(Array) funktion funktioniert nur bei eindimensionalen Arrays, leider. Ich möchte also einfach ein komplettes Array auf ein anderes Übertragen: Bsp: ArraySpeicher := ArrayA -ArrayA wird verändert - Die Veränderung gefällt nicht => ArrayA := ArraySpeicher nur geht das ja nicht so einfach mit Gleichsetzen. Es geht also nicht nur eine einzige Zelle rückgängig zu machen, da es wie in einem zusammenhängenden Text nichts bringt nur den ertsen Buchstaben rückgängig zu machen, denn dort stand ja vor dem schreiben nichts. (Ich hoffe ich verwirre nicht zu sehr) |
AW: Image (Canvas) Rückgängig Funktion
Du kannst freilich Array's kopieren
Delphi-Quellcode:
// Fixe Array's völlig unproblematisch
procedure TForm1.Button1Click(Sender: TObject); type r=Record c:Char; f:Byte; end; TArr=array[0..9,0..9] of r; var a,b:TArr; i,j:Integer; begin for I := 0 to 9 do for j := 0 to 9 do begin a[i,j].c := Char(Ord('0') + i*10 + j) ; a[i,j].f := i*10 + j; end; b := a; Caption := b[2,2].c +'-'+ IntToStr(b[2,2].f) end; // Asymetrische Array, eben Iterativ procedure TForm1.Button2Click(Sender: TObject); type r=Record c:Char; f:Byte; end; TArr = Array of Array of r; var a,b:TArr; i,j:Integer; Function CopyMyArray(a:TArr):TArr; var x,y:Integer; begin SetLength(Result,High(a) + 1); for x := Low(a) to High(a) do begin SetLength(Result[x],High(a[x])+1); for y := Low(a[x]) to High(a[x]) do Result[x,y] := a[x,y]; end; end; begin SetLength(a,10); for I := Low(a) to High(A) do begin SetLength(a[i],i); for j := Low(a[i]) to High(a[i]) do begin a[i,j].c := Char(Ord('0') + i*10 + j) ; a[i,j].f := i*j; end; end; b := CopyMyArray(a); if (a[4,2].c=b[4,2].c) and (a[4,2].f=b[4,2].f) then Showmessage('Passt scho...') end; Trotzdem bin ich sicher dass Dir meine eigentlich Struktur langt und den Speicherbedarf minimiert. Wenn jedes Zeichen erfasst wird und der Benutzer nach 100 Schritten zu Schritt 98 zurückkehren will, leerst Du Dein Grundarray und spielst die Aufzeichnungen bis Schritt 98 wieder ein ... und so weiter... |
AW: Image (Canvas) Rückgängig Funktion
Zitat:
Wenn man das also z.B: wie in jedem Texteditor (als Beispiel) mit einer Rückgängigtaste auslöst, dann leere ich wie du egsagt hast das Array und spiele die Schritte wieder auf... Das ist wenn man genau drübernachdenkt richtig raffiniert... =D Danke auch für die ArrayKopier funktionen. Ich denke damit komme ich weiter! Vielen Dank nochmal und FG Dunkelbunt |
AW: Image (Canvas) Rückgängig Funktion
Hallo nochmal,
ich bin noch etwas unsicher und frage lieber nochmal nach. Entschuldigt die dumme Frage. Zitat:
Wie spiele ich dann die Schritte 1-98 wieder auf? EDIT: (Ich komme da total durcheinander, weil ich ja X und Y Werte für die Buchstaben habe... aber ich denke Du oder jemand anders kann mir da weiterhelfen =D) Ich hab es so gemacht, doch es ist irgendwo was falsch:
Delphi-Quellcode:
Bei jeder Veränderung:
var Chronozaehler : integer = 0;
Delphi-Quellcode:
Auf Druck der Undo-Taste:
SetLength(TChronologieArray ,High(TChronologieArray )+2); //warum eigentlich +2? Nicht +1?
Chronozaehler := High(TChronologieArray); TChronologieArray[Chronozaehler].attribut := buchstabe[PositionZeile,PositionSpalte].attribut; TChronologieArray[Chronozaehler].X := PositionZeile; TChronologieArray[Chronozaehler].Y := PositionSpalte;
Delphi-Quellcode:
Ich finde es funktioniert auch recht gut, aber unerklärlicherweise rutscht bei ersten Undo einfach alles eine Spalte nach rechts und der letzte Buchstabe verschwindet, also:
if Chronozaehler > 0 then
Chronozaehler := Chronozaehler-1; for i := 0 to AnzahlZeilen do for n := 0 to AnzahlSpalten do begin buchstabe[i,n].Zeichen := ' '; buchstabe[i,n].attribut := 0; end; for i := Low(TChronologieArray) to Chronozaehler do buchstabe[TChronologieArray[i].X,TChronologieArray[i].Y].Zeichen := TChronologieArray[i].Zeichen; PositionZeile := TChronologieArray[Chronozaehler].X; PositionSpalte := TChronologieArray[Chronozaehler].Y; aus Hallo[] wird _Hall[]. ([] = Cursor) Beim zweiten mal ist es dann so wie es soll. Aus _Hall[] wird _Hal[] ... FG Dunkelbunt |
AW: Image (Canvas) Rückgängig Funktion
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, möglicherweise beginnen Deine Indizes bei 1 statt bei 0, der folgende Teil müsste in jedem Fall Ärger machen
Delphi-Quellcode:
bei z.B. 5 Zeilen greift Du zu von 0..5 also auf 6 Elemente.
for i := 0 to AnzahlZeilen do
for n := 0 to AnzahlSpalten do buchstabe[i,n].... Ich habe einen kleinen Anhang erstellt, mit Ersatzweise einem Stringgrid und String statt Zeichen. Das Prinzip bleibt ähnlich. |
AW: Image (Canvas) Rückgängig Funktion
Danke für das Beispiel Bummi.
Ich habe es probiert, doch es gibt ständig Komplikationen. Ich hab noch eine andere Idee für die Rückgängigfunktion und lass diese Idee erstmal auf der Strecke. Trotzdem ist es ziemlich nützlich zu wissen wie man eine solche Anlegen kann unabhängig von der Wirkung die man erreichen will. FG Dunkelbunt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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