Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 05:19 07.06.24 
Клубове/ Компютри и Интернет / Delphi Всички теми Следваща тема Пълен преглед*
Информация за клуба
Тема State [re: PhantomAS]
Автор PhantomASМодератор (стар ерген®)
Публикувано22.01.03 23:26  



Most programs provide toolbars with different tools. For
example Zoom-Buttons, Paint-Buttons (drawing of circles,
rectangles,.. ). When the Zoom-Button is pressed, the
user can zoom in or out, when the Paint-Button is pressed,
the user can paint s.th : each tool changes the behavior of
the program. You can realize this through different flags :

procedure TForm.FormMouseDown/FormMouseMove/FormMouseUp
begin
..
if fZoomFlag then
begin
...
end else
if fPaintFlag then
begin
...
end;
..
end;

Even if we want to create a simple program like MSPaint,
we will need a lot of flags :
fPenFlag, fDrawRectFlag, fDrawCircleFlag, fEraserFlag,...
This results in 'elephant'-procedures and a general view
becomes difficult.

You can avoid such 'elephant'-procedures through the state
design pattern. Gamma, Helm, Johnson and Vlissides
("Design PATTERNS", Addision-Wesley, 1995) define the
STATE design pattern in this way : it allows an object
to alter its behavior when its internal state changes.
The object will appear to change its class.

In our example, the behavior for each tool is encapsulated
in a different class :


tTool = class
private
fForm : tForm;
public
constructor Create(Form : TForm);
destructor Destroy; override;

procedure SetCursor; virtual;
procedure HandleMouseDown(x,y : integer); virtual;
procedure HandleMouseMove(x,y : integer); virtual;
procedure HandleMouseUp(x,y : integer); virtual;

procedure StopAction; virtual;
end;

tZoomTool = class(tTool)
public
procedure SetCursor; override;
procedure HandleMouseDown(x,y : integer); override;
procedure HandleMouseMove(x,y : integer); override;
procedure HandleMouseUp(x,y : integer); override;
end;

tPaintTool = class(tTool)
public
procedure SetCursor; override;
procedure HandleMouseDown(x,y : integer); override;
procedure HandleMouseMove(x,y : integer); override;
procedure HandleMouseUp(x,y : integer); override;
end;

Now we can replace all the flags by a simple parameter
fTool of class tTool. Instead of setting different flags,
an object of a derived class is created :

procedure TForm.SetZoomModus;
begin
fTool.Destroy;
fTool := tZoomTool.Create(Self);
end;

procedure TForm.SetPaintModus;
begin
fTool.Destroy;
fTool := tPaintTool.Create(Self);
end;


So that in the MouseDown/MouseMove/MouseUp events the
appropriate method is called :

procedure TForm.FormMouseDown(... X, Y: Integer);
begin
fTool.HandleMouseDown(x,y);
end;

procedure TForm.FormMouseMove(... X, Y: Integer);
begin
fTool.HandleMouseMove(x,y);
end;

procedure TForm.FormMouseUp(... X, Y: Integer);
begin
fTool.HandleMouseUp(x,y);
end;

---
Е т'ва е живот!


Цялата тема
ТемаАвторПубликувано
* Design Patterns - продължение... PhantomASМодератор   22.01.03 21:53
. * Singleton PhantomAS   22.01.03 21:57
. * Adapter PhantomAS   22.01.03 23:01
. * Template Method PhantomAS   22.01.03 23:02
. * Builder PhantomAS   22.01.03 23:04
. * Abstract Factory PhantomAS   22.01.03 23:05
. * Factory Method PhantomAS   22.01.03 23:07
. * Iterators PhantomAS   22.01.03 23:13
. * Singleton - пример 2 PhantomAS   22.01.03 23:16
. * Mediator PhantomAS   22.01.03 23:20
. * Observer - Simple Observer PhantomAS   22.01.03 23:21
. * Observer PhantomAS   22.01.03 23:22
. * Memento PhantomAS   22.01.03 23:24
. * State PhantomAS   22.01.03 23:26
. * Choice PhantomAS   22.01.03 23:27
. * Delegate actions and operations PhantomAS   22.01.03 23:29
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.