![]() |
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:
- Inhalt des Bitmaps auf das Canvas kopieren um den letzten Zustand wiederherzustellen
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;
Delphi-Quellcode:
Noch funktioniert aber gar nichts...
procedure ZustandLaden(Image: TImage; bmp: TBitmap);
begin BitBlt(Image.Canvas.Handle,0,0,Image.Width,Image.Height,bmp.Canvas.Handle,0,0,SRCCOPY); end; 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 |
AW: Image (Canvas) Rückgängig Funktion
geht schon, wenn die Bitmapgröße passt und Du nach dem wiederherstellen Invalidate aufrufst...
Delphi-Quellcode:
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...
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; |
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 |
AW: Image (Canvas) Rückgängig Funktion
Sorry, ich habe nicht verstanden was Du meinst...
|
AW: Image (Canvas) Rückgängig Funktion
Okay,
zum Array-Rückgängigmachen probiere ich ersteinmal selber bis ich eine konkrete Frage habe. Zitat:
Zitat:
Delphi-Quellcode:
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.
procedure ZustandSpeichern(var DestArray: [B]array of array of TBeispielarray[/B]; SrcArray: array of array of TBeispielarray);
begin DestArray := SrcArray; end; FG Dunkelbunt EDIT: Ich möchte den Inhalt meines (dynamischen) Arrays zwischenspeichern. Wäre DestArray := SrcArray; überhaupt möglich? Delphi zeigt inkompatible Typen an. |
AW: Image (Canvas) Rückgängig Funktion
Zitat:
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:
etc...
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 Ob das für Deine Zwecke brauchbar ist kann ich nicht beurteilen, da ich nicht weiß was Du machst... |
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:
am Besten auf ein Speicherarray kopiere.
type
TBeispiel = record Zeichen : char; attribut : byte; end; var buchstabe : array of array of TBeispiel; |
AW: Image (Canvas) Rückgängig Funktion
Was meinst du mit Speicherarray?
|
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. |
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 18:39 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