Edit Undo

Her er jeg litt ute på tynn is, manglende erfaring 🙂 , men jeg sier som så: Jeg kan få til et undo-system ved å lagre hele bitmapen. Det ser ut til å funke.

I «DocPage»-klassen oppretter jeg en undo liste, en standard stack:

// --------------------------------------------------------------------------
//                  class DocPage
// --------------------------------------------------------------------------
class DocPage : public TTabItem
{
private:
....
....

public:
....
....
	// ---------------------------------------------
	// Undo Stack
	TUndoItem  *UndoItem;

	std::stack<TUndoItem *> mystack;

Jeg har foreløpig lagt den under «public» deklarasjonene for lettere å kunne teste den.

OK, så trenger jeg en klasse «UndoItem». Den lagde jeg såher (den ligger først i samme kildefilen som klassen «DocPage»), vi gjør det så enkelt som mulig for testkjøringens skyld:

class TUndoItem : public TObject
{
public:
	TBitmap * UndoBitmap;
	String  * UndoName;

	TUndoItem() : TObject()
	{
		UndoBitmap = 0;
		UndoName = 0;
	}

	~TUndoItem()
	{
		if( UndoBitmap != 0) {
			delete UndoBitmap;
			UndoBitmap = 0;
		}
		if (UndoName != 0) {
			delete UndoName;
			UndoName = 0;
		}

    }
};

Når du gjør en endring, f.eks. i monochrome, legger du til:

		dlgMonochrome->ShowModal();
		if( dlgMonochrome -> iretState == 1 ) {

			// Don't forget the undo-stack

			UndoItem = new TUndoItem();
			UndoItem->UndoName = new String("Monochrome");
			UndoItem->UndoBitmap = new TBitmap();

			// Have to use "Assign()" because everything are pointers!!!

			UndoItem->UndoBitmap->Assign(Image1->Bitmap);
			mystack.push(UndoItem);

			Image1->Bitmap->Assign(dlgMonochrome->Image2->Bitmap);
			//Image1->Bitmap->Monochrome = true;

		}

Skal du da gjøre en «Edit->Undo», kan du gjøre:

// --------------------------------------------------------------------------
//  				Edit Undo from parent form
// --------------------------------------------------------------------------
void __fastcall DocPage::UnDo()
{

	if(mystack.empty())
		return;
	try
	{
		// Get top item from stack
		UndoItem = mystack.top();

		Image1->Bitmap->Width = UndoItem->UndoBitmap->Width;
		Image1->Bitmap->Height = UndoItem->UndoBitmap->Height;
		Image1->Width = UndoItem->UndoBitmap->Width;
		Image1->Height = UndoItem->UndoBitmap->Height;

		Layout1->Width = UndoItem->UndoBitmap->Width;
		Layout1->Height = UndoItem->UndoBitmap->Height;

		Image1->Bitmap->Assign(UndoItem->UndoBitmap);

		// Pop Item from stack
		mystack.pop();

	}
	catch(...)
	{
		ShowMessage("Undo did not succeed");
	}

}

Med litt forsiktighet funker dette, men vær obs på at det uten særlige tester 🙂

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Dette nettstedet bruker Akismet for å redusere spam. Lær om hvordan dine kommentar-data prosesseres.