Delphi-PRAXiS
Seite 1 von 3  1 23      

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 19. Mär 2011 11:07

Image (Canvas) Rückgängig Funktion
 
Hallo Delphi-PRAXIS,

ich möchte eine Rückgängig und Wiederholen Funktion für mein Image programmieren. Ich habe mir das so gedacht:
- Inhalt des Canvas auf einem Bitmap vor jeder Änderung(zeichnen) speichern, sodass es immer eine Kopie vom letzten Schritt gibt
Delphi-Quellcode:
procedure ZustandSpeichern(Image: TImage; var bmp: TBitmap);
begin
  BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,Image.Canvas.Handle,0,0,SRCCOPY);
end;
- Inhalt des Bitmaps auf das Canvas kopieren um den letzten Zustand wiederherzustellen
Delphi-Quellcode:
procedure ZustandLaden(Image: TImage; bmp: TBitmap);
begin
  BitBlt(Image.Canvas.Handle,0,0,Image.Width,Image.Height,bmp.Canvas.Handle,0,0,SRCCOPY);
end;
Noch funktioniert aber gar nichts...
Was mache ich falsch?
Letztendlich wird dann eh nur 1 Schritt zurück funktionieren, das ist schade. Hat jemand vielleicht eine bessere Idee?

FG Dunkelbunt

Bummi 19. Mär 2011 12:36

AW: Image (Canvas) Rückgängig Funktion
 
geht schon, wenn die Bitmapgröße passt und Du nach dem wiederherstellen Invalidate aufrufst...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
   if not Assigned(Fbmp) then Fbmp := TBitmap.create;
   FBMP.Width := Image.Width;
   Fbmp.Height := Image.Height;
   ZustandSpeichern(Image,FBMP);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   ZustandLaden(Image,FBMP);
   Image.Invalidate;
end;
je nachdem was auf Deinem Bitmap gemalt wird könntest Du die Arbeitschritte auch in einer Liste speichern und gegf. alle Schritte auf einem leeren Image bis zu gewünschten Zustand wiederholen...

Dunkelbunt27 19. Mär 2011 12:52

AW: Image (Canvas) Rückgängig Funktion
 
Okay, danke, das funktioniert schonmal.
Jetzt habe ich nurnoch das Problem, dass ich den Zustand meines Arrays speichern muss, da jedem Punkt ein Zeichen zugewiesen ist und bei jedem neuzeichnen das rückgängig gemachte Zeichen wieder erscheint.

... Im Prinzip ist es sogar unsinnig das Canvas rückgängig zu machen... wenn ich einfach das Array einen Schritt zurücksetze und dann neuzeichne kommt es aufs selbe....

Edit: Wie würde es denn mit der Liste funktionieren?
Warum genau muss Invalidate benutzt werden?


FG Dunkelbunt

Bummi 19. Mär 2011 12:57

AW: Image (Canvas) Rückgängig Funktion
 
Sorry, ich habe nicht verstanden was Du meinst...

Dunkelbunt27 19. Mär 2011 13:07

AW: Image (Canvas) Rückgängig Funktion
 
Okay,
zum Array-Rückgängigmachen probiere ich ersteinmal selber bis ich eine konkrete Frage habe.

Zitat:

Arbeitschritte auch in einer Liste speichern
Wie funktioniert das?
Zitat:

Image.Invalidate;
Warum ist das unbedingt nötig?

Delphi-Quellcode:
procedure ZustandSpeichern(var DestArray: [B]array of array of TBeispielarray[/B]; SrcArray: array of array of TBeispielarray);
begin
  DestArray := SrcArray;
end;
Wie löst man das von der Schreibung her, wenn es ein mehrdimensionales Array ist? Delphi möchte nur ein eindimensionales Array in meinem Prozedurkopf sehen, also z.B. FestArray: array of TBeipsielarray.

FG Dunkelbunt

EDIT: Ich möchte den Inhalt meines (dynamischen) Arrays zwischenspeichern.
Wäre DestArray := SrcArray; überhaupt möglich? Delphi zeigt inkompatible Typen an.

Bummi 19. Mär 2011 13:21

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

Warum ist das unbedingt nötig?
weil Du an der VCL vorbei auf das Canvas zugreifst.

Mit dem Zustandsarray haben wir uns missverstanden.
Wenn Du alle Zwischenstände als Bitmaps speichern möchtest nimm ein Objektliste mit Bitmaps.
Meine Idee war eher die Arbeitsschritte wie auch immer Codiert in eine Liste speichern, quasi ein Macrorecorder.

Delphi-Quellcode:
image.canvas.Pixels[10,10]:= clred; //>> P,10,10,$ff
image.canvas.MoveTo(30,30);//>>M,30,30
image1.canvas.Ellipse(10,10,100,100);// E,10,10,100,100
etc...
Ob das für Deine Zwecke brauchbar ist kann ich nicht beurteilen, da ich nicht weiß was Du machst...

Dunkelbunt27 19. Mär 2011 14:48

AW: Image (Canvas) Rückgängig Funktion
 
Danke,
mein Fehler, ich war am Anfang auf dem falschen Weg.
Für meine Zwecke ist es denke ich sinnvoller den Inhalt meines Arrays zu speichern.
Meine Frage ist jetzt wie ich das Array:
Delphi-Quellcode:
type
TBeispiel = record
               Zeichen : char;
               attribut : byte;
             end;

var
buchstabe      : array of array of TBeispiel;
am Besten auf ein Speicherarray kopiere.

mkinzler 19. Mär 2011 14:52

AW: Image (Canvas) Rückgängig Funktion
 
Was meinst du mit Speicherarray?

Dunkelbunt27 19. Mär 2011 14:55

AW: Image (Canvas) Rückgängig Funktion
 
Ich hab mir gedacht einfach ein gleichgroßes Array zu benutzen, etwa so:
Speicherarray : array of array of TBeispiel;
Wenn das funktionieren sollte.

mkinzler 19. Mär 2011 14:58

AW: Image (Canvas) Rückgängig Funktion
 
Merk dir doch einfach den höchsten Index, dann ist eine Kopie überflüssig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.
Seite 1 von 3  1 23      

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