正想做一个通用一点的权限管理模块,除了现在系统要用外,以后做的系统可能也要用到,不知大家有什么好的方案交流一下。

解决方案 »

  1.   

    可以建立窗体基类,设打开窗体
    基类窗体
      protected
         iModuleID: Integer;
         sFunctionName: String;
         function IsTEdit():Boolean; virtual;
      public
        Constructor CreateWithFunction(AOwner: TComponent; ModuleID:Integer; FunctionName:String);
        { Public declarations }
      end;var
      frmBase: TfrmBase;implementationuses Main, Global;
    {$R *.dfm}Constructor TfrmBase.CreateWithFunction(AOwner: TComponent; ModuleID:Integer; FunctionName:String);
    begin
    iModuleID:=ModuleID;
    sFunctionName:=FunctionName;
    Inherited Create(AOwner);
    end;function TfrmBase.IsTEdit: Boolean; //ÊÇ·ñÊDZ༭¿ò
    begin
       if (ActiveControl is TCustomEdit) or
           (ActiveControl is TCustomComboBox) or
           (ActiveControl is TDxInplaceEdit) or
           (ActiveControl is TDateTimePicker)
           then Result:=True
       else
           Result:=False;
    end;
    procedure TfrmBase.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action:=cafree;
    end;示例窗体
      protected
        //iFunctionID :Integer;
        sSql:String;
        bCanNew,bCanModify,bCanDelete,bCanPrint :Boolean;
        Function IsUnique(ParamName,ParamValue: String): Boolean; {¼ì²â±àºÅÊÇ·ñÖظ´}
        function CheckSave :Boolean;  {¼ì²âµ±Ç°Êý¾ÝÊÇ·ñ±£´æº¯Êý}
        function GetErrorInfo(E: EDatabaseError) :String; {È¡´íÎóÃèÊöÐÅÏ¢ºÍ´íÎóÔ­Âë}
        Procedure GetPermiss ; virtual; {µÃµ½µ±Ç°Óû§µÄȨÏÞ}
      public
        { Public declarations }
      end;var
      frmInfoBase: TfrmInfoBase;
    implementationUses DM, Global, Main;
    var
      StateFlag:String;  //±êÖ¾ÊÇÌí¼Ó»òÐ޸ıêÖ¾
    {$R *.dfm}{¼ì²â±àºÅÊÇ·ñÖظ´}
    Function TfrmInfoBase.IsUnique(ParamName,ParamValue: String): Boolean; {¼ì²â´úÂëÊÇ·ñÖظ´}
    begin
    Result:=True;
    //if QBaseInfo.State = dsInsert then
       With QIsUnique do
           begin
           parameters.ParamValues[ParamName]:=ParamValue;
           if Active then Requery else Open;
           if RecordCount > 0 then Result:=False;
           end
    end;{¼ì²âµ±Ç°Êý¾ÝÊÇ·ñ±£´æº¯Êý}
    Function TfrmInfoBase.CheckSave :Boolean;
    begin
    Result:=true;
    if QBaseInfo.State in [dsInsert,dsEdit] then //Åжϵ±Ç°×´Ì¬
       Case Messagedlg('ÊÇ·ñ±£´æµ±Ç°µÄÐ޸ģ¿',mtWarning,[mbYes,mbNo,mbCancel],0) of
       mrYes:
         begin
         QBaseInfo.Post ;
         Result := QBaseInfo.State = dsBrowse;  //״̬ÊÇ·ñΪBrowse
         end;
       mrNo:
         begin
         QBaseInfo.Cancel ;
         Result := QBaseInfo.State = dsBrowse;  //״̬ÊÇ·ñΪBrowse
         end;
       mrCancel:
         Result := False ;
       End
    end;{È¡´íÎóÃèÊöÐÅÏ¢ºÍ´íÎóÔ­Âë}
    function TfrmInfoBase.GetErrorInfo(E: EDatabaseError) :String;
    var
      AdoErrors :Errors; //adoµÄ´íÎóÐÅÏ¢¶ÔÏó
      sError :String;
    //  i :Integer;
    begin
      inherited;
    {È¡µÃ´íÎóÐÅÏ¢}
    AdoErrors:=DModule.ADOCnMain.Errors ;
    //for i:=0 to AdoErrors.Count-1 do
    if AdoErrors.Count >0 then  //¿ÉÄÜÓжà¸ö´íÎóÐÅÏ¢£¬ÕâÀïֻȡµÚÒ»¸ö
      sError:= sError+#10#13+AdoErrors.Item[0].Description+' (´íÎóÂë:'+InttoStr(AdoErrors.Item[0].NativeError)+')'
      Else if (E is EDatabaseError) then
           sError:=E.Message ;Result:=sError;
    end;{µÃµ½Óû§¶Ôµ±Ç°´°ÌåµÄ²Ù×÷ȨÏÞ}
    procedure TfrmInfoBase.GetPermiss;
    begin
    {³õʼ»¯±äÁ¿}
    bCanNew :=G_bAdmin;
    bCanModify :=G_bAdmin;
    bCanDelete :=G_bAdmin;
    bCanPrint :=G_bAdmin;if G_bAdmin then //
    begin
       bCanNew :=G_bAdmin;
       bCanModify :=G_bAdmin;
       bCanDelete :=G_bAdmin;
       bCanPrint :=G_bAdmin;
    end
    else  //
    with DModule.spUserRight do
      if Locate('fModuleID;fActionName',varArrayOf([iModuleID,sFunctionName]),[]) then
         begin
         bCanNew := FieldByName('fInsert').AsBoolean;
         bCanModify := FieldByName('fEdit').AsBoolean;
         bCanDelete := FieldByName('fDelete').AsBoolean;
         bCanPrint := FieldByName('fPrint').AsBoolean;
         end
    end;