C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[14356] sender 파라미터와 with statement 그리고 absolute 변수
DrK [whitekid] 3341 읽음    2008-05-08 11:35
버튼 만들고 클릭 이벤트에 뭔가를 한다고 칩시다.. 간단하게 버튼의 캡션을 바꾸자구요..

procedure Form1.Button1Click(Sender: TObject)
begin
    Button1.Caption := '하이';
end;

자 대부분 위의 코드처럼 할겁니다. 아닌사람?.. 에이 우선 쉽게 가자구요... 그런데 Sender라는 파라미터를 이용하는게 보다 더 그럴듯 하게 보입니다.

procedure Form1.Button1Click(Sender: TObject)
begin
   (Sender as TButton).Caption := '하이';
end;

자 이렇게 되면 Button의 이름을 바꿨을 때도 코드를 변경하지 않아도 되고.. 또한 특정한 하나의 콤포넌트에 구속되지 않으니 다른 여러 버튼 이벤트에 연결해서 사용도 가능합니다. 근데.. 보통 이렇게 한줄인 경우는 없지요. 하다보면 좀 많아지지요..

procedure Form1.Button1Click(Sender: TObject)
begin
   with Sender as TButton do
    begin
        Caption := '하이';
        Default := True;
        ModalResult := mrOK;
        Cursor := crCross;
    end;
end;

음.. 여러줄 쓰면.. with로 쓰면 괜찮군요... 그런데. .여기서 with 문의 문제가 나옵니다. with가 참 편하긴한데 with 문이 길어지게 되면 이게 참 코드읽기가 힘들어집니다. 한페이지를 넘어가는 with.. 충분히 가능하지요.. 게다가 with에는 여러개를 동시에 지정할 수 있으니...

  with Sender as TButton, Form1, Form2 do
  begin
       bla bla ...
  end

음.. 이런 경우까지 되어버리면 참 뭐랄까.. 점점 접입가경 잘못하면 with 안의 변수가 어느 소속인지 헷갈리는 상황이 올 수도 있습니다... 컴파일러는 잘 이해하는데.. 사람은 이런 방면에 느릴수 있지요...

with에 변수이름 alias하는 기능이 있으면 얼마나좋을까?.. 마치 SQL 의 Table 이름 별명붙이기 처럼 말이지요..

  with Sender as TButton alias Button do ...
       Button.Caption := '하이'

좀 길어지기는 하지만... 그런데로 괜찮은거 같고.. 어렵풋이 어떤 언어에서는 저런식으로 쓴것 같기도 하네요.. 하지만 기억이 안나니깐 패스..

이러다 생각난게 어디선가 들었던 absolute 변수 였습니다. 오호.. 한번 해볼까?

procedure Form1.Button1Click(Sender: TObject)
var
    Button: TButton absolute Sender;
    Form: TForm absolute Form1;
begin
   Button.Caption := '하이';
   Button.Default := True;
   Button.ModalResult := mrOK;
   Button.Cursor := crCross;
   Form.Caption := '음냐..';
end;

with로 인한 헷갈릴 가능성은 줄었는데... 적고보니 별 실효성이 없어 보이네요... ^^; 그리고 결정적으로 absolute가 변수 공간을 공유하는 것이라 만일 Sender가 TButton 타입이 아닐 경우에는 논리적인 오류를 만들어 낼 소지가 다분히 많네요(as로 할 경우는 invalid class typecast 에러가 나는데 비해서).

위의 코드에서 Form: Form absolute sender; 로 바꾸고 Form.FormStyle := fsStayOnTop 으로 변경해도 에러가 안나는군요.. 제게 모르는 어딘가를 바꿔버렸을듯.. 어딘지는 델파이만 알겠죠. ^^

RTL/VCL Source를 뒤져봤더니 파라미터로 넘어온 class를 absolute로 사용한 경우는 없군요..
absolute의 사용 자체가 별로 없긴 하지만 그래도 class 변수를 absolute를 사용하는건.. 자제해야겠네요.. 필요할때는 변수 만들어서 as 로 typecast해서 사용해야겠습니다.

function CreateNTPassword(APassword, nonce: String): String;
Var
  nt_pw: String;
  nt_hpw: array [1..21] of Char;
  nt_hpw128: T4x4LongWordRecord absolute nt_hpw;

function CmpWord(var item1, item2): Integer;
var
  w1: word absolute item1;
  w2: word absolute item2;

이렇게 명시적으로 type casting 해야할 것을 absolute로 대신하는 형태로 사용하네요. 그렇군요. typecast하게되면 괄호가 많이 들어가 소스가 지저분해지니 저런 방법으로 사용하면 깔끔해지겠군요.

PS. 역시 쓰다보니 글이 중구난방이네요. .양해를..
장성호 [nasilso]   2008-05-08 14:13 X
얼마전에 델마당에 양병규님이 팁게시판에 올린것과 같은 내용이네요
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=&keyword=&indx=401411&keyword1=&keyword2=&page=2

이글은 자유게시판보다 팁게시판이 맞을것 같은데요...
이정구 [appleii]   2008-05-08 23:06 X
absolute 는 잘 안쓰는 것 같더군요. 몇군데 돌아다녀 봐도 안 쓰는 것을 권장하는 분위기인것 같기도 하고...

+ -

관련 글 리스트
14356 sender 파라미터와 with statement 그리고 absolute 변수 DrK 3341 2008/05/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.