在程序中 一个窗体frminput中定义了一个类input,在input的checkinput方法中(一个用来检查必填项目是否已经填写的方法)调用以下代码出错:
   if  FrmInput.DBName = '' then Result := False
   时出现AC错误(内容访问冲突),请教如何安全的进行跨类和窗体边界的调用而不会出现访问错误?

解决方案 »

  1.   

    代码有误,代码是:
    if  FrmInput.DBName.text = '' then Result := False
      

  2.   

    不应该访问类的属性应该访问属性对应的局部变量吧
    if  fDbnameText = '' then Result := False没看到你的全部代码..不敢定论,要解决问题就不要吝啬哦
      

  3.   

    楼上对,把FrmInput去掉改为
    if DBName = '' then Result := False
    应该就没问题了
      

  4.   

    在类里怎么能够不加窗体实例调用呢,如果把frminput去掉的话,因为是在类input的方法里判断
    ,所以就默认成了if  (默认本类TInput).DBName.text ……了,显然是要出错的,现在的重点是要在类里判断窗台的dbedit控件是否为空,而又不出错。
      

  5.   

    你的类写的有问题
    类是不依靠任何已有控件的
    你可以给类加
    一个私有变量 fDbname
    一个私有函数setdbname;
    一个published的
    property dbname:string read fDbname  write setdbname;
    然后把你的错误部分改为 
    if fDBName = '' then Result := False在实例加载后 先:
    myInput:=Tinput.create;
    myinput.dbname:=FrmInput.DBName.text;
    然后调用你的checkinput方法就可以了
    ---饿了,回家吃法有什么问题晚上说,要不你把代码贴出来我帮你改
      

  6.   

    如果是这样的话,那你用frmInput作DBName的前缀那肯定不行.
    把你的frmInput设置AutoCreate
    或者把frmInput改为一个TfrmInput的一个实例.
      

  7.   

    to:jinjiazz:
      我明白你说的意思,用属性封装进行传递是可以的,但是要检查的控件比较多,不可能一个个全部传递给类的private变量,我又试着写了个全局过程类来检查控件值是否为空,仍然是内存访问冲突。
      看来不行的话,偶只能在窗体里写公有过程实现检查输入值是否为空的代码,然后在类里调用了,不知道是否还是内存非法~
      

  8.   

    to:jinjiazz:
      我明白你说的意思,用属性封装进行传递是可以的,但是要检查的控件比较多,不可能一个个全部传递给类的private变量,我又试着写了个全局过程类来检查控件值是否为空,仍然是内存访问冲突。
      看来不行的话,偶只能在窗体里写公有过程实现检查输入值是否为空的代码,然后在类里调用了,不知道是否还是内存非法~-----------------------------那你的类写不写都没什么意义了。你好好看看面向对象的三个基本要素是什么
      

  9.   

    “那你的类写不写都没什么意义了。你好好看看面向对象的三个基本要素是什么”
       哈哈,不错,俺钻了死胡同:
      忽然间明白了问题的关键:其实定义功能类就是为了把 界面和业务逻辑相分离,偶经验太少,妄想把所有的东西,都封装进业务处理类里去;其实在这种情况下,应该在界面类中检查输入是否合法,也就是窗体类中里定义,如果合法后再调用业务处理类中的相应方法实现输入信息的保存;类里是不能直接引用实例名的。
      看来过程化的习惯太……了。
      不过借人气请教另外一个问题:也是跨边界调用的问题:如何在类里通过过程类型属性调用一个外部的过程;如窗体的公用过程?
      是不是如下:
        TCustomProc = procedure of ……;
        CustomProc = TCustomProc;
        
        ……类内部
        private
          FCustomProc: TCustomProc;
        public
        property Customproc:TCustomProc read FCustomProc write FCustomProc; 
        ……
      代码是否正确?另外,这样是不是实际上传递的是该过程的内存指针?还是拷贝了一份?