500分解决一个类型定义问题(300分)

  • 主题发起人 主题发起人 cnsandboy
  • 开始时间 开始时间
C

cnsandboy

Unregistered / Unconfirmed
GUEST, unregistred user!
是否可以定义集合类型的一部分数据作为子集定义另一个集合?
例如,我有如下的一个定义:
TMyCalcButtonKind = (cbBack,cbCancel,cbEnter,cbFunc,cbUp,cbPara,cbLeft,cbDown,cbRight,cbSalaryItem,cbSubSalaryItem,cbDatePara,cbGreater,cbLess,cbEqual,cbNotEqual,cbNum0, cbNum1, cbNum2, cbNum3, cbNum4, cbNum5, cbNum6, cbNum7, cbNum8, cbNum9,cbSign, cbDecimal,cbDiv, cbMul, cbSub, cbAdd,cbLeftBracket, cbRightBracket, cbSpace, cbVerify, cbNone,cbHome,cbEnd,cbSlew);
大概是四十多个项
然后我作了一个集合类型:
TMyCalcButtonKinds = Set of TMyCalcButtonKind;
当我在pulished处发布的时候这样写:
property ButtonsEnabled:TMyCalcButtonKinds read GetButtonsEnabled write SetButtonsEnabled;
编译会出错,因为被发布的集合类型只允许4个字节也就是最多32项
那么,是否可以通过编译选项来使被发布的集合类型可以突破4个自己限制呢?如果不能,我是否可以定义TMyCalcButtonKinds 的子集呢?因为如果可以定义TMyCalcButtonKinds 的子集,我就可以把这个属性分成两份,每份保证在32项之内了。
赐教,其他解决办法也可,觉得分不够可以开帖另加,本来想直接给500,但系统不允许……
 
嘿嘿,错了,4个字节是最多16项,抱歉抱歉
 
用数组如何?
 
这个属性的目的是确定那些按钮的状态为可用,用集合发布的目的也是便于控件属性的编辑,还有,在实际使用中我会在属性后面加一个default来定义默认的可用按钮,所以数组恐怕不成;
举例:
const
CalcDefaultEnabledButton =[cbBack,cbCancel,cbEnter,cbFunc,cbUp,cbPara,cbLeft,cbDown,cbRight]
...
property ButtonsEnabled:TMyCalcButtonKinds read GetButtonsEnabled write SetButtonsEnabled default CalcDefaultEnabledButton;
 
用对象如何
TMyCalcButtonKind = class
published
BackButton: boolean;
CancelButton: boolean;
...
end;
 
我还有很多这样的语法:
BtnCaptions : array [cbBack..cbVerify] of String[4] = ...

for i:= cbBack to cbSlew do
...

即使对象可以解决这些代码不是统统要重写?
还有,即使是对象也存在属性发布的问题啊。
 
对象是可以作为Published的,在属性编辑器中也有个+号,直接设置对象属性的。
如TFont
 
这个我知道,呵呵,但改动太大,其实,我完全可以把每一个按钮的可用状态做一个属性,但一个是显示在属性编辑板上太长,另一个也不便于扩充和维护
 
我觉得可以将类型相近的几项拆成几个小类型再分别处理,比如:
TMyCalcButtonKind = ...
TMyCalcButtonKinds1 = cbBack..cbNotEqual;
TMyCalcButtonKinds2 = cbNum0..cbNum9;
TMyCalcButtonKinds3 = cbSign..cbSlew;

另外4个字节是最多应该是32项的
 
对,pihome的方法不错
 
把每一个按钮的可用状态做一个属性,和使用对象封装是不一样的,属性编辑器是按字母排序的,那样设置起来不方便,使用对象封装属性编辑器显示是在一起的。

再给你一个方案,使用数组,然后对此属性做一个属性编辑器,那样不就可以了。
 
你不一定要把这些属性都放在一个集合里面啊,你可以按类型分为多个集合,这些集合也不一定非要放在一个大集合里吧。你说呢?
例如:我看你的属性可分为“方向”、"键值"属性等等,而这些属性我看也没有必要集合在一起啊。
 
pihome的方法我考虑过,但以下的语法:
BtnCaptions : array [cbBack..cbVerify] of String[4] = ...

for i:= ord(cbBack) to ord(cbSlew) do

都要做改动,注意 array [cbBack..cbVerify] ,最后一个是cbVerify不是cbSlew,也就是说即使分了类型也存在循环判断处理问题,自然,是可以解决的,但改动是在太大呵呵,这也是我最早考虑的解决方法,那么,这么没有编译选项或者集合子集的解决办法吗?如果可以定义子集,那发布就不成问题了
最后,具体编译提示的错误是:Size of published set 'ButtonsEnabled'is >4 bytes.
四个字节没错,也就是根据这个提示我怀疑不能超过16/32个项的,可pihome一提醒我发现,4bytes而不是4bit,那么,应该没有16/32的限制啊?4bit 根据 8、4、2、1好像也是16而不是32啊。
 
定义在一个集合中最初考虑的是因为编程的方便性,例如以上举例(循环或定义其他)
 
数组不允许作为属性发布
 
pihome 和 gydldfw 的方法都是可行的,
我想,你应该把集合中的元素分类,做成子界类型,
每个子界类型再定义一个集合类型,
published的属性,每个对应一个集合类型,
集合类型在published后相当于一个整数类型,
集合的每个元素对应到32位的每个位上,所以每个子界类型的元素个数不要超过32个

如果超过了,设计时在属性编辑器,展开此属性,信息太多,
反而不利于编程,进行属性修改

方法就是这样,看不懂的话,再仔细思考一下,
我看分数应当给上面的那两位了

 
先定义一个大的枚举类型,
然后在此枚举类型上定义子界类型
再根据子界类型定义集合类型,
那个大的枚举类型可以用来做循环的
 
BtnCaptions : array [cbBack..cbVerify] of String[4] = ...

for i:= ord(cbBack) to ord(cbSlew) do
这样的语法问题不用我再重复了吧?分开写不错,但这个循环可能也要分开写了。
类似 arry定义本来一个的也要写多个了。

改动量或许你们都清楚,我上面说过,他们的方法没错,如果我重新开发一套控件,我也会采用,但要清楚一点,我现在只是加一个属性,难不成我为了这个属性把控件重写吧?
呵呵
如果既经济又实惠的解决办法,我会给分的,而且一定是500分。
 
子界类型类型如何定义?这就是我需要的,如果你仔细看,第一段问题已经提出了这个解决思路,我猜想可能有,只是不知道语法,说来,分给你。
 
pihome 的方法可以考虑,将这集合中的各项进行分类;
发布两个DesTime Property,一个选择属性类型,一个选择属性值;
 
后退
顶部