请问一个小问题(100分)(100分)

  • 主题发起人 主题发起人 www
  • 开始时间 开始时间
W

www

Unregistered / Unconfirmed
GUEST, unregistred user!
我从D4升到D5后原来的代码出错了,请问为什么?
var
State: TOwnerDrawState;
begin
with Message.DrawItemStruct^do
begin
State := TOwnerDrawState(WordRec(LongRec(itemState).Lo).Lo);
//以上这句话出错,错误是invalid typecast
 

State := TOwnerDrawState(WordRec(LongRec(Message.DrawItemStruct^.itemState).Lo).Lo);行不行?
 

var
N:Longint;
W:Word;
B:Byte;
N:=Longint(Message.DrawItemStruct^.ItemState);
W:=LongRec(N).Lo;
B:=WordRec(W).Lo;
State:=TOwnerDrawState(B);
 

State:=TOwnerDrawState(TByteArray(ItemState)[0]);
 
State:=TOwnerDrawState(TByteArray(ItemState)[0]);
 
我试了,以上方法都不行。
 
看看d5中有没有新的函数或方法
 
看看d5的帮助里面的what's new部分
里面已经讲过了,d5对d4的OwnerDraw函数做了更新,和以前的代码不能兼容,
具体我也没仔细看过,你自己看看吧!
 
//message.pas
TWMDrawItem = packed record
...
DrawItemStruct: PDrawItemStruct;
...
end;
//windows.pas
PDrawItemStruct = ^TDrawItemStruct;
TDrawItemStruct = tagDRAWITEMSTRUCT;
tagDRAWITEMSTRUCT = packed record
...
<font color=red>itemState: UINT;</font>
...
end;
UINT = LongWord;
<B>ItemState类型为LongWord</B>
//sysutils.pas
WordRec = packed record
Lo, Hi: Byte;
end;
LongRec = packed record
Lo, Hi: Word;
end;
<B>WordRec(LongRec(itemState).Lo).Lo类型为Byte</B>
//windows.pas
TOwnerDrawState = set of (odSelected, odGrayed, odDisabled, odChecked,
odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect,
odReserved1, odReserved2, odComboBoxEdit);
你的代码是把ItemState的最低字节转换为TOwnerDrawState集合,
看起来似乎是正确的,
但其中的转换太多,请你先试一下Hexi的代码,
然后说一下是哪一行出错,
这样至少知道是哪个转换失败了。
我个人怀疑是最后的TOwnerDrawState(xx)失败了,
等检查一下再回答你吧
 
我又看了一下,
Delphi帮助中写的:
type
TOwnerDrawState = set of (odSelected, odGrayed,
odDisabled, odChecked odFocused, odDefault, odComboBoxEdit);
只有7个元素,<B>一个Byte可以保存</B>
但windows.pas中声明如下:
type
TOwnerDrawState = set of (odSelected, odGrayed, odDisabled, odChecked,
odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect,
odReserved1, odReserved2, odComboBoxEdit);
共13个元素,<B>这样的一个集合用一个Byte是绝对不够的</B>
你试一下,把你的程序改成:
State:=TOwnerDrawState(<font color=red>LongRec(itemState).Lo</font>);
如何?

ps: D5的帮助似乎还有地方没修改哦~~~
大家还是多看源代码吧!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
606
import
I
后退
顶部