type 的迷惑(200分)

  • 主题发起人 主题发起人 jsjyzhangjq
  • 开始时间 开始时间
J

jsjyzhangjq

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
private
{ Private declarations }
hotkeyid1:integer;
hotkeyid2:integer;
procedure WMHOTKEY(var Msg:TWMHOTKEY);message WM_HOTKEY;
public
bj:integer;
str2:string;
{ Public declarations }
end;

type
TParity = ( None, Odd, Even, Mark, Space );
TStopBits = ( _1, _1_5, _2 );
TByteSize = ( _5, _6, _7, _8 );
TDtrControl = ( DtrEnable, DtrDisable, DtrHandshake );
TRtsControl = ( RtsEnable, RtsDisable, RtsHandshake, RtsTransmissionAvailable );
var
main: Tmain;
Viewstring:string;
js:integer;
implementation

procedure Tmain.Timer1Timer(Sender: TObject);
var
Filepath,Filename:string;
Inifile:Tinifile;
i,key1,key2:integer;
k:boolean;
begin
if bj=1 then
begin
Filename:=ExtractFilePath(Application.ExeName)+'hotkey.ini';//取得*.ini绝对路径;
k:=fileexists(Filename);
Inifile:=Tinifile.Create(FileName); //打开*.ini;
comm1.StopComm;
Comm1.Parity := TParity(GetEnumValue(TypeInfo(TParity),Inifile.ReadString('com','parity','')));
//Comm1.StartComm; //打开串口
Inifile.free;
end;
end;
我编译的时候提示:incompatible types: spcomm.tparity and unit1.tparity 望大侠们指导! 还要就是 delphi 中的type 到底是怎么用法的,有没有学习这个的相关资料!
 
Comm1.Parity 是什么类型?
如果是整型,用
Comm1.Parity := integer(TParity(GetEnumValue(TypeInfo(TParity),Inifile.ReadString('com','parity',''))));
如果是另一个枚举类型,也要强制转换一下
 
Comm1.Parity 就是 tparity 类型!
 
你是不是两个单元重复定义了tparity类型啊,即便你定义的一模一样delphi还是会认为不匹配的。
 
spcoom 和unit 在同一个单元内的!
 
......

spcoom的定义贴出来啊,难道也是在这个单元定义的?
 
这个问题应该是你TParity = ( None, Odd, Even, Mark, Space );
重新定义了tparity类型。将TParity = ( None, Odd, Even, Mark, Space );
这一句去掉,然后用spcoom中的TParity类型。
 
spcoom 是个控件,我根本就没有定义什么.我做这个程序的构想是这样的:我想让用户自己定义spcoom 的参数,我先把spcoom 的参数存进了'hotkey.ini' 中,'hotkey.ini' 里面的文本如下:
[com]
Brate=2000
parity=even
bsize=_8
sbits=_1_5
然后我发现用Inifile.ReadString('com','parity',''))); 这样的方法取里面 spcoom 的属性的时候,取出来的不是string 就是 integer 根本不可以赋值给spcoom ,所以我就想到了用type,就有上面的过程!望各位大侠指导下!
 
你说的应该是SPCOMM吧。 既然这样那就按[xiaopei]说的,把你这个单元定义的TParity类型定义删掉,利用SPCOMM里的定义。
另外,IniFile当然取不出你自定义的类型了,不是所有的事情Delphi都帮你做好了的,只能Inifile.ReadString取出数据后自己转换成 TParity类型。
 
单我根本就没有定义spcomm,我只是拖了这个控件放到了这个单元里面,spcomm 本身这个控件里面就有属性可以定义那几个参数!这样的话,那就只存在怎么把stirng 转换成 tparity 类型了!还有TStopBits,TByteSize!好像没有这样的函数可以直接转换的把!
 
你是没有定义spcomm,但你拖到窗口的控件里面已经定义有TParity类型了,你的单元再重新用type定义一个就是重复定义了。

可以告诉你,TParity = ( None, Odd, Even, Mark, Space );这些类型数据在Delphi是以符号显示给你看的,但程序编译后其实是这样的TParity = ( 0, 1, 2, 3, 4 );(这是默认显示,如果TParity是这样TParity = ( None=5, Odd=7, Even=9, Mark=10, Space=11 );定义的,则TParity真正的值是TParity = (5, 7, 9, 10, 11);),所以你用ini读取'None'传给comm控件肯定是不行的,不管你如何用type定义。
其实你作如下操作:
Comm1.Parity = None;
等于
Comm1.Parity = 0;
所以,你应该像下面那样使用ini文件才是正确的。
[TParity]
None=0
Odd=1
Even=2
Mark=3
Space=4
然后再用ReadInteger读取None的整数值给控件就行了。
 
单 这样定义Comm1.Parity = 0; 的话,就提示
incompatible types: tparity and integer 我想如果直接从 ini文件用 readinteger 中读取 none 的整型值给控件的话还是不行把
 
xiaopei 可以做个好老师了哈。
楼主最好找本 DELPHI 参考大全先看看前几章,呵呵。
 
你这样使用当然不行了,应该是这样使用。
Comm1.Parity = TParity(0); // 这里的TParity应该使用控件定义的TParity直接使用,你不用再type定义一个新的。
 
haha ,刚才和 xiaopei 同时回帖,结果大富翁出bug了,我点“发出”直接把我IE关了...
 
再补充一点,TParity是控件定义的,他的None序列值可能并不是以默认的序号使用的。为了保险起见,你在使用时最好使用ShowMessage(IntToStr(Ord(None));确认一下None等的序号值。
 
散分了,解决了,谢谢各位大侠!
 
后退
顶部