Variant类型变量

690cj 2006-01-07 03:37:24
VB中有 Variant类型变量,声明为Variant类型的数组后,可以通过计算机串口接收二进制数据,请问在PB中有类似的Variant类型的变量吗?有人用PB通过串口接收过二进制数据吗?如果有最好,能提供源码。
...全文
165 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rightyeah 2006-01-09
  • 打赏
  • 举报
回复
觉得leio((郁闷中...)) 的答案很详细了

------------------玄之又玄,众妙之门
robert126 2006-01-08
  • 打赏
  • 举报
回复
没有用过,学习...................
顺便签到..
hygougou 2006-01-08
  • 打赏
  • 举报
回复
oncomm事件:


BLOB lb_data
STRING ls_dipstr
LONG ll_datalens
INTEGER i



choose case object.commevent
case 380
messagebox('','无效属性值 comInvalidPropertyValue')
case 383
messagebox('','属性为只读 comSetNotSupported')
case 394
messagebox('','属性为只读 comGetNotSupported ')
case 8000
messagebox('','端口打开时操作不合法 comPortOpen')
case 8001
messagebox('','超时值必须大于 0 ')
case 8002
messagebox('','无效端口号 comPortInvalid')
case 8003
messagebox('','属性只在运行时有效 ')
case 8004
messagebox('','属性在运行时为只读 ')
case 8005
messagebox('','端口已经打开 comPortAlreadyOpen')
case 8006
messagebox('','设备标识符无效或不支持该标识符 ')
case 8007
messagebox('','不支持设备的波特率 ')
case 8008
messagebox('','指定的字节大小无效 ')
case 8009
messagebox('','缺省参数错误 ')
case 8010
messagebox('','硬件不可用(被其它设备锁定) ')
case 8011
messagebox('','函数不能分配队列 ')
case 8012
messagebox('','设备没有打开 comNoOpen ')
case 8013
messagebox('','设备已经打开 ')
case 8014
messagebox('','不能使用 comm 通知 ')
case 8015
messagebox('','不能设置 comm 状态 comSetCommStateFailed')
case 8016
messagebox('','不能设置 comm 事件屏蔽 ')
case 8018
messagebox('','仅当端口打开时操作才有效 comPortNotOpen ')
case 8019
messagebox('','设备忙 ')
case 8020
messagebox('','读 comm 设备错误 comReadError')
case 8021
messagebox('','为该端口检索设备控制块时的内部错误 comDCBError ')
case 1
messagebox('','发送事件。 ')
case 2

ole_1.object.RThreshold = 0
IF ole_1.object.InBufferCount <> 0 THEN
          //二进制数据
lb_data = ole_1.object.input
FOR i = 1 To Len(lb_data)
ls_dipstr = String(BlobMid(lb_data, i, 1))
            //按位转换成ASCII后转换成16进制,f_inttohex--10进制转16进制
mle_js.text += f_inttohex(ASC(ls_dipstr)) + ":"
NEXT

END IF

case 3
messagebox('','clear-to-send 线变化。 ')
case 4
messagebox('','data-set ready 线变化。 ')
case 5
messagebox('','carrier detect 线变化。 ')
case 6
messagebox('','振铃检测。 ')
case 7
messagebox('','文件结束。 ')

end choose
leio 2006-01-08
  • 打赏
  • 举报
回复
用blob类型接收,接收前先给BLOB分配足够的长度。比如你定义时这样:blob{255} myblob,这样就预分配了255个字节给myblob。
接收后不能直接转换成string类型(直接转换,除非你明确知道数据包里是什么,否则肯定有问题)。
我一般是先测量BLOB长度,然后动态设置一个char[]分配好空间,然后用API函数的memcopy将blob拷贝到char[]中,再进行相应处理(这样比BLOB好处理一些)。

需要注意:
PB以"\0"做为结束符,假设接收的BLOB有20字节,在第10字节是"\0",直接转换成string后就只有9字节(第10及以后的字节全没了)。
转成char[]后,该数组是20的长度,但若直接将该数组转成string,也是9字节。
690cj 2006-01-08
  • 打赏
  • 举报
