如题:搞了个图形界面。路径由用户自己选择。然后将路径保存到一个字符串myconnstr,然后对各窗口的adotable和adoquery动态连接数据库(根据myconnstr的指定),但是不知道为什么总出现一个错误。access violation at address ,我不知道这是为什么 代码是:
myconnstr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+datalink.Edit1.Text+''; accountmanagement.adotable1.ConnectionString:=myconnstr;
 accountmanagement.adotable1.TableName:='用户登录';
 accountmanagement.adotable1.Active:=true;
 accountmanagement.datasource1.DataSet:=accountmanagement.adotable1; accountmanagement.dbgrid1.DataSource:=accountmanagement.datasource1;
 accountmanagement.DBEdit1.DataSource:=accountmanagement.datasource1;
 accountmanagement.DBEdit2.DataSource:=accountmanagement.datasource1;
 accountmanagement.DBEdit3.DataSource:=accountmanagement.datasource1; accountmanagement.DBEdit1.DataField:='部门号';
 accountmanagement.DBEdit2.DataField:='员工号';
 accountmanagement.DBEdit3.DataField:='姓名'; accountmanagement是我的另外一个窗体名。datalink是用户自己设置路径的图形窗体名字。我就是想在datalink里面直接use
accountmanagement单元,然后把accountmanagement的各个adotable连接设置好。且每次出错都显示在
accountmanagement.adotable1.ConnectionString:=myconnstr; 这条语句上,这是为什么呢
小弟望各位高手指点,感激涕零。此帖于2007年7月14日早上揭贴。谢谢大家

