在程序中 一个窗体frminput中定义了一个类input,在input的checkinput方法中(一个用来检查必填项目是否已经填写的方法)调用以下代码出错:
if FrmInput.DBName = '' then Result := False
时出现AC错误(内容访问冲突),请教如何安全的进行跨类和窗体边界的调用而不会出现访问错误?
if FrmInput.DBName = '' then Result := False
时出现AC错误(内容访问冲突),请教如何安全的进行跨类和窗体边界的调用而不会出现访问错误?
解决方案 »
- 各位大哥请帮帮忙,一个简单的Delphi C/S结构程序
- 关于数据保存,不知道是不是属于并发的?!
- 请帮看看这段代码?
- 用过ODAC的请进来一下,谢谢
- 如何实时取得远程主机上SQLserver数据库中数据更新的消息?
- 关于录入焦点的简单问题
- 关于函数与过程作为参数的一个问题,书上抄了一个例子,运行不了,各位帮我改一下,谢谢
- 我这个程序能简单写吗,好麻烦
- 请问李维的《D5分布式多层应用 系统篇》中的一个问题(或在一个DataSet中显示另一个DataSet中的一个TDataSet类型字段)。
- 请问:listview里,如何设置,或代码如何写,才能让我能同时选中多个行,谢谢
- 自定义光标问题
- 关于xpmenu的问题!!!!!!!!!!!!!!!!!
if FrmInput.DBName.text = '' then Result := False
if fDbnameText = '' then Result := False没看到你的全部代码..不敢定论,要解决问题就不要吝啬哦
if DBName = '' then Result := False
应该就没问题了
,所以就默认成了if (默认本类TInput).DBName.text ……了,显然是要出错的,现在的重点是要在类里判断窗台的dbedit控件是否为空,而又不出错。
类是不依靠任何已有控件的
你可以给类加
一个私有变量 fDbname
一个私有函数setdbname;
一个published的
property dbname:string read fDbname write setdbname;
然后把你的错误部分改为
if fDBName = '' then Result := False在实例加载后 先:
myInput:=Tinput.create;
myinput.dbname:=FrmInput.DBName.text;
然后调用你的checkinput方法就可以了
---饿了,回家吃法有什么问题晚上说,要不你把代码贴出来我帮你改
把你的frmInput设置AutoCreate
或者把frmInput改为一个TfrmInput的一个实例.
我明白你说的意思,用属性封装进行传递是可以的,但是要检查的控件比较多,不可能一个个全部传递给类的private变量,我又试着写了个全局过程类来检查控件值是否为空,仍然是内存访问冲突。
看来不行的话,偶只能在窗体里写公有过程实现检查输入值是否为空的代码,然后在类里调用了,不知道是否还是内存非法~
我明白你说的意思,用属性封装进行传递是可以的,但是要检查的控件比较多,不可能一个个全部传递给类的private变量,我又试着写了个全局过程类来检查控件值是否为空,仍然是内存访问冲突。
看来不行的话,偶只能在窗体里写公有过程实现检查输入值是否为空的代码,然后在类里调用了,不知道是否还是内存非法~-----------------------------那你的类写不写都没什么意义了。你好好看看面向对象的三个基本要素是什么
哈哈,不错,俺钻了死胡同:
忽然间明白了问题的关键:其实定义功能类就是为了把 界面和业务逻辑相分离,偶经验太少,妄想把所有的东西,都封装进业务处理类里去;其实在这种情况下,应该在界面类中检查输入是否合法,也就是窗体类中里定义,如果合法后再调用业务处理类中的相应方法实现输入信息的保存;类里是不能直接引用实例名的。
看来过程化的习惯太……了。
不过借人气请教另外一个问题:也是跨边界调用的问题:如何在类里通过过程类型属性调用一个外部的过程;如窗体的公用过程?
是不是如下:
TCustomProc = procedure of ……;
CustomProc = TCustomProc;
……类内部
private
FCustomProc: TCustomProc;
public
property Customproc:TCustomProc read FCustomProc write FCustomProc;
……
代码是否正确?另外,这样是不是实际上传递的是该过程的内存指针?还是拷贝了一份?