일단 제가 이해하고 있는 부분에 대해서 is와 as 문의 기능은 알겠네요..
하지만 이해 안되는 부분이 있어서요..
Memo 컨트롤 2개와 Panel 컨트롤 한개를 이용해서 Split 형태의 컨트롤을 만들던중에 발생했는데요..
위의 세개 컨트롤을 선택한후 DragOver 이벤트에 대한 코딩을 하는중에 모르는 부분이 있어서요..
procedure TForm3.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := false;
if Source = Panel1 then
begin
Accept := True;
Memo1.Width := x + (Sender as TControl).Left; // 왜 Sender를 TControl 형태로 변경해야만 하는가?
end;
end;
위의 소스에서 주석으로 처리된 부분에 대해 잘 모르겠어요..
TObject형의 Sender를 TPanel 형으로 변환하여 해보고 또는 Panel1.left를 그데로 사용했는데 모두 Left 속성이 존재했거덩여..
하지만 TControl의 경우만 잘 동작하고 나머지 TPanel형의 경우에는 에러가, Panel1.Left를 사용할경우는 오작동을 하였습니다..
어떤문제때문인지 모르겠어요 ..
각 클래스의 특성에 대해 잘 알아야 하면 문제는 해결될듯한데..
너무 광범위하고 도움말 자체가 영어라서 좀 힘드네요 ^^;;
꼭좀 부탁드립니다.. 알려주시옵소서....................
답변도 너무 광범위한 부분이라 어떻게 설명을 드려야할지 모르겠네요.
간단하게 아는 부분까지만 설명을 드리자면,
Memo1.Width := x + (Sender as TControl).Left; //
왜 TControl만을 넣어야 돼냐면,
화면에 나타나는 컴포넌트들(Left 속성을 갖는)은 기본적으로 TControl에서 상속 받습니다. TObject인 경우에는 Left 속성이 없기 때문에 안돼겠죠.
그럼, 왜 TPanel로 하면 안됄까요? 그건, 마우스가 드래그 될때, 마우스가 지나가는 컨트롤이 꼭 TPanel만이 아니기 때문에, 그 때 형변환시 오류가 발생하겠죠. 그래서, 화면에 나타나는 모든 컨트롤을 대표해서 받을 수 있는 TControl로 형변환을 해서 원하는 좌표를 구하죠.
상속에 보면 이런 유사한 예가 많이 있습니다.
상속에 관련된 책을 좀더 살펴보시는 것이 좋을것 같습니다.