AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Image (Canvas) Rückgängig Funktion
Thema durchsuchen
Ansicht
Themen-Optionen

Image (Canvas) Rückgängig Funktion

Ein Thema von Dunkelbunt27 · begonnen am 19. Mär 2011 · letzter Beitrag vom 24. Mär 2011
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#1

Image (Canvas) Rückgängig Funktion

  Alt 19. Mär 2011, 11:07
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
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

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

  Alt 19. Mär 2011, 12:36
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...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#3

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

  Alt 19. Mär 2011, 12:52
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

Geändert von Dunkelbunt27 (19. Mär 2011 um 12:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

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

  Alt 19. Mär 2011, 12:57
Sorry, ich habe nicht verstanden was Du meinst...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#5

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

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

Geändert von Dunkelbunt27 (19. Mär 2011 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

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

  Alt 19. Mär 2011, 13:21
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...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#7

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

  Alt 19. Mär 2011, 14:48
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 19. Mär 2011, 14:52
Was meinst du mit Speicherarray?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#9

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

  Alt 19. Mär 2011, 14:55
Ich hab mir gedacht einfach ein gleichgroßes Array zu benutzen, etwa so:
Speicherarray : array of array of TBeispiel;
Wenn das funktionieren sollte.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 19. Mär 2011, 14:58
Merk dir doch einfach den höchsten Index, dann ist eine Kopie überflüssig.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr.
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