回复
我试过char、char[]、any、any[]、blob,只有blob程序能通过,但上来的是乱码比如“?”或“$”之类的东西,实在没有办法。在网上也查了很多,但找不到可以用的。
delphi 为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型Variant变量没有类型 一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换。需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。variant 变量类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。总之,你可以认为包含variant变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。 上面对Variant 类型的使用提出了警告,现在来看看Variant 类型究竟能干什么。基本上说,如果声明了一个variant 变量: var V: Variant; 你就可以把各种不同类型的值赋给它: V := 10; V := 'Hello, World'; V := 45.55; 一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下: procedure TForm1.Button1Click(Sender: TObject); var V: Variant; begin V := 10; Edit1.Text := V; V := 'Hello, World'; Edit2.Text := V; V := 45.55; Edit3.Text := V; end; 很有趣是不是?你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text属性。正如你在图10.1中所看到的,一切正常。 (图10.1)按Assign按钮后,例VariTest的输出结果 图 10.1: 例 VariTest 的 Assign 按钮 Click 事件输出结果 更糟糕的是:你还可以用variant变量计算数值,从第二个按钮的Click事件代码就可看到这一点: procedure TForm1.Button2Click(Sender: TObject); var V: Variant; N: Integer; begin V := Edit1.Text; N := Integer(V) * 2; V := N; Edit1.Text := V; end; 至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。这里再重申一遍,如果不到万不得以,不要随便使用Variant 类型,还是应坚持使用传统的Pascal 数据类型类型检查方法。在Delphi 和 VCL中,variant变量主要是用于 OLE 支持和数据库域的访问。 Variant类型内部结构 Delphi中定义了一个 variant 记录类型,TVarData,它与Variant 类型有相同的内存布局。你可以通过TVarData访问variant变量的实际类型。TVarData 结构中包含了Variant类型信息(由Vtype域表示)、一些保留域及当前值。 VType域的取值包括OLE 自动化中的所有数据类型,这些类型通常叫OLE 类型variant 类型。以下是variant 类型的完整列表,按字母顺序排列: varArray varBoolean varByRef varCurrency varDate varDispatch varDouble varEmpty varError varInteger varNull varOleStr varSingle varSmallint varString varTypeMask varUnknown varVariant 你可以在Delphi 帮助系统的variants 主题下找到这些类型的说明。 还有许多操作variant 变量的函数,你可以用它们进行特定的类型转换,或通过它们获取variant变量类型信息(例如VarType 函数),当你用variant变量写表达式时,Delphi会自动调用这些类型转换和赋值函数。另外还有操作variant 数组的例程,你可以通过帮助文件的Variant support routines 主题了解相关内容。 Variant类型运行很慢! Variant 类型代码运行很慢,不仅数据类型转换如此,两个值为整数的Variant 变量相加也是如此。它们几乎跟Visual Basic这种解释性代码一样慢!为了比较Variant变量和整型变量的运行速度,请看例VSpeed 。 程序中设置了一个循环,记录运行时间并在进程条中显示运行状态。下面是基于variant类型的一段代码,基于整型的代码与此相似: procedure TForm1.Button1Click(Sender: TObject); var time1, time2: TDateTime; n1, n2: Variant; begin time1 := Now; n1 := 0; n2 := 0; ProgressBar1.Position := 0; while n1 < 5000000 do begin n2 := n2 + n1; Inc (n1); if (n1 mod 50000) = 0 then begin ProgressBar1.Position := n1 div 50000; Application.ProcessMessages; end; end; // we must use the result Total := n2; time2 := Now; Label1.Caption := FormatDateTime ( 'n:ss', Time2-Time1) + ' seconds'; end; 记时这段代码值得一看,因为你可以把它用到任何类型的性能测试中。正如你所看到的,程序用Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分("n")和秒("ss")表示。除此之外,你可以用Windows API的GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。 从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。图10.2是在本人计算机上运行程序看到的结果。当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