我在制作一个货物进销系统时,遇到一个问题,便把问题程序编在一个简单的程序里,一编译就出错,下面分别是数据模块和主程序代码,请各位老师帮忙找找错误。
unit data;interfaceuses
  SysUtils, Classes, DB, ADODB;type
  TDataModule2 = class(TDataModule)
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet; 
    DataSource1: TDataSource;
    ADODataSet2: TADODataSet;
    DataSource2: TDataSource;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 var
  DataModule2: TDataModule2;implementation{$R *.dfm}end.//*注:adodataset1和2都用adoconnection1连接数据库,datasource1、2分别连adodataset1、2
,active都已设true;没编译时,dbgrid1数据显示正常。*//  unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, Grids, DBGrids;type
  TForm1 = class(TForm)
    DBComboBox1: TDBComboBox;
    DBComboBox2: TDBComboBox;
    DBGrid1: TDBGrid;
    procedure DBComboBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  varstr:string;
implementationuses data;{$R *.dfm}procedure TForm1.DBComboBox1Change(Sender: TObject);
begin
  varstr:=dbcombobox1.Text;
  datamodule2.adodataset2.Close;
  datamodule2.ADODataSet2.CommandText:='select * from 货物 where 类型='''+varstr+'''';
  datamodule2.ADODataSet2.Open;
  with datamodule2.ADODataSet1 do
  begin
    close;
    commandtext:='select * from 货物 where 类型='''+varstr+'''';
    open;
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
    datamodule2.ADODataSet2.close;
    datamodule2.ADODataSet2.commandtext:='select distinct 类型 from 货物';
    datamodule2.ADODataSet2.open;
    datamodule2.ADODataSet2.First;
    dbcombobox1.Items.Clear;
    while not datamodule2.ADODataSet2.eof do
    begin
      dbcombobox1.Items.Add(datamodule2.ADODataSet2.fields[0].asstring);
      datamodule2.ADODataSet2.next;
    end;
end;end.

解决方案 »

  1.   

    dbcombobox1.Items.Clear;
    放上面看看
      

  2.   

    错误提示:project project1.exe raised exception class EaccessViolation with message'Access
    violation at address 004AE6CA in module ' projict1.exe'.Read of address 00000064'.
    Process stopped.Use Step or run to continue
      

  3.   

    我用断点找了,应该是procedure TForm1.FormCreate(Sender: TObject)里的问题
      

  4.   

    还有,我把两个dbcombobox的datasource属性都设成datasource1,字段分别是类型和品名。
      

  5.   

    在Dpr文件中
    使DataModule2在Form1前创建!
    即!
    Application.CreateForm(TDataModule2, DataModule2);
    Application.CreateForm(TForm1, Form1);
      

  6.   

    谢谢,到现在还是搞不定,不知道错在哪里。
    逍遥叹老大:我找不到dpr文件,不知道在哪改,但我又写了一次,先建datamodule2,错误亦旧。唉,到底是咋回事呀
      

  7.   

    菜单Project->Options出现Forms选项卡,在列表Auto-create forms中,出现:
    Form1
    DataModule2 
    把DataModule2拖到Form1前面变成
    DataModule2
    Form1就行了.
    因为您在form1创建时调用DataMoule2,如果次时DataMoule2未创建,就会出现地址错,因为DataMoule2需要在form1前面创建.
      

  8.   

    liangpei2008(逍遥叹)的意思是,您在Project Manager窗口中的
    .exe上按右键,选择菜单项View Source,会出现:begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TDataModule2, DataModule2);
      Application.Run;
    end.把  Application.CreateForm(TDataModule2, DataModule2);
    放到  Application.CreateForm(TForm1, Form1);
    前面即可
    和前面的做法效果一样.
      

  9.   

    刚才的问题没了,却又显示:无效的sql...slect ..又看不懂了。
      

  10.   

    详细的错误提示是:无效的sql语句,期待'delete' 'update' 'insert' ...  等与编辑数据集有关的命令,不知是啥意思
      

  11.   

    跟踪了,问题就在datamodule2.ADODataSet2.commandtext:='select distinct 类型 from 货物';一句,只要datamodule2.adodataset2.open一执行,就出现了上面的错误,但我实在不知道这句错在哪。