E2268 Call to undefined function 'Assigned'
Debugging Note/FireMonkey [C++ Builder] 2014. 12. 23. 20:03RadStudio의 FireMonkey를 사용하여 안드로이드 어플리케이션을 개발하려고 학습 중에 Delphi 예제("나의 도서관 앱" 개발 따라하기 - (1) 사용자화면 만들기와 기능 구현하기)를 C++ Builder로 옴기는 뻘짓을 하는 중에 발생할 애러이다.
발생 애러
[bcc32 Error] MainForm.cpp(134): E2268 Call to undefined function 'Assigned'
Full parser context
MainForm.cpp(127): parsing: void TForm1::UpdateKBBounds()
원본 소스 (Delphi)
procedure TForm1.UpdateKBBounds;
var
LFocused : TControl;
LFocusRect: TRectF;
begin
FNeedOffset := False;
if Assigned(Focused) then
begin
LFocused := TControl(Focused.GetObject);
LFocusRect := LFocused.AbsoluteRect;
LFocusRect.Offset(vsbEditFocus.ViewportPosition);
if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and
(LFocusRect.Bottom > FKBBounds.Top) then
begin
FNeedOffset := True;
lytContentsNew.Align := TAlignLayout.Horizontal;
vsbEditFocus.RealignContent;
Application.ProcessMessages;
vsbEditFocus.ViewportPosition := PointF(vsbEditFocus.ViewportPosition.X,
LFocusRect.Bottom - FKBBounds.Top);
end;
end;
if not FNeedOffset then
RestorePosition;
end;
애러 발생 지점 (C++ Builder)
void TForm1::UpdateKBBounds(void)
{
TControl *LFocused;
TRectF LFocusRect;
FNeedOffset = false;
if( Assigned(Focused) )
{
LFocused = (TControl*)(IControl*)Focused;
LFocusRect = LFocused->AbsoluteRect;
LFocusRect.Offset( vsbEditFocus->ViewportPosition.X, vsbEditFocus->ViewportPosition.Y );
if( ( LFocusRect.IntersectsWith( (const TRectF &)FKBBounds ) )
&& ( LFocusRect.Bottom > FKBBounds->Top ) )
{
FNeedOffset = true;
lytContentsNew->Align = TAlignLayout::Horizontal;
vsbEditFocus->RealignContent();
Application->ProcessMessages();
vsbEditFocus->ViewportPosition = PointF( vsbEditFocus->ViewportPosition.X ,
LFocusRect.Bottom - FKBBounds->Top );
}
}
else if( FNeedOffset )
{
RestorePosition();
}
}
문제 해결 (C++ Builder)
void TForm1::UpdateKBBounds(void)
{
TControl *LFocused;
TRectF LFocusRect;
FNeedOffset = false;
if( Focused )
{
LFocused = (TControl*)(IControl*)Focused;
LFocusRect = LFocused->AbsoluteRect;
LFocusRect.Offset( vsbEditFocus->ViewportPosition.X, vsbEditFocus->ViewportPosition.Y );
if( ( LFocusRect.IntersectsWith( (const TRectF &)FKBBounds ) )
&& ( LFocusRect.Bottom > FKBBounds->Top ) )
{
FNeedOffset = true;
lytContentsNew->Align = TAlignLayout::Horizontal;
vsbEditFocus->RealignContent();
Application->ProcessMessages();
vsbEditFocus->ViewportPosition = PointF( vsbEditFocus->ViewportPosition.X ,
LFocusRect.Bottom - FKBBounds->Top );
}
}
else if( FNeedOffset )
{
RestorePosition();
}
}
개인적인 정리
Assigned 자체는 http://docwiki.embarcadero.com/Libraries/XE7/en/System.Assigned 를 읽어보면, Delphi에서만 지원하기 때문에 undefined function 이 발생하는 것으로 보인다. 그리고 하단의 설명을 더 읽어 보면 "function Assigned(var P): Boolean;", "Tests for a nil (unassigned) pointer or procedural variable."라는 문장을 봐선 결국 var P이 제대로 할당되어 있는지를 파악하는 것으로 판단했다. 따라서 Focused가 제대로 할당 되었는지만 보면 되기 때문에 Assigned를 지우고 Focused의 주소값을 바로 비교 할 수 있도록 하였다.
참고 사이트