버튼 만들고 클릭 이벤트에 뭔가를 한다고 칩시다.. 간단하게 버튼의 캡션을 바꾸자구요..
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. 역시 쓰다보니 글이 중구난방이네요. .양해를..
|
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=&keyword=&indx=401411&keyword1=&keyword2=&page=2
이글은 자유게시판보다 팁게시판이 맞을것 같은데요...