我建了四个FORM:FrmMain、PFrmMain、MFrmMain,FrmLogin. 
有个PERSON表:PERSONNO、AUTHORITY。 
我想在单击登陆框FrmLogin的Bitbtn,后根据AUTHORITY的值进入不同的FROM,分别是FrmMain、PFrmMain、MFrmMain。 AUTHORITY的值为0时进入FrmMain; 
AUTHORITY的值为1时进入PFrmMain; 
AUTHORITY的值为2时进入MFrmMain. 登陆框上有组件:ADOQuery,ADOConncetion. edUername文本框,edPassword文本框.我 
VAR: 
  A:string; 
我想Select AUTHORITY from PERSON; 
将查询后的AUTHORITY附给A,然后通过判断A的值,实现进入不同的FORM. 
我不会写这段代码,请大家帮帮忙,除了这种方法还有其他方法能实现“在登陆后因权限不同进入不同的FORM”的吗? 

解决方案 »

  1.   


    // delphi也是这个意识。
    if (A == "0")
        FrmMain->Show();
    else if (A == "1")
        PFrmMain->Show();
    else if (A == "2")
        MFrmMain->Show();
      

  2.   

    最简单的方法:
    if A = 'frmMain' then
    begin
      if frmMain = nil then
         frmMain := TfrmMain.Create(self);
      frmMain.Showmodal;
      Freeandnil(frmMain); 
    end
    else
    ......
      

  3.   


    这个我知道,主要是我不知道如何将数据库查询后的值AUTHORITY赋给A,
      

  4.   

    delphi 只能有一个主窗体,在主窗体的Create()事件下根据登陆的用户权限来显示对应的子窗体,是子窗体填满正个主窗体。
      

  5.   

    ==!这样做似乎不是很逻辑。
    我倒是建议你,用一个Form+PageControl
    如果控件是在多不过,就用Frame做,然后放到3个PageControl的Page里去。
      

  6.   

    一个简单的方法:
    把FrmMain、PFrmMain、MFrmMain这三个Form全并为一个,
    如:FrmMain,然后在上面建二个或三个panel,根据权限让相应的Panel显示,其他的隐藏。
      

  7.   


      adoquery.close;
      adoquery.sql.clear;
      adoquery.sql.text:='Select AUTHORITY from PERSON'; 
      adoquery.open;
      if not adoquery.isempty then
        a:=adoquery.fieldByname('AUTHORITY').asstring;其他实现的方法参考其他楼的建议。
      

  8.   

    "FrmMain、PFrmMain、MFrmMain"
    这三个主窗体不能合在一起吗,当你以不同的权限进入时,给用户的操作权限是不同的,比如:一个菜单下:用户增加,删除,修改...
    你不同的权限进入只能操作不同的
    大致的权限设计:
    用户名
    权限表
    用户权限对应表登录后,用户读到权限信息,然后操作.
      

  9.   

    楼主可以把三个窗体分别做成Frame,依据登录人员的不同,自动创建不同的Frame,并嵌入到主窗体中。
    这个思想与5楼的有点相似之处,唯一不同是如果把三个窗体用PageControl做成不同的PageSheet,这个单独的窗体会比较大,没有将三个窗体独立出来,对日后的维护的调试会略有不便。
      

  10.   

    樓主三個頁面不妨放在一個頁面里,設計時可見,權限不同時隱藏.
    adoquery.sql.text:='Select AUTHORITY from PERSON'; 
      adoquery.open;
     If RecordCount > 0 Then
        a:=adoquery.fieldByname('AUTHORITY').asstring;
      

  11.   

    我写下面的代码,调试了没有错,但运行后并没有实现功能,不知道该怎么办了?
    procedure TFrmLogin.BtnLoginClick(Sender: TObject);         //登陆系统
    begin
     with DM.Query do
       begin
        close;
        sql.Clear;
        sql.Add('select * from PERSON where NAME=:UN and PASSWD=:PW');
        Parameters.ParamByName('UN').Value:=CBUserName.Text;
        Parameters.ParamByName('PW').Value:=EDPassWord.Text;
        Open;
         if not DM.Query.IsEmpty then
              A:=DM.Query.fieldbyname('AUTHORITY').AsString;
          if A='1' THEN
           Begin
             FrmMain.ShowModal();
           end
           else if A='2'  then
           begin
             MFrmMain.ShowModal();;
           end
           else  if  A='3'  then
           begin
           PFrmMain.ShowModal();
           end;
        if recordCount <1 then
        begin
          Showmessage('对不起!用户名或密码错误!');
          Exit;
        end;
        Close;
       end;
    end;
      

  12.   

    adoquery.close;
    adoquery.sql.clear;
    adoquery.sql.add('Select AUTHORITY from PERSON where name='''+edUername+''' and pwd='''+edPassword+''' '); 
     adoquery.open; 
    If RecordCount =1 Then 
      case adoquery.fieldByname('AUTHORITY').asinteger of
        0:
          begin 
           FrmMain.show;
          end;
        1:
          begin 
           PFrmMain.show;
          end;
        2:
          begin 
           MFrmMain.show;
          end;
       end; 
      

  13.   

    我写下面的代码,调试了没有错,但运行后并没有实现功能,不知道该怎么办了? 
    procedure TFrmLogin.BtnLoginClick(Sender: TObject);        //登陆系统 
    begin 
    with DM.Query do 
      begin 
        close; 
        sql.Clear; 
        sql.Add('select * from PERSON where NAME=:UN and PASSWD=:PW'); 
        Parameters.ParamByName('UN').Value:=CBUserName.Text; 
        Parameters.ParamByName('PW').Value:=EDPassWord.Text; 
        Open; 
        if not DM.Query.IsEmpty then 
              A:=DM.Query.fieldbyname('AUTHORITY').AsString; 
          if A='1' THEN 
          Begin 
            FrmMain.ShowModal(); 
          end 
          else if A='2'  then 
          begin 
            MFrmMain.ShowModal();; 
          end 
          else  if  A='3'  then 
          begin 
          PFrmMain.ShowModal(); 
          end; 
        if recordCount <1 then 
        begin 
          Showmessage('对不起!用户名或密码错误!'); 
          Exit; 
        end; 
        Close; 
      end; 
    end; 
    我个人理解:你的意思是更具登录的信息启动不同的主窗体。如果是这样的话,我认为应该吧登录部分放入program部分。
    procedure TFrmLogin.BtnLoginClick(Sender: TObject);        //登陆系统 
    begin 
      with DM.Query do 
      try 
        close; 
        sql.Clear; 
        sql.Add('select * from PERSON where NAME=:UN and PASSWD=:PW'); 
        Parameters.ParamByName('UN').Value:=CBUserName.Text; 
        Parameters.ParamByName('PW').Value:=EDPassWord.Text; 
        Open; 
        if not DM.Query.IsEmpty then 
        begin
          A:=DM.Query.fieldbyname('AUTHORITY').AsString; 
          modalresult := mrok;
        end
        else begin
          Showmessage('对不起!用户名或密码错误!'); 
          modalresult := mrcancel; 
        end;
      finally 
        Close; 
      end;
    end;主程序中
    begin
    ...
      if FrmLogin.showmodal = mrok then
      begin
        if FrmLogin.A = '1' then
           application.createform(TFrmMain,FrmMain)
        else
        if FrmLogin.A = '2' then
           application.createform(TMFrmMain,MFrmMain)
        else
           application.createform(TPFrmMain,PFrmMain);
      end
      else
        application.terminate;
    ...
    end;