我编辑了一个多窗体的程序,在关闭所有窗体之后电脑进程中此程序并没有关闭!不知道是什么问题?顺便问一下,我的destory和free分别什么在什么时候用?
下面程序代码是登陆界面
unit login;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, jpeg, ExtCtrls;type
  TLoginForm = class(TForm)
    Image1: TImage;
    EDUsername: TEdit;
    Label1: TLabel;
    EDPassword: TEdit;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  LoginForm: TLoginForm;implementationuses datemodule, main;{$R *.dfm}procedure TLoginForm.Button1Click(Sender: TObject);
begin
 EDUsername.Clear;
 EDPassword.Clear;
end;procedure TLoginForm.Button2Click(Sender: TObject);
var
username:string;
password:string;
begin
username:=EDusername.Text;
password:=EDPassword.Text;
  with datam.ADOQueryAdduser do
    begin
    close;
    sql.Clear;
    SQL.Add('select * from admin');
    open;
    if trim(username)='' then
      begin
      showmessage('用户名不能为空!');
      EDusername.SetFocus;
      end
    else
       if trim(password)='' then
          begin
            showmessage('密码不能为空!');
            EDPassword.SetFocus;
            end
      else
          if not Locate('id',Trim(username),[loPartialKey])then
            begin
            showmessage('用户名不存在!');
            EDusername.Clear;
            EDPassword.Clear;
            end
          else
            if not locate('password',Trim(password),[loPartialKey]) then
              begin
              showmessage('密码不正确!');
              EDusername.Clear;
              EDPassword.Clear;
             end
            else
              begin
                application.CreateForm(TmainForm,mainform);
                mainform.StatusBar1.Panels[1].Text:=username;
                mainform.StatusBar1.Panels[3].Text:=fieldbyname('class').AsString;
                if fieldbyname('class').AsString='一般用户' then
                  begin
                  mainform.N2.Enabled:=false;
                  end;
               loginform.Hide;
               loginform.free;
               mainform.ShowModal;
               mainform.Free;              end
        endend;
下面是主窗体
unit main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, ExtCtrls;type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N14: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    N19: TMenuItem;
    N20: TMenuItem;
    N21: TMenuItem;
    N22: TMenuItem;
    N23: TMenuItem;
    N24: TMenuItem;
    N25: TMenuItem;
    N26: TMenuItem;
    N27: TMenuItem;
    N28: TMenuItem;
    N29: TMenuItem;
    N30: TMenuItem;
    N31: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N32: TMenuItem;
    N33: TMenuItem;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  MainForm: TMainForm;implementationuses adduser, datemodule;{$R *.dfm}procedure TMainForm.Timer1Timer(Sender: TObject);
begin
mainform.StatusBar1.Panels.Items[5].Text:=timetostr(time);
end;procedure TMainForm.N3Click(Sender: TObject);
begin
adduserform:=Tadduserform.Create(application);
AddUserForm.Show;
end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
datam.free;
end;end.
end.
工程开始时只创建了datam(数据datamodule)和loginform(登陆界面)

