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

  • 主题发起人 主题发起人 cnsandboy
  • 开始时间 开始时间
uses TypInfo;

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);

//按钮标题
BtnCaptions : array [cbBack..cbVerify] of String[4] = ...

//每个类型按钮对应的属性名称
BtnPropertyName: array [cbBack..cbVerify] of String[255] = ('BackButton', 'CancelButton',...)

//定义按钮集合类
TMyCalcButtonKindSet = class
BackButton: boolean;
CancelButton: boolean;
EnterButton: boolean;
...
end;

//你要写的控件
TMyComponent = class(TComponent)
private
FMyCalcButtonKindSet: TMyCalcButtonKindSet;
public
//取按钮设置情况,以前你的代码可能是 if cbBack in xxxx then 要改成使用此函数判断,这样你可以对象的属性也可以用循环了
function GetButtonEnabled(AButtonKind: TMyCalcButtonKind): boolean;
published
property MyCalcButtonKindSet: TMyCalcButtonKindSet read FMyCalcButtonKindSet write FMyCalcButtonKindSet;
end;


//取控件按钮设置情况
function TMyComponent.GetButtonEnabled(AButtonKind: TMyCalcButtonKind): boolean;
begin
Result := GetOrdProp(FMyCalcButtonKindSet, BtnPropertyName[AButtonKind]) = 1;
end;
 
TNumberButton = cbNum0..cbNum9;

TNumberButtonKinds = set of TNumberButton;
嘿嘿,要的就是子界类型四个字,一字千金啊,一查就查到,搞定。给分
 
“我是否可以定义TMyCalcButtonKinds 的子集呢?因为如果可以定义TMyCalcButtonKinds 的子集,我就可以把这个属性分成两份,每份保证在32项之内了”
这是我问题上提到的一句,可惜啊,所有人都每注意到,或者描述不准确,即使lich提出了“子界类型”四个字也不是因为我上面的一句话,或者,我们都太浮躁了,这样简单的语法我不懂,是我浮躁,而不仔细看题目就急于回答问题,却是一些人的浮躁了,不过,分还是要给他的。先另外开帖给lich 200,一会再结这个。
地址:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2302125
 
还真的不直到子界类型,以前我一直以为Set不能大于32项,想使用对象的类型来解决这个问题,现在可是有收获了
 
TO: cnsandboy,
我写了一个测试代码,好像编译还不通过,还是说不能>4Byte
子界是不是这样定义的?
TSetTest = Set of cbBack..cbSlew;



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TypInfo;


type
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);


TSetTest = Set of cbBack..cbSlew;

type
TMyComponent = class(TComponent)
private
{ Private declarations }
FSetTest: TSetTest;
procedure A;
public
{ Public declarations }
published
property SetTest: TSetTest read FSetTest write FSetTest;
end;

implementation

{$R *.dfm}


{ TMyComponent }

procedure TMyComponent.A;

begin

end;

end.

 
我怎么不会报错


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;
type
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;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
StringGrid1: TStringGrid;
ADOTable1: TADOTable;
private
function GetButtonsEnabled: TMyCalcButtonKinds;
procedure SetButtonsEnabled(const Value: TMyCalcButtonKinds);
public
property ButtonsEnabled: TMyCalcButtonKinds read GetButtonsEnabled write SetButtonsEnabled;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.GetButtonsEnabled: TMyCalcButtonKinds;
begin
//
end;

procedure TForm1.SetButtonsEnabled(const Value: TMyCalcButtonKinds);
begin
//
end;

end.

 
//下一句是子界类型定义
TNumberButton = cbNum0..cbNum9;
//下面这句相当于TMyCalcButtonKinds 的子集
TNumberButtonKinds = set of TNumberButton

属性可以通过上面的方法分为多份,另外set允许超过32/16个只是作为属性发布的时候有限制。
 
hfghfghfg, :public自然不报错,只有published报错
 
TMyCalcButtonKind = (cbBack=0,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);
 
pihome 100分:
TMyCalcButtonKind = ...
TMyCalcButtonKinds1 = cbBack..cbNotEqual;
TMyCalcButtonKinds2 = cbNum0..cbNum9;
TMyCalcButtonKinds3 = cbSign..cbSlew;

tongdanfeng 100分:
因为积极参与
剩下的300分给lich
因为答案最完全且明确提出子类类型——也就是pihome的TMyCalcButtonKinds3 = cbSign..cbSlew;

等lich拿了另外开帖的200分后就开始分
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type

TEditorOption = (
eoAltSetsColumnMode,
eoAutoIndent,
eoAutoSizeMaxLineWidth,
eoDisableScrollArrows,
eoDragDropEditing,
eoDropFiles,
eoEnhanceHomeKey,
eoGroupUndo,
eoHalfPageScroll,
eoHideShowScrollbars,
eoKeepCaretX,
eoNoCaret,
eoNoSelection,
eoRightMouseMovesCursor,
eoScrollByOneLess,
eoScrollHintFollows,
eoScrollPastEof,
eoScrollPastEol,
eoShowScrollHint,
eoShowSpecialChars,
eoSmartTabDelete,
eoSmartTabs,
eoSpecialLineDefaultFg,
eoTabIndent,
eoTabsToSpaces,
eoTrimTrailingSpaces
);

TEditorOptions = set of TEditorOption;

TForm1 = class(TForm)
private
FEditOptions: TEditorOption;
procedure SetEditOptions(const Value: TEditorOption);
{ Private declarations }
public

{ Public declarations }
published
property EditOptions: TEditorOption read FEditOptions write SetEditOptions;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetEditOptions(const Value: TEditorOption);
begin
FEditOptions := Value;
end;

end.
[?]我在D6, D7 中编译没有问题?为什么
 
to 楼上的:

你的集合才26项啊, 没有看清题目吧?
 
结帐,走人
 
怎么没给出去?
 
后退
顶部