RadStudio의 FireMonkey를 사용하여 안드로이드 어플리케이션을 개발하려고 학습 중에 Delphi 예제("나의 도서관 앱" 개발 따라하기 - (1) 사용자화면 만들기와 기능 구현하기)를 C++ Builder로 옴기는 뻘짓을 하는 중에 발생할 애러이다.




발생 애러

[bcc32 Error] MainForm.cpp(172): E2336 Pointer to overloaded function 'TRectF::TopLeft' doesn't match 'const TPointF &'

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(172): E2064 Cannot initialize 'const TPointF &' with 'undefined'

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(172): E2342 Type mismatch in parameter 'Point' (wanted 'const TPointF &', got 'void')

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(172): E2235 Member function must be called or its address taken

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(173): E2336 Pointer to overloaded function 'TRectF::BottomRight' doesn't match 'const TPointF &'

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(173): E2064 Cannot initialize 'const TPointF &' with 'undefined'

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(173): E2342 Type mismatch in parameter 'Point' (wanted 'const TPointF &', got 'void')

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)

[bcc32 Error] MainForm.cpp(173): E2235 Member function must be called or its address taken

  Full parser context

    MainForm.cpp(166): parsing: void _fastcall TForm1::FormVirtualKeyboardShown(TObject *,bool,const TRect &)




원본 소스 (Delphi)

procedure TForm1.FormVirtualKeyboardShown(Sender: TObject;

  KeyboardVisible: Boolean; const Bounds: TRect);

begin

  FKBBounds := TRectF.Create(Bounds);

  FKBBounds.TopLeft := ScreenToClient(FKBBounds.TopLeft);

  FKBBounds.BottomRight := ScreenToClient(FKBBounds.BottomRight);

  UpdateKBBounds;

end;




애러 발생 지점 (C++ Builder)

void __fastcall TForm1::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,

  const TRect &Bounds)

{

    FKBBounds = (TRectF*)&Bounds;

    FKBBounds->TopLeft =  ScreenToClient( FKBBounds->TopLeft );

    FKBBounds->BottomRight =  ScreenToClient( FKBBounds->BottomRight );


    UpdateKBBounds();

}




문제 해결 (C++ Builder)

void __fastcall TForm1::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,

  const TRect &Bounds)

{

    FKBBounds = (TRectF*)&Bounds;


    FKBBounds->TopLeft() =  ScreenToClient( FKBBounds->TopLeft() );

    FKBBounds->BottomRight() =  ScreenToClient( FKBBounds->BottomRight() );


    UpdateKBBounds();

}




개인적인 정리

그동안 함수포인터를 잘 사용해보지 않았던 관계로 잘못 옴겨서 발생한 error 같다. 우선 ScreenToClient를 살펴보면 http://docwiki.embarcadero.com/Libraries/XE7/en/FMX.Forms.TCommonCustomForm.ScreenToClient 에서 알수 있듯이 parameter 자체가 주소 참조, 반환은 value로 하는 것을 알 수 있다. 일단 그동안 함수의 주소를 넘기기 위해선 func 로 해야 하는 줄 알았기 때문에(실제로 C에선 parameter 부분( "()" )을 안 붙인다. 참고) "FKBBounds.TopLeft"로 작성을 하였으나, TopLeft() 자체가 TPointF의 포인터 반환이다보니 함수 자체의 완전체인 ()를 붙여야 했다.(그런데 그동안 알고 있기론 포인터 반환이어도 parameter는 생각 가능한 것으로 알고 있었다.) 그리고 함수 자체의 반환이 포인터이다 보니 이를 넘겨 받을 때도 동일하게 parameter 를 명시해 줬다.




참고 사이트

http://blog.hjf.pe.kr/255

http://docwiki.embarcadero.com/Libraries/XE7/en/Main_Page

http://shinluckyarchive.tistory.com/206




Posted by klisty
,