求助:自定义不规则表格(300分,不够再加)(300分)

  • 主题发起人 主题发起人 月明风轻
  • 开始时间 开始时间

月明风轻

Unregistered / Unconfirmed
GUEST, unregistred user!
现在正在做一个电影院,需要排座位,要求点击座位进行售票。
也就是能接受鼠标事件。

问如果生成这些座位?有几个区,每个区都有几百个座位,
我试了StringGrid,但是生成的是规则的座位如
OOOOOOOO
OOOOOOOO
00000000
我想生成类似的不规则座位:
00 00
0000 0000
0000000 00000000
00000 0000
0000000 00000000
该使用什么控件或还是要自己去开发?
如果自己开发,用什么做基类?
 
自己用图划吧 要不用控件了
 
最弱的做法:TSCROLLBOX中用TSHAPE,支持鼠标事件
 
To Goddy:
用图画的画对鼠标消息的控制好像很麻烦呢?

To wk_knife:
如果要一次选取多个位置的话好像不好操作?
 
我用了TMS PACK的TADVStringGrid也不行哦`~
要是TADOStringGrid可以自定义形状就好了`~
 
仔细想想“选取”在计算机是怎么实现的,不就是遍历所有的座位,然后取出在选取框中的。

就我说的简单办法——不是最好的办法

你可以用算法在TSCROLLBOX生成TSHAPE的排列,然后处理TSCROLLBOX的鼠标消息,以得到选取框,在得到选取框后,遍历所有的TSHAPE,然后得到在选取框范围里的,不就是选中多个

如果选取是不连续的,只要继承一下TSHAPE,给它的状态标记,比方可以是:待售,预定,卖出,然后对TSHAPE的鼠标消息处理,设置TSHAPE的状态,做一个容器(数组、列表)放置这选中的TSHAPE就可以了么!
 
To wk_knife:
谢谢你的回答,这种方法是不是很耗资源呀?
不知道有没有更好一点办法?事实上在TADVStringGrid我就是自己写的取多个位置。
好像TShape不能接受单击事件?
 
我已经说过了,这不是个好办法
Goddy的办法是正解,但你觉得麻烦,所以.......
单击事件是鼠标按下和鼠标放开两个消息合起来哦。当然中间鼠标不要移动喽
 
用paintbox或者shape画好了。
 
To wk_knife:
如果用GODDY的方法的话是不是要去判断鼠标的位置然后去改变位置也就是一个小矩形框的颜色了?那如果要将这些位置信息保存到数据库中不是很麻烦了?
 
To duhai_lee:
用paintbox怎么操作?位置也是用图片吗?
我想不通用图片的话到时保存位置信息的话是不是不好保存了?
 
不会吧,没有更好的办法吗?
 
明天结贴
 
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:Double 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;
 
用stringgrid也能很好的解决
00 00
0000 0000
0000000 00000000
00000 0000
0000000 00000000
有座位的格子用颜色标识,没座位的格子用白色标识,而且不响应鼠标动作.
 
已用TAdvStringGrid.
不存在的座位则置黑色`~
存在的置白色。建立数据库表对应位置信息。
 
后退
顶部