1、设计一个类,假设是TSite
TSiteState=(ssNotSold,ssPreconcert,ssSold);
TSite=class
public
property Top:integer read .......//可以是只读属性,位置由行列(几排几号)决定
property Left:integer read ........
procedure GetBoundsRect:TRect;//得到大小,我想座位的大小相对是固定的,所以就不
//用设计长宽了。用于鼠标判断
published
property
property SiteState:TSiteState read ........//票本身的状态
property Selected:Boolean read ..........//是否被选中
property price
ouble read ...........//价格
...........................//等等
end;
2、一个容器类,或者说是文档类
TSiteCollection=class
pravite
ViewList:TList;//视图列表,包括绘制视图(含或不含打印),数据库视图,可以认为
//是数据的表达方式——画出来的,或者用数据库表示的
Sites:TList;//所有的座位
public
procedure UpdateAllView;//数据发生变化时通知所有视图,包括屏幕和数据库
{
for i:=0 to pred(ViewList.Count) do
TWiew(ViewList
).update;
}
procedure AddView(AView:TView);//增加一种视图
{ ViewList.Add( Aview );
view.Doc:=self;
}
procedure ModifyView;//数据变化时,通知关联的视图变化
{
...... // 改变数据代码
UpdateAllView; // 通知所有的视图进行更新;
}
procedure CreateSites;//座位的生成规则
published
property Site[Row,Col]:TSite read GetSite write SetSite;//根据几排几号得到座位
property RowMax:Integer
property ColMax:integer
end;
3、视图图:从这里派生屏幕视图类,数据库视图类
TView =class 这个类实现了基本的视图接口
private:
doc:TSiteCollection;
public:
property Doc:TSiteCollection read FDoc write SetDoc;
procedure Modify;virtual;abstract;
procedure Update;virtual;abstract;
end;
4、屏幕视图类
TDrawView=class
private
FControl:TWinControl;//或者是TCUSTOMCONTROL;
FControlCanvas:TControlCanvas;
protected
procedure WndPro;//如果需要滚动窗口,电影院太大时,可以从这里得到和处理窗口的
//滚动条消息。
public
procedure Modify;override;
{
//本身的变化,如鼠标选中后,票的的状态变化了,需要修改显示状态
Doc.Modify;//其他文档视图同步变化
}
procedure Update;override;
{
FControl.Invalidate;//重绘屏幕
}
function
published
property Control:TWinControl read FControl write SetControl;//绘制用的窗口
{procedure SetControl(Value:TWinControl);
begin
if not assigned(Value) then Exit;
if Value=FControl then Exit;
FControlCanvas=TControlCanvas.Create;
FControlCanvas.Control:=FControl;
FControl.OnMouseDown:=MouseDown;
............
FControl.OnPaint:=Paint;
end;
}
procedure MouseDown //直接定义成事件需要的过程类型,赋给窗口的事件
{
case
ASite:=SiteUnderMouse;
ASite.Select
case
RectSelected;
..........//在DELPHIBOX上找个简单的矢量图源码看看
}
procedure MouseMove
procedure MouseUp
procedure Paint;//绘制
procedure ScrollBarScrolled;//处理滚动条消息
procedure OtherMessage;//其他需要处理的事件
end;
5、数据库视图类 //可以是一个数据库窗体,也可以只是一个不可视的数据库
TDataSetView=class
private
FDataSet:TDataSet;//数据库
public
public
procedure Modify;override;
{
//直接修改了数据库
Doc.Modify;//其他文档视图同步变化
}
procedure Update;override;
{
FDataSet.UpdateRecord;
}
end;