在程序中 一个窗体frminput中定义了一个类input,在input的checkinput方法中(一个用来检查必填项目是否已经填写的方法)调用以下代码出错:
if FrmInput.DBName = '' then Result := False
时出现AC错误(内容访问冲突),请教如何安全的进行跨类和窗体边界的调用而不会出现访问错误?
if FrmInput.DBName = '' then Result := False
时出现AC错误(内容访问冲突),请教如何安全的进行跨类和窗体边界的调用而不会出现访问错误?
解决方案 »
- image控件显示图片,如何设置按钮对图片进行放大缩小?
- 关于QQ的TEA加解密
- 一道难题?!关于数据选择的问题!
- SQL服务器采用的是Window验证,用ADOConnection的联接字符串应该怎么写啊???
- 字符串提取问题!高手请帮忙!
- 关于建立“网络游戏开发结构模型”的提议
- 好心人帮忙!!
- QRband组件为什么只能显示一条记录?!!
- 在delphi+word编程中,wordApplication有onQuit事件,但对于Excel和PPT却没有,请大虾指教如何捕捉到Excel和PPT当中的onQuit事件。
- 怎样用delphi制作异形窗体?(比如那种最大、最小化按钮是圆形的,标题栏的样子很酷的)
- 自定义光标问题
- 关于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;
……
代码是否正确?另外,这样是不是实际上传递的是该过程的内存指针?还是拷贝了一份?