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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)