unit main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, DBCtrls, Mask, Grids, DBGrids, Menus,
  WinSkinData;type
  TfrMain = class(TForm)
    MainMenu1: TMainMenu;
    StatusBar1: TStatusBar;
    DBGrid1: TDBGrid;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBComboBox1: TDBComboBox;
    DateTimePicker1: TDateTimePicker;
    SkinData1: TSkinData;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    procedure FormCreate(Sender: TObject);
    procedure N3Click(Sender: TObject);
    
  private
    procedure openTable;
    { Private declarations }
  public
    { Public declarations }
  end;var
  frMain: TfrMain;implementation{$R *.dfm}
 uses  data,pass,public1;
procedure TfrMain.FormCreate(Sender: TObject);
begin
     openTable;
     StatusBar1.Panels[7].Text:=DateToStr(date); end;procedure Tfrmain.openTable;
begin   DBGrid1.DataSource:=frData.DataSource1;
   frData.DataSource1.DataSet:=frData.ADOTable2;
   frData.DataSource1.Enabled:=True;
   frData.ADOTable2.Close;
   frData.ADOTable2.Connection:=frData.ADOConnection1;
   frData.ADOTable2.Close;
   frData.ADOTable2.TableName:='account';
   frData.ADOTable2.Active:=True;
end;
procedure TfrMain.N3Click(Sender: TObject);
begin
  close;
end;end.以上是主窗口的代码;
unit Pass;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TfrPass = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    StaticText1: TStaticText;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
     passOK:BOOLEAN;
    { Public declarations }
  end;var
  frPass: TfrPass;implementation{$R *.dfm}
uses data,public1;
procedure TfrPass.Button1Click(Sender: TObject);
begin
  
  frData.ADOTable1.Connection:=frdata.ADOConnection1;
  frData.ADOTable1.Close;
  frData.ADOTable1.TableName:='pass';
  frData.ADOTable1.Open;  if Trim(edit1.Text)=Trim(frdata.ADOTable1.FieldByName('password').AsString)  then
  begin
    frPass.Close ;
    passOK:=True;  end
  else
  begin
    MessageDlg('密码错误!请与管理员联系!',mtInformation,[mbYes,mbNo],0);
    PassOK:=False;
  end;
  frData.ADOTable1.Close;end;procedure TfrPass.Button2Click(Sender: TObject);
begin
  close;
end;procedure TfrPass.FormCreate(Sender: TObject);
begin
   frData.ADOConnection1.ConnectionString:=public1.link;
   frData.ADOConnection1.LoginPrompt:=false;
end;end.
以上是登陆窗口的代码!
program MyAccount;uses
  Forms,
  main in 'main.pas' {frMain},
  data in 'data\data.pas' {frData: TDataModule},
  public1 in 'public\public1.pas',
  Pass in 'PASS\Pass.pas' {frPass};{$R *.res}begin
  Application.Initialize;
  Application.CreateForm(TfrData, frData);
  Application.CreateForm(TfrPass, frPass);
  frpass.ShowModal;
  if frpass.passOK then
  begin
    frpass.Free;
    Application.CreateForm(TfrMain, frMain);
    Application.Run;
  end
  else
    Application.Terminate;end.
以上是工程文件的代码
我将连接数据库的控件(ADOConnection1,ADOTable1;ADOTable2;  DataSour1)放在DataModule内,公式的常量放在PLULIC1内,当我在登录窗口内一按下关闭按钮时,系统显示出错(Access violation at address 4dd7640a in module ,read of address 4dd7640a,这是什么原因,是我的逻辑有识吗,如果是的话怎样改法,才能OK

解决方案 »

  1.   

    你放在public里面的话,那就是说,这些控件不是直接拉到datamodal里的了~~~~~~~~~
      

  2.   

    那就需要在create里面把这些东东创建了才能用了~~~~~~~~
      

  3.   

    好乱的代码
    Application.Initialize;
      Application.CreateForm(TfrData, frData);
      Application.CreateForm(TfrPass, frPass);
      frpass.ShowModal;
      if frpass.passOK then
      begin
        frpass.Free;
        Application.CreateForm(TfrMain, frMain);
        Application.Run; ---〉放到最下边吧
      end
      else
      begin
        Application.Terminate;
        Exit;
      end;
    end.另外,尽可能的把代码少放到FormCreate中