Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Image (Canvas) Rückgängig Funktion (https://www.delphipraxis.net/159237-image-canvas-rueckgaengig-funktion.html)

Dunkelbunt27 20. Mär 2011 19:03

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)

Bummi 20. Mär 2011 19:39

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...

Dunkelbunt27 20. Mär 2011 19:49

AW: Image (Canvas) Rückgängig Funktion
 
Zitat:

100 Schritten zu Schritt 98 zurückkehren will, leerst Du Dein Grundarray und spielst die Aufzeichnungen bis Schritt 98 wieder ein
Interessant, jetzt versteh ich erst richtig wie diese Idee anzuwenden ist!
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

Dunkelbunt27 22. Mär 2011 17:18

AW: Image (Canvas) Rückgängig Funktion
 
Hallo nochmal,

ich bin noch etwas unsicher und frage lieber nochmal nach. Entschuldigt die dumme Frage.
Zitat:

leerst Du Dein Grundarray und spielst die Aufzeichnungen bis Schritt 98 wieder ein
Mein Array kann ich doch indem ich den Ausgangszustand herstelle, nicht?
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:
var Chronozaehler : integer = 0;
Bei jeder Veränderung:
Delphi-Quellcode:
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;
Auf Druck der Undo-Taste:
Delphi-Quellcode:
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;
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:
aus Hallo[] wird _Hall[]. ([] = Cursor)
Beim zweiten mal ist es dann so wie es soll.
Aus _Hall[] wird _Hal[] ...


FG Dunkelbunt

Bummi 23. Mär 2011 22:38

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:
for i := 0 to AnzahlZeilen do
    for n := 0 to AnzahlSpalten do
        buchstabe[i,n]....
bei z.B. 5 Zeilen greift Du zu von 0..5 also auf 6 Elemente.

Ich habe einen kleinen Anhang erstellt, mit Ersatzweise einem Stringgrid und String statt Zeichen. Das Prinzip bleibt ähnlich.

Dunkelbunt27 24. Mär 2011 17:25

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 19:59 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz