两个TDateTime类型的数据相减

本文介绍了一种通过将时间字符串转换为TDateTime类型,并利用encodedate()和encodetime()函数来计算两个时间点间有效时长的方法。计算结果以天数形式返回,便于进行进一步的时间数据分析。

程序中用到两个时间数据相减得到有效时长的功能,在网上查询后得到如下结论:
1.首先将两个时间字符串转换为TDateTime类型,这里可以使用encodedate()和encodetime()函数。
2.得到的两个数据相减后是double类型的数据,而且表示的是天数。
如2015081815-2015081709得到的就是1.25天。

<think>我们正在讨论的是如何在PowerBuilder中正确使用OleVariant类型。OleVariant是PowerBuilder中用于OLE自动化操作的特殊数据类型,它可以表示多种类型数据,并且能够自动处理与COM对象之间的数据类型转换。以下将详细说明其使用方法。 ### 1. **OleVariant类型概述** - OleVariant是一种可变数据类型,可以存储各种类型数据(如整数、字符串、日期、对象引用等)[^3]。 - 在调用COM对象的方法时,OleVariant能够自动匹配COM方法所需的参数类型(如VT_BSTR, VT_I4等)[^3]。 - 使用OleVariant可以避免常见的OLE调用错误(如错误35:参数类型不匹配)[^1]。 ### 2. **基本使用方法** #### 2.1 声明与赋值 ```powerbuilder OleVariant lv_var // 赋值字符串 lv_var = "PowerBuilder字符串" // 自动转为VT_BSTR // 赋值整数 lv_var = 100 // 自动转为VT_I4 // 赋值浮点数 lv_var = 3.14 // 自动转为VT_R8 // 赋值布尔值 lv_var = TRUE // 自动转为VT_BOOL // 赋值日期 lv_var = DateTime(Today(), Now()) // 自动转为VT_DATE ``` #### 2.2 调用COM方法 ```powerbuilder OLEObject ole_excel ole_excel = CREATE OLEObject // 连接Excel IF ole_excel.ConnectToNewObject("Excel.Application") <> 0 THEN MessageBox("错误", "无法启动Excel") RETURN END IF // 使用OleVariant传递参数 OleVariant lv_visible lv_visible = TRUE ole_excel.Visible = lv_visible // 设置Excel可见 // 调用带参数的方法 OleVariant lv_workbook, lv_worksheet lv_workbook = ole_excel.Workbooks.Add() lv_worksheet = lv_workbook.Worksheets(1) // 写入单元格(A1) OleVariant lv_cell lv_cell = lv_worksheet.Cells(1, 1) // 行号、列号 lv_cell.Value = "Hello from PB" // 自动转为VT_BSTR ``` ### 3. **处理特殊值** #### 3.1 空值(Null)与未定义(Empty) - **`OLENull()`**: 表示COM中的`VT_NULL`(空值) - **`OLEEmpty()`**: 表示COM中的`VT_EMPTY`(未初始化值) ```powerbuilder // 传递空值 ole_object.Method(OLENull()) // 传递未定义值(如可选参数) ole_object.OptionalParam(OLEEmpty()) ``` #### 3.2 错误值处理 使用`Try-Catch`捕获OLE调用异常: ```powerbuilder TRY ole_excel.ActiveWorkbook.SaveAs("C:\\test.xlsx") CATCH (RuntimeError err) MessageBox("OLE错误", "错误代码: " + String(err.Number)) END TRY ``` ### 4. **数组传递(重点)** COM方法可能要求传递数组参数(如`VT_ARRAY | VT_VARIANT`),需使用`OleVariant`数组: ```powerbuilder // 创建一维数组 OleVariant lv_array lv_array = OleVariant(1, 2, 3, 4, 5) // 静态初始化 // 动态创建二维数组 long ll_rows = 3, ll_cols = 2 lv_array = OleVariant(0, ll_rows, ll_cols) // 初始化3行2列数组 // 填充数组 lv_array[1, 1] = "姓名" lv_array[1, 2] = "年龄" lv_array[2, 1] = "张三" lv_array[2, 2] = 30 lv_array[3, 1] = "李四" lv_array[3, 2] = 28 // 传递给COM方法(如Excel的Range.Value) OleVariant lv_range lv_range = ole_worksheet.Range("A1:B3") lv_range.Value = lv_array // 批量写入数据 ``` ### 5. **类型转换注意事项** - **隐式转换风险**:PowerBuilder自动转换基础类型,但复杂类型需手动处理。 ```powerbuilder // 错误示例:直接传递PowerBuilder的Decimal类型 DECIMAL ld_val = 123.45 OleVariant lv_val = ld_val // 可能丢失精度(应使用Double) ``` - **显式转换最佳实践**: ```powerbuilder // 显式转换为Double OleVariant lv_safe = Double(ld_val) // 字符串处理(避免Ansi字符串问题) string ls_unicode = "Unicode文本" OleVariant lv_text = ls_unicode // PB自动转为宽字符串(VT_BSTR) ``` ### 6. **释放资源** OleVariant变量在超出作用域时会自动释放,但及时释放COM对象可避免内存泄漏: ```powerbuilder // 手动释放 ole_excel.Quit() DESTROY ole_excel // OleVariant清空 lv_array = OleVariant() // 重置为未初始化状态 ``` ### 7. **调试技巧** - **查看实际类型**:使用`ClassName()`函数(返回`olevariant`) - **获取值类型代码**:通过`OleVariant`的`VarType`属性(需调用COM API) ```powerbuilder // 扩展:获取变量类型的VB代码(需借助ScriptControl) OLEObject ole_script ole_script = CREATE OLEObject ole_script.ConnectToNewObject("ScriptControl") ole_script.Language = "VBScript" string ls_type = ole_script.Eval("VarType(" + lv_var + ")") // 返回类型代码 ``` > **关键点总结**: > 1. 始终使用`OleVariant`传递COM方法的参数[^3]; > 2. 复杂数据(如数组)需显式构造; > 3. 空值/未定义值使用`OLENull()`/`OLEEmpty()`; > 4. 及时释放COM对象避免资源泄漏[^1]。 §§相关问题§§ 1. PowerBuilder中如何传递结构体(Struct)到COM对象? 2. 如何处理OleVariant返回的数组数据? 3. PowerBuilder调用Excel时如何避免进程残留? 4. OleVariant与PowerBuilder的Any类型有何区别?</think>### PowerBuilder 中 OleVariant 类型的正确使用方法 OleVariant 是 PowerBuilder 中处理 OLE/COM 调用的核心数据类型,它能自动处理 COM 对象所需的数据类型转换。以下是详细使用指南: #### 1. **基础声明与赋值** ```powerbuilder OleVariant lv_var // 字符串赋值(自动转为 VT_BSTR) lv_var = "PowerBuilder字符串" // 数值赋值(自动转为 VT_I4 或 VT_R8) lv_var = 100 // 整数 lv_var = 3.14 // 浮点数 // 布尔值赋值(自动转为 VT_BOOL) lv_var = TRUE // 日期赋值(自动转为 VT_DATE) lv_var = DateTime(Today(), Now()) ``` #### 2. **COM 方法调用中的参数传递** ```powerbuilder OLEObject ole_excel ole_excel = CREATE OLEObject ole_excel.ConnectToNewObject("Excel.Application") // 使用 OleVariant 传递参数 OleVariant lv_visible, lv_workbook lv_visible = TRUE ole_excel.Visible = lv_visible // 设置属性 lv_workbook = ole_excel.Workbooks.Add() // 调用方法 ``` #### 3. **特殊值处理** ```powerbuilder // 空值处理(VT_EMPTY) ole_excel.MethodName(OLEEmpty()) // 无参数方法 // Null 值处理(VT_NULL) ole_excel.MethodName(OLENull()) // 显式传递空值 ``` #### 4. **数组传递(关键技巧)** ```powerbuilder // 创建一维数组 OleVariant lv_array lv_array = OleVariant(1, 2, 3, 4, 5) // 静态初始化 // 动态创建二维数组(Excel 范围写入示例) long ll_rows = 3, ll_cols = 2 lv_array = OleVariant(0, ll_rows, ll_cols) // 初始化3行2列数组 // 填充数组 lv_array[1, 1] = "姓名" lv_array[1, 2] = "年龄" lv_array[2, 1] = "张三" lv_array[2, 2] = 30 // 传递给 COM 方法 ole_excel.Range("A1:B3").Value = lv_array ``` #### 5. **类型转换注意事项** ```powerbuilder // 显式类型转换(避免隐式转换错误) DECIMAL ld_val = 123.45 OleVariant lv_safe = Double(ld_val) // 显式转为 Double // 字符串处理(支持 Unicode) string ls_unicode = "中文文本" OleVariant lv_text = ls_unicode // 自动转为宽字符串(VT_BSTR) ``` #### 6. **返回值处理** ```powerbuilder // 接收 COM 方法返回值 OleVariant lv_result lv_result = ole_excel.ActiveWorkbook.Name // 类型判断与转换 if IsNumber(lv_result) then integer li_val = Integer(lv_result) end if ``` #### 7. **资源释放** ```powerbuilder // 显式释放 COM 对象 ole_excel.Quit() DESTROY ole_excel // OleVariant 清空 lv_array = OleVariant() // 重置为未初始化状态 ``` > **关键原则**: > 1. 所有 COM 调用参数都应使用 OleVariant 包装[^3] > 2. 数值类型需显式转换避免精度丢失 > 3. 数组必须通过 OleVariant 特殊语法构造 > 4. 及时释放 COM 对象防止内存泄漏[^1] #### 调试技巧 ```powerbuilder // 启用详细 OLE 日志 SetOLELog(1) // 日志输出到 PBODBxxx.log // 错误捕获 TRY ole_object.Method(OleVariant(参数)) CATCH (RuntimeError err) MessageBox("OLE 错误", "代码: " + String(err.Number)) END TRY ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值