解决方案 »

  1.   

    accountmanagement窗体创建了没。。
      

  2.   

    忘了说了:accountmanagement是一个mainform下的MDI子窗体,而datalink是一个提供给用户连接数据库文件的窗体(非子窗体),程序开始是先出现datalink
      

  3.   

    不知道是否 这样
    1。myconnstr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='''+datalink.Edit1.Text+'''';2。还有 myconnstr 是申明在哪个单元里?
    accountmanagement or datalink?如果是前者的话,那有没有引用datalink这个单元呢?3。看了LZ最后的发言,是不是accountmanagement 还没有生成啊????
      

  4.   

    myconnstr 是申明在datalink这个单元里,accountmanagement是我在设计的时候就做好的窗体,
      

  5.   

    datalink什么时候创建的,程序结构设计的太乱,你把数据库用到的参数放到一个DataModule里
      

  6.   

    楼主加个断点调试一下,看accountmanagement是不是已经创建了
      

  7.   

    accountmanagement的确已经创建了
      

  8.   

    accountmanagement.adotable1创建了没?
    accountmanagement.adotable1.ConnectionString这个属性可以取到么?
      

  9.   

    accountmanagement.adotable1也是在设计的时候就放上去的,这里在datalink窗体中
    调用     accountmanagement.adotable1
      

  10.   

    在这句话前面加上
    accountmanagement.adotable1.ConnectionString:=myconnstr;ShowMessage(accountmanagement.Name);
    ShowMessage(accountmanagement.adotable1.Name);
    ShowMessage(accountmanagement.adotable1.ConnectionString);
    你看那个showmessage会出错呢
      

  11.   

    我写入代码:
    accountmanagement.adotable1.ConnectionString:=myconnstr;
     accountmanagement.adotable1.TableName:='用户登录';
     accountmanagement.adotable1.Active:=true;
     accountmanagement.datasource1.DataSet:=accountmanagement.adotable1; ShowMessage(accountmanagement.Name);
     ShowMessage(accountmanagement.adotable1.Name);
     ShowMessage(accountmanagement.adotable1.ConnectionString);程序只在第一条语句,即accountmanagement.adotable1.ConnectionString:=myconnstr;停止根本不会showmessage出来了
      

  12.   

    如果写入代码:
    ShowMessage(accountmanagement.Name);
     ShowMessage(accountmanagement.adotable1.Name);
     accountmanagement.adotable1.ConnectionString:=myconnstr;程序在第一条语句即ShowMessage(accountmanagement.Name);出错
      

  13.   

    出错为:access violation at address 004E62D4 in module 'project1.exe'
      

  14.   

    这段代码在哪个Unit的哪个事件里?说清楚一点,好分析。
      

  15.   

    ShowMessage(accountmanagement.Name);出错,说明accountmanagement还没有被创建,如果被创建了,就应该能取到窗体的名字了,楼主检查下accountmanagement是 Autocreate的么?在Project-options-Forms选项卡里
      

  16.   

    1。这段代码在unit25的BitBtn2Click之中,unit25就是datalink窗体对应的单元。是我后来加上去的
    2。问题我好象有点眉目了,好象是datalink窗体根本无法调用 accountmanagement。和数据库路径无关。accountmanagemen是我在设计程序是手动创建的窗体。如果真是楼上那位兄弟说的,没有创建accountmanagemen,那是为什么呢?我过去已经手动创建了啊。datalink是我后来由于需要加上去,的确无法调用accountmanagement,而我在datalink中已经uses了accountmanagement对应的单元。是不是要在哪里加上accountmanagement.create(self)才行呢。我是初学者,望大家多多指点,在线等
      

  17.   

    uses 
    ADOConed程序中设置ADO数据库连接
    Connection.Close;
      Connection.ConnectionString := ConnectionString.Text;
      if EditConnectionString(Connection) then
      begin
        ConnectionString.Text := Connection.ConnectionString;
        ConnectionStringClick(Sender);
      end;
      

  18.   

    回logne兄弟:  datalink 在Project-options-Autocreate- form中,而accountmanagemen在avilable forms
    中,accountmanagemen是MDI子窗体。
      

  19.   

    查看一下调用datalink之前accountmanagement是不是已经创建了,还有accountmanagement这个是不是用的全局的变量?不过不是,而accountmanagement是在datalink里定义的一个变量,那就在调用datalink时,初始化一下accountmanagement,把你创建的那个accountmanagement赋给
    datalink里的accountmanagement这个变量。
      

  20.   

    建议这样,你把
    accountmanagement.adotable1.ConnectionString:=myconnstr;
    之后的那段,都放进accountmanagement窗体的OnCreate里面,在accountmanagement的implimentation段中 uses DataLink单元。
    这样可以避免accountmanagement的创建时机问题(因为DataLink是先创建并显示的)。
      

  21.   

    回rodgerkong:这种方法,我昨天晚上试过了,还是不行。回logne:请问,象你说的,应该如何创建accountmanagement这个窗体呢?
      

  22.   

    有两种改法,取决于你程序的逻辑,你可以像以前一样在Unit25中使用这段程序,不过要在accountmanagement.adotable1.ConnectionString:=myconnstr;之前实例化accountmanagement,可以用 accountmanagement=Taccountmanagement.Create(MainForm),MainForm是你主窗口的名字(很久没用Delphi,不知是否有CreateMDIForm这样的语句)。但是这样将导致accountmanagement在按下按钮后就被创建显示。
    另一种方法是我上面提到的,在accountmanagement窗口内,书写上述代码,并引用DataLink单元,这样从逻辑上,代码只在你需要的时候才会执行,比较通畅。
      

  23.   

    我不清楚你要什么时候创建accountmanagement,你看一下你调用datalink之前accountmanagements是不是被create了,就是你create accountmanagements的地方执行了没,如果没有把create的代码要放到调用datalink之前~~
      

  24.   

    回rodgerkong:谢谢你。第二种方法,我昨天试了一个通宵,但是出现的问题和第一种差不多。所以我采取第一种方法
      

  25.   

    回logne:刚才尝试了一下,在datalink的oncreate事件里create  accountmanagement,但程序出现的错误就停留在该datalink的oncreate事件里create  accountmanagement语句上面了。错误还是一样的
      

  26.   

    请教一下,你现在accountmanagement能不能创建并显示?
    或者说你打算在什么时候创建并显示accountmanagement窗口?
    accountmanagement:=Taccountmanagement.Create(MainForm)应当在你打算显示它的正常位置执行
      

  27.   

    回rodgerkong:我的思路是这样的。
    1。程序一开始显示datalink,它的功能是提供界面然用户设置数据库路径,路径保存到一个变量
    2。登录界面。
    3。主窗体
    4。accountmanagement,它是主窗体的一个子窗体
      

  28.   

    用TIniFile保存配置文件,当显示accountmanagement这个窗体时,读取配置文件信息,初始化adoquery等,连接数据库就行了
    如果密码一类的不想写到配置文件里,可以在accountmanagement显示前,调用datalink窗体,让用户输入密码,然后传会给accountmanagement这个就好了
      

  29.   

    根据你的思路
    1.确保Project属性中,DataLink是在AutoCreate列表的第一个。其中定义myconnstr并初始化它为 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+datalink.Edit1.Text+'';最好是在按下确定之后。
    2. 显示登录界面,这里有点疑问,登录时不需要访问数据库验证密码吗?
    3. 显示主窗体。如果需要在主窗体显示的同时就把accountmanagement显示出来,那么在主窗体的OnShow中加入 Application.CreateForm(Taccountmanagement, accountmanagement); accountmanagement.Show。如果需要在主窗体显示之后靠菜单激活accountmanagement,那么上面两句就写在菜单事件中。
    4. accountmanagement窗体的Implimentation段中uses Unit25(Datalink),然后在accountmanagement的OnCreate事件中添加accountmanagement.adotable1.ConnectionString:=unit25.myconnstr;及其后的语句,注意myConnStr的引用最好加上定义域unit25
      

  30.   

    写错一点,第4点,既然是在accountmanagement书写代码,那么对象前不应当使用accountmanagement,直接写对象名就行了,如adotable1.ConnectionString:=unit25.myconnstr