解决方案 »

  1.   

    TMainForm.FormClose中将程序terminate掉,不行吗?
      

  2.   

    改成这样:你为什么要创建呢直接:如下procedure TMainForm.N3Click(Sender: TObject);
    begin
    AddUserForm.Show;
    end;
    或者,在
    procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    datam.free;
    end;这里不用datam.free语句就行
      

  3.   

    你的设计思路和方法错了
    如果DM(数据模板)是一直要用的,不用自己创建,让它自动CREATE
    要自己CREATE的FORM也有两种,
    SDI和MDI(一般情况)
    SID()
     YOURFORM := TYOURFORM.CREATE(Application);
     YOURFORM.ShowModal();
     YOURFORM.Free();MDI; YOURFORM := TYOURFORM.CREATE(Application);
     YOURFORM.ShowModal();
      

  4.   

    用free会好些, 因为, 他是先检查一遍在调用destroy ,安全
      

  5.   

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      application.Terminate;
    end;
      

  6.   

    close事件中写action:= cafree;
    destroy中写 form:=nil;
      

  7.   

    设计思路是创建DataM和LoginForm等用户信息验证成功后创建MainForm释放LoginForm,关闭MainForm后程序结束.不知道思路对不对!?我一直不明白动态创建窗体时,在前一个窗体需要声明要创建的窗体不?如
    procedure TMainForm.N3Click(Sender: TObject);
    var 
    adduserform:=Tadduserform;
    begin
    adduserform:=Tadduserform.Create(application);
    AddUserForm.Show;
    end;
      

  8.   

    TO:Arockroll(书到用时方恨少) 
    两种有什么区别?
      

  9.   

    你说 mainform  这个是你的主窗体你怎么在程序中间又创建了一个!application.CreateForm(TmainForm,mainform);你在Project -> Options 里面的主窗体是什么??你的代码框架有问题!不应该这样写!
      

  10.   

    楼主,我是就事论事,你的这些代码基本上废了,写的很差。
    首先看看你的致命伤:
    1.Locate('id',Trim(username),[loPartialKey]),你没有认真看帮助吧,[loPartialKey]表示部分匹配。
    2.逻辑错误:你首先判断是否存在用户,然后再判断是否存在密码,可以如果你要的是TOM的用户密码为TOMPASS,但表里面存在TOM的用户密码为NOTTOMPASS,却同时存在PETER的用户密码为TOMPASS,你就错了吧。
    3.后面是最惨不忍睹的了,你以为你想把哪个窗体当成主窗体系统就同意了,你口口声声说MainForm是你的主窗体,可是我告诉你,系统就是认为主窗体是登录窗体。
    4.loginform.Hide;
      loginform.free;
      mainform.ShowModal;
      mainform.Free;
    这一段,我已经无法忍受了,你先把主窗体的loginform释放掉了,然后再去调用mainform的ShowModal方法,这怎么能行呢?
    楼主,如果你想将MainForm作为主窗体,请你到Projects->Options->Forms->Main Form中进行设定。
    5.楼主写的程序丝毫没有精简和复用的基本编程理念,当然相信你是新手,不应该强求,像这样的代码:
    procedure TLoginForm.Button2Click(Sender: TObject);
    var
    username:string;
    password:string;
    begin
    username:=EDusername.Text;
    password:=EDPassword.Text;
      with datam.ADOQueryAdduser do
        begin
        close;
        sql.Clear;
        SQL.Add('select * from admin');
        open;
        if trim(username)='' then
          begin
          showmessage('用户名不能为空!');
          EDusername.SetFocus;
          end
        else
           if trim(password)='' then
              begin
                showmessage('密码不能为空!');
                EDPassword.SetFocus;
                end
          else
              if not Locate('id',Trim(username),[loPartialKey])then
                begin
                showmessage('用户名不存在!');
                EDusername.Clear;
                EDPassword.Clear;
                end
              else
                if not locate('password',Trim(password),[loPartialKey]) then
                  begin
                  showmessage('密码不正确!');
                  EDusername.Clear;
                  EDPassword.Clear;
                 end
                else
                  begin
                    application.CreateForm(TmainForm,mainform);
                    mainform.StatusBar1.Panels[1].Text:=username;
                    mainform.StatusBar1.Panels[3].Text:=fieldbyname('class').AsString;
                    if fieldbyname('class').AsString='一般用户' then
                      begin
                      mainform.N2.Enabled:=false;
                      end;
                   loginform.Hide;
                   loginform.free;
                   mainform.ShowModal;
                   mainform.Free;              end
            endend;
    以后不应该再出现了。
    6.楼主最后窗体的问题直接导致了程序不能关闭,这还是轻的,这样的程序是会崩溃的。