Q&A

  • [질문]이벤트처리 프로시져 동적 변경(하드코딩방지)
안녕하세요.

현재
procedure TMainForm.Recovery1Click(Sender: TObject);
Begin
  if (w_userID='LIMYO') then -- 유저의 권한에 따라 실행..
  Begin
    처리내용
else
   ShowMessage('권한이 없습니다!');
end
형식으로 버튼 클릭이벤트 마다 하드코팅 되어있는데요.


권한에 따라 버튼의 클릭이벤트를 다르게 나타내고 싶습니다.

권한이 없는 경우 ShowMessage('권한이 없습니다!');를 공통적으로 나타내고

권한이 있는 경우 해당 실행내용을 처리하게 하고 싶습니다.

권한 검사하는 모듈을 따로 만들고, 그 모듈에서 권한 그룹을 검사하여서

권한이 있는경우 해당 폼의 버튼클릭이벤트를 실행하고,

권한이 없는경우 해당 폼의 버튼 클릭이벤트를 실행하지 않고 ShowMessage('권한이 없습니다!');를

나타내고 싶습니다.
procedure procVerify
begin
   if (w_userID='LIMYO') then -- 유저의 권한에 따라 실행..
  Begin
    폼명1.버튼1클릭이벤트 그대로처리
ese
    폼명1.버튼1클릭이벤트 처리내용대신
     ShowMessage('권한이 없습니다!'); 표시
  if !(w_userID='LIMYO' or w_userID='LIDO' ----) then --  권한이 있는 유저가 아닌경우
  Begin
  폼명2.버튼2클릭이벤트 처리내용대신
     ShowMessage('권한이 없습니다!'); 표시
ese
         폼명2.버튼2클릭이벤트 그대로처리
   if !(w_userID='ABC' or w_userID='DEF' ----) then --  권한이 있는 유저가 아닌경우
  Begin
  ..............................

end;
이렇게 동적으로 이벤트처리를 변경할 수 없나요?

※ 목적 : 프로그램의 하드코딩을 방지하고, 해당 유저 및 권한 그룹에 따른 권한을 파악하기 쉽도록 하기 위함.



2  COMMENTS
  • Profile
    장성호 2009.07.09 03:46
    권한에 따라 버튼 클릭시 동작을 다르게 하려는 것인가요?

    만약 권한이 없는 경우 근냥 Button을 Disable시키면 안된나요?

    권한이 바뀌면 그 권한에 맞춰 버튼을 enable 또는 disable시키는 코드를 만들어두변


    "권한이 없습니다."라느 메세지를 굳이 띄우지 않아도 될것 같은데...

    -------------------------------------------------------------------------------

    아니면 권한체크하는 함수를 만들어 두고 ButtonClick이벤트의 맨 첫번째 줄에
    그 함수 호출 코드를 넣도록 하면 어떤가요?

    procedure procVerify 를 procedure 가 아닌 function으로 만들어 두고

    <!--CodeS-->
    function procVerify
    begin
    ...
    end;
    TForm1.Button1Click();
    begin
    if(not procVerify )then Exit; // 이한 줄을 모든 ButtonClick에 넣어도 될듯..
    ...

    end;

    <!--CodeE-->
    ------------------------------------------------------------------------------------------
    그런데 위와같이 모든 Button의 OnClick이벤트에 저렇게 한줄 넣기가 싫다는 거죠
    버튼이 계속 추가될수도 있구...

    동적으로 Button의 OnClick이벤트 핸들러는 얼마든지 바꿀수 있습니다.

    가령
    Botton1.OnClick := MyButtonClick ; //이런식으로요

    MyButtonClick 함수에 권한 체크 기능이 있구요
    문제는 권한이 있는 경우 원래 original 이벤트 핸들러를 호출해줘야 겠죠
    그럴러면 button의 original 이벤트 핸들러를 어디다가 저정해뒀다가 호출해줘야하는 문제가 있네요...

    ------------------------------------------------------------------------------------------

    그런데 저렇게 OnClick이벤트 핸들러를 동적으로 바꾸지 않아도 얼마든지 가능할것 같은데요..

    WM_LBUTTONUP 이나 WM_CHAR , VK_RETURN 에 OnClick이벤트가 호출되죠

    그렇다면 Application.OnMessage에 이벤트 핸들러를 걸어두고

    넘어오는 tagMSG에서 tagMSG.hwnd 를 이용하여 그놈이 TButton이면 권한체크를 합니다.
    권한이 있으면 pass
    없으면 tagMSG.Handled :=ture 로 해줘버립니다.


    요게 제일 코드가 짧을듯...


    그럼..






  • Profile
    이창혁 2009.07.10 02:40
    세심하게 살펴주셔서 감사합니다.
    우선 제질문에 대한 배경을 설명드려야 할 것 같네요.
    procedure TMainForm.Recovery1Click(Sender: TObject);
    Begin
    if (w_userID='LIMYO') then -- 유저의 권한에 따라 실행..
    Begin
    처리내용
    else
    ShowMessage('권한이 없습니다!');
    end
    현재 위와같은 코드로 프로그램안의 많은 폼안의 버튼마다 하드코딩이 되어있습니다.
    권한은 로그인시 user_id를 통해서 권한 그룹을 검색해오고, 권한 그룹에 따라 메뉴항목을 enable, disable하는 형태로 이루어 졌습니다.

    1. 첫번째 문제는 메뉴클릭후 폼안의 내용을 조회하는것은 권한그룹에 해당하는 유저 모두 할 수 있으나, 특정 user에 대해서만 DB에 자료를 insert delete update할 수 있도록 해야 하는 경우가 발생합니다. 말씀하신대로 권한이 없는 user에 대해 disable할 수 있으나, 폼에서 기록하는 절차를 위해 disable 상태에서 다른 버튼이 클릭되는 등의 절차가 이루어지면 enable하는 형태가 있습니다. 이경우때문에 enable 대신 메시지를 사용하고 있습니다.

    2. 이렇게 여러 폼과 여러 버튼에 코딩상에서 권한이 체크되고 제어되면, 권한변경시 해당 코드를 일일이 찾아가서 다시 고쳐줘야 합니다.
    현재 유저 관리 테이블에서 권한 그룹을 변경하면 해당 권한이 수정되는 것이 원칙이나, 하드코딩된 부분을 찾아가서 고쳐야합니다.
    권한 관리자와 개발자는 분리되어 있고, 권한변경요청서와 프로그램 변경서 또한 다르고 결재라인도 다릅니다.
    권한변경요청서가 오면, 해당 권한그룹과 동시에 하드코딩을 체크하고, 개발자에게 도움을 요청해야합니다.

    3. 매년 권한관리자는 해당 유저의 권한을 검토하고, 적절히 부여되어 있는지 보고를 해야 합니다.
    그동안 개발자에 의해 변경된 코드를 일일이 따라가서 검토를 해야하는데, 이런경우 상당히 불편합니다.

    그래서 이번에 해당 권한관리를 편리하게 하기 위해 프로그램을 수정하려고 위와 같은 아이디어를 내고, 해당 소스 구현에 대한 질문을 드렸습니다.
    윈도우 핸들러를 이용하는 방법은 제게 조금 익숙치 않은 방법이라 공부를 조금 해야 겠네요..^^;;

    도움을 주셔서 감사합니다.