在Delphi数据库应用程序中常见错误

在Delphi数据库应用程序中常见错误,第1张

Delphi数据库应用程序中常见错误 原因/解决方法

数据感知控件DataSource属性未设置或者设置错误(链接为其他的DataSource)

原因 在设计时不小心改动 拷贝粘贴过程中未全部更改

测试时标准代码中没有数据 无法进行测试

解决 确定需要输入数据的表格的先后顺序 在依次输入测试数据 再进行测试

wwFilterDialog中进行数据过滤时 应该显示字段列表的字段没有显示 不方便输入

解决 判断字段 查找标码填充字段列表

运行程序时出现字段未找到的错误

原因 数据库进行了更改 而DataSet的字段列表没有更新

用DBGrid显示数据时 为方便阅读 单数行与奇数行用不同颜色显示 在数据量时 浏览数据时明显感觉到DBGrid数据刷新不够 单数行与奇数行的颜色不能正确显示

原因 DBGrid的 DataSource的DataSet中有较多的查找字段

解决 将部分查找字段去除

窗体标题为英文

原因 设计后未仔细检查

解决 更改为中文

DBNavigator中 刷新 按钮点击后出错

原因未知

解决 去除该按钮

与dxDBGrid配套使用的DBNavigator 在dxDBGrid的模式为LoadAll时 导航按钮与期望的方式不同

原因 dxDBGrid在LoadAll模式时 与DataSet中的数据不一致

解决 去除导航中的部分按钮

由存储过程得到的数据集对应的DBNavigator的 刷新 出错

原因 不清

解决 去除该按钮

窗体Show后 进入数据编辑后 部分查找字段编辑时出现数据集未打开

原因 数据集打开顺序有问题

解决 调整数据集的打开顺序 让标码数据集先打开

出现未找到存储过程的错误

原因 数据库的存储过程进行的重命名

解决 更改DataSource中的存储程序名称

wwFilterDialog的标题空白

解决 改为与数据集相关的标题 如 筛选计划

窗体在 * 下设计时 即使窗体为 * 在屏幕分辨率为 * 的时候出现窗体中的内容不能全部显示的现象

解决 * 下设计 * 时预留一定的空间

出现 Couldno t perform the edit because another user changed the record 错误

原因 未知

dxDBGrid在将字段拖曳到分组栏时 不能进行编辑 dxDBGrid中的当前记录与数据感知控件的当前记录不一致

解决 将二者在不同部分实现 不在同一窗体实现

出现 General SQL Error 错误

原因 未知 但发现在FormShow中打开表很多 尝试将其中部分表不打开时 错误消失 且不打开的表不同时 错误都消失

(系统休眠后)第一次连接数据库时(用户 口令均正确) 出现错误 但第二次则正常

原因 未知

打开/保存对话框未设置过滤条件

解决 设置合理的Filter DefaultExt

防差错措施不完善 (如输入数据(数字)出错时不报警)

解决 保存前验证正确性判断 设置Mask

数据感知控件DBComboBox应可进行选择和输入的输入框 不能进行输入

解决 更改Style属性为csDropDown

其他更一般的问题

模态对话框 Escape键不起作用

解决 合理设置Button的Canceled属性

模态对话框 回车键不起默认作用

解决 合理设置Button的Defaulted属性

使用Tab键后焦点跳转顺序无规律

lishixinzhi/Article/program/Delphi/201311/8471

下面的代码同时使用了异常响应和异常保护 异常响应用于设置变量的值 异常保护用于释放资源 当异常响应结束时利用raise重引发一个当前异常

var

APointer: Pointer

AInt ADiv: Integer

begin

ADiv :=

GetMem ( APointer )

try

try

AInt := div ADiv

except

on EDivByZero do

begin

AInt :=

raise

end

end

finally

FreeMem ( APointer )

end

end

上面一段代码体现了异常处理的嵌套 异常保护 异常响应可以单独嵌套也可以如上例所示的那样相互嵌套

自定义异常类的应用

利用Delphi的异常类机制我们可以定义自己的异常类来处理程序执行中的异常情况 同标准异常不同的是 这种异常情况并不是相对于系统的正常运行 而是应用程序的预设定状态 比如输入一个非法的口令 输入数据值超出设定范围 计算结果偏离预计值等等

使用自定义异常需要

自己定义一个异常对象类

自己引发一个异常

定义异常对象类

异常是对象 所以定义一类新的异常同定义一个新的对象类型并无太大区别 由于缺省异常处理只处理从Exception或Exception子类继承的对象 因而自定义异常类应该作为Exception或其它标准异常类的子类 这样 假如在一个模块中引发了一个新定义的异常 而这个模块并没有包含对应的异常响应 则缺省异常处理机制将响应该异常 显示一个包含异常类名称和错误信息的消息框

下面是一个异常类的定义

type

EMyException = Class(Exception)

自引发异常

引发一个异常 调用保留字raise 后边跟一个异常类的实例

假如定义

type

EPasswordInvalid = Class(Exception)

则在程序中如下的语句将引发一个EPasswordInvalid异常

If Password <>CorrectPassword then

raise EPasswordInvalid Create( Incorrect Password entered )

异常产生时把System库单元中定义的变量ErrorAddr的值置为应用程序产生异常处的地址 在你的异常处理过程中可以引用ErrorAddr的值

在自己引发一个异常时 同样可以为ErrorAddr分配一个值

为异常分配一个错误地址需要使用保留字at 使用格式如下

raise EInstance at Address_Expession

自定义异常的应用举例

下面我们给出一个利用自定义异常编程的完整实例

两个标签框(Label Label )标示对应编辑框的功能 编辑框PassWord和InputEdit用于输入口令和数字 程序启动时Label InputEdit不可见 当在PassWord中输入正确的口令时 Label InputBox出现在屏幕上 此时Label PassWord隐藏

设计时 令Label InputEdit的Visible属性为False 通过设置PassWord的PassWordChar可以确定输入口令时回显在屏幕上的字符

自定义异常EInvalidPassWord和EInvalidInput分别用于表示输入的口令非法和数字非法 它们都是自定义异常EInValidation的子类 而EInValidation直接从Exception异常类派生

下面是三个异常类的定义

type

EInValidation = class(Exception)

public

ErrorCode: Integer

constructor Create(Const Msg: StringErrorNum: Integer)

end

EInvalidPassWord = class(EInValidation)

public

constructor Create

end

EInvalidInput = class(EInValidation)

public

constructor Create(ErrorNum: Integer)

end

EInValidation增加了一个公有成员ErrorCode来保存错误代码 错误代码的增加提供了很大的编程灵活性 对于异常类 可以根据错误代码提供不同的错误信息 对于使用者可以通过截取错误代码 在try…except模块之外来处理异常

从以上定义可以发现 EInvalidPassWord和EInvalidInput的构造函数参数表中没有表示错误信息的参数 事实上 它们保存在构造函数内部 下面是三个自定义异常类构造函数的实现代码

constructor EInValidation Create(Const Msg: StringErrorNum: Integer)

begin

inherited Create(Msg)

ErrorCode := ErrorNum

end

constructor EInValidPassWord Create

begin

inherited Create( Invalid Password Entered )

end

constructor EInValidInput Create(ErrorNum: Integer)

var

Msg: String

begin

case ErrorNum of

:

Msg := Can not convert String to Number

:

Msg := Number is out of Range

else

Msg := Input is Invalid

end

inherited Create(Msg ErrorNum)

end

对于EInvalidInput ErrorCode= 表示输入的不是纯数字序列 而ErrorCode= 表示输入数值越界

lishixinzhi/Article/program/Delphi/201311/25189


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11197853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存