问题一)我在做数据库连接时,发生了这样一个错误~
希望高手帮忙!
问题是这样的~
我用ACCESS做了一个数据库,然后按常理,用一个FORM1,DBGrid等显示数据。
然后我又用一个FORM2来往数据库里添加数据。
编译连接正常。也能够运行~
但是问题在这里出来了~
当我首先打开FORM2对数据库添加数据时。没有任何问题,但是只要我有过
打开FORM1进行浏览数据库表格内容时。然后再次打开FORM2对数据库添加
数据时。就会报这样的错了~
报错内容:Access violation at address 049f22A in module 'DHB.EXE'.Read of address 0000000我在想可能是不是我在打开FORM1时没有把数据库等没有关闭。所以才会这样~
但是我使终没能把问题解决~希望各位高手帮忙。现在我就把两个FORM窗体内容贴出来如下:
显示窗体:
unit Home;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DB, ADODB, Buttons,
  HyperLabel;type
  TIE_HOME = class(TForm)
    DBGrid1: TDBGrid;
    Panel1: TPanel;
    Panel2: TPanel;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    ADOQuery1: TADOQuery;
    HyperLabel1: THyperLabel;
    Edit1: TEdit;
    Label1: TLabel;
    procedure SpeedButton2Click(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  IEHOME: TIEHOME;implementation{$R *.dfm}procedure TIE_HOME.SpeedButton2Click(Sender: TObject);
begin
//////////////////////
  IEHOME.Close;
end;procedure TIE_HOME.DBGrid1CellClick(Column: TColumn);
//var dh:string;
begin
DBGrid1.Focused;
     with  IE_HOME.ADOQuery1  DO
       begin
          Close;
          sql.Clear;
          sql.Add('select * from IEForm');
          Open;
          Edit1.Text:=TrimLeft(FieldByName('DURL').AsString);
          HyperLabel1.URL:=Edit1.Text;
          HyperLabel1.Click;
       end;
end;procedure TIE_HOME.DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Show;
end;end.添加数据窗体:
unit Save_IE;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls, HyperLabel, Buttons;type
  TIE_SAVE = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Edit1: TEdit;
    Panel3: TPanel;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Image1: TImage;
    HyperLabel1: THyperLabel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    procedure Button2Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Edit2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  IE_SAVE: TIE_SAVE;implementation{$R *.dfm}
uses Home_Of_IE, DB,  ADODB;procedure TIE_SAVE.Button2Click(Sender: TObject);
begin
IE_SAVE.Close;
end;procedure TIE_SAVE.SpeedButton2Click(Sender: TObject);
begin
IE_SAVE.Close;
end;procedure TIE_SAVE.SpeedButton1Click(Sender: TObject);
begin
  if Trim(Edit1.Text)<>''then
  begin
  if Trim(Edit2.Text)<>'' then
  begin
///////////
     with  IE_HOME.ADOQuery1  DO
       begin
          Close;
          sql.Clear;
          sql.Add('select * from IEForm');
          Open;
          if Not Locate('DURL',Trim(Edit1.text),[lopartialkey]) then
          begin
            Append;
            FieldByName('实名').AsString:=Edit2.Text;
            FieldByName('DURL').AsString:=Edit1.Text;
            /////////
           If MessageDlg('是否存入数椐库中',MtConfirmation,[mbYes,mbNo],0)=mrYes then
                begin
                  post;
                  showmessage('用户以成功的写入数据库中');
                  //IE_SAVE.Close ;
                end
                else
                  Cancel;
            /////////
          end
          else
          ShowMessage('该地址已经存在,不必再次保存。');
       end;
//////////
  end
  else
  begin
   ShowMessage('对不起,实名不能为空!请输入实名以便你操作。');
   Edit2.Focused;
  end;
  end
  else
  begin
   ShowMessage('对不起,地址不能为空!请输入地址。');
   Edit1.Focused;
  end;
end;procedure TIE_SAVE.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Edit1.Text='www.dianhui.com' then
Edit1.Text:='';
end;procedure TIE_SAVE.Edit2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Edit2.Text='大江东去‘then
Edit2.Text:='';
end;procedure TIE_SAVE.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=13 then
Edit2.SetFocus;
end;end.问题二)
就是在DBGrid1中,我想把数据库中一条记录时。我每次把DBFRID的窗体打开
时显示出来的都是数据表中的第一条数据。我把鼠标往下点击,也就是下一条
记录时,它还是只在显示数据。
我现在想,就是我把鼠标点记下一条记录时。就能把鼠标所在的记录数据
显示出来~
比如显示在EDIT中!~
Edit1.Text:=TrimLeft(FieldByName('DURL').AsString);请教高手,谢谢了~

解决方案 »

  1.   

    //问题一) 
    最后可能出现问题的地方
    procedure TIE_HOME.DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      //Show;//????
      if not assigned(TIE_SAVE) then
          TIE_SAVE.show;
          
    end;问题二)
    AfterScroll(DataSet: TDataSet);中写事件
      

  2.   

    不行呀~
    我试过了~问题一)
    中的这个事件是用来测试的~没什么作用~应该是SHOWMESSEGE('FSDAFDFSSDKFJJFFFFFFFFF');
    问题二)
    用这个事件也做不到~再说了~DBGrid1中也没有这个事件呀~
    在别的组件里做没有用~
    还是总是只显示第一条记录~
    不管你鼠标点哪~
      

  3.   

    谢谢大家的关注~现在第二个问题我已经解决了~
    现在把代码和大家一起学习:
    Edit1.Text:=Column.Grid.SelectedField.AsString;(记录中不同字段,鼠标所点的字段)
    别外一个就是我们选特定的记录中特定字段(在记录里总是某个字段):
    Edit1.Text:=Column.Grid.DataSource.DataSet.FieldByName('职位').AsString; 以上两个代码都会让你鼠标点拉就会把哪的记录或记录特定字段显示出来~
    现在就第一个问题了~希望大家能帮帮忙~
    像上面这位朋友说的~
    我也考虑过,但是有一点我想不通呀~如果我没有打开过FORM1显示窗体而的话,打开FORM2添加窗
    就不会出问题,但是只要我在系统运行过程中,有打开FORM1显示窗体,再开FORM2添加窗体就会出
    这个错误了~所以说,对像应该是创建了,要不第首先开它怎么能开呀~它并非是系统一开始都不能
    开的~所以我觉得问题应该是在我打开FORM1的时候,然后关了它.可能就是在关它后把FORM2要用的
    东西释放了~所以再开FORM2的就出现这个问题了~
    但是我也不知道到里他释放了什么!所以请大家帮帮忙~
      

  4.   

    再次谢谢大家.问题全部解决了~
    呵呵~是我犯了一个小错误~
    就是我在创建FORM1的时候马上又把它释放了~所以才会有这样的错误~procedure TForm1.SpeedButton3Click(Sender: TObject);
    begin
    Application.CreateForm(TIE_HOME,IE_HOME);
    IE_HOME.ShowModal;
    IE_HOME.Free; //<-
    //有该句将会报一个在程序运行时候报一个错:Accessviolationataddress049f22A 
    //inmodule 'DHB.EXE'.Read of address 0000000
    //那么该处有两种方法处理这个问题,一)就是这里把 IE_HOME.Free;
    //屏蔽掉,二)就是不屏幕,在再次应该IE-HOME的事件中加上再次创建
    //该资源的语句,Application.CreateForm(TIE_HOME,IE_HOME);相比之下
    //方法二)较好之,这样有利于利用系统资源!
    end;