Kori 11월 14일, 2016에 포스트됨 공유하기 11월 14일, 2016에 포스트됨 CodeRage XI의 세션 중 "Developing User Interface Controls for Both VCL and FMX with Bruno Fierens"를 번역했습니다. VCL 및 FMX 애플리케이션에서 사용할 수 있는 커스텀 UI(사용자 인터페이스) 컨트롤을 만들려고 할 때 당면하는 과제와 해결책을 알아본다. 이 세션에서는 VCL과 FMX 프레임워크의 차이 중 커스텀 UI 컨트롤 개발과 관련된 사항들을 설명한다. 그리고 이러한 차이점을 고려하여 단일 소스 코드 기반으로 VCL과 FMX 애플리케이션 모두에 사용할 수 있는 커스텀 UI 컨트롤을 만들 수 있는 추상화 계층인 FNC(프레임워크 중립 컴포넌트)를 소개한다. 데모들 통해 샘플 컨트롤을 차근차근 만드는 과정을 모두 보여준다. 그리고 같은 방식으로 이미 tmssoftware.com에서 제작하여 제공하고 있는 컨트롤들에 대한 개요를 안내한다. 발표자: Bruno Fierens, TMS Software의 Managing director 이 세션의 발표자료, 데모 코드 전체 링크: http://www.tmssoftware.net/public/TMSFNCCustomControls.zip 원본 비디오 (총 57분) 목차 크로스-프레임워크 UI 컨트롤 개요 크로스-프레임워크 UI 컨트롤의 장점 UI 컨트롤 아키텍처 / 모델 UI 컨트롤 환경 VCL 프레임워크와 FMX 프레임워크 간의 차이로 인한 어려움 당면 과제 1: 클래스 계층 당면 과제 2: '동일한' 클래스 이름을 IDE에 동시에 설치하는 문제 당면 과제 3: 프레임워크 사이의 차이점 VCL 프레임워크와 FMX 프레임워크 간의 차이점 상세 프레임워크 간의 차이점 상세: 좌표(coordinate) 체계 프레임워크 간의 차이점 상세: 기본적인 클래스들이 다름 프레임워크 간의 차이점 상세: UI 입력 다루기 프레임워크 간의 차이점 상세: UI 입력 다루기 프레임워크 간의 차이점 상세: UI 그리기(painting) 프레임워크 간의 차이점 상세: UI 캔버스(canvas) 프레임워크 간의 차이점 상세: 목적이 같은데 타입은 다름 프레임워크 간의 차이점 상세: 이미지 파일 유형 지원 FNC (Framework Neutral Components, 프레임워크 중립 컴포넌트 세트) 개요 FNC 기반 요소 개요 FNC 기반 (base) 컨트롤 클래스들 [데모] FNC(프레임워크 중립적인) UI 컨트롤을 직접 만들기 [데모] TMS FNC UI 컴포넌트들 TMS FNC Grid TMS FNC Planner TMS FNC Richeditor TMS FNC Treeview TMS FNC ReponsiveList 자료 링크 Q&A 크로스-프레임워크 UI 컨트롤 개요 크로스-프레임워크 UI 컨트롤의 장점 친숙함: 학습 곡선 없음 서로 다른 프레임워크를 사용하는 프로젝트 간에 (비즈니스 로직 뿐만 아니라) UI 코드도 호환할 수 있음 하나의 견고하고 신뢰할 수 있는 UI 컨트롤 세트를 보유 (서로 다른 구현 여러개를 따로 관리할 필요 없음) VCL, FMX 기본 컨트롤들(TEdit, TListBox, TButton, TLabel, ...)은 코드 인터페이스 수준에서 이미 어느 정도 구현이 같음 UI 컨트롤 아키텍처 / 모델 UI 컨트롤 입력 (키보드, 마우스, 터치, 스크롤, 드래그&드롭) UI 컨트롤 표현 (그리기) UI 컨트롤 데이터-바인딩 UI 컨트롤 환경 델파이와 C++빌더 IDE에 설치되고 개발 화면과 실행 중에 사용가능하며 VCL과 FMX 프레임워크 모두에서 사용 가능함 VCL 프레임워크와 FMX 프레임워크 간의 차이로 인한 어려움 당면 과제 1: 클래스 계층 [VCL] uses Classes, VCL.Controls; TMyControl = class(TCustomControl) [FMX] uses Classes, FMX.Controls; TMyControl = class(TControl) 당면 과제 2: '동일한' 클래스 이름을 IDE에 동시에 설치하는 문제 package VCLPack; requires rtl, vcl; contains VCL.MyControl in 'VCL.MyControl.pas'; end. package FMXPack; requires rtl, fmx; contains FMX.MyControl in 'FMX.MyControl.pas'; end. 컨트롤 유닛 파일이 달라야 함. 동시에 여러 곳에 설치되는 패키지 안에서는 같은 유닛을 사용할 수 없음 (해결할 트릭이 필요함) 당면 과제 3: 프레임워크 사이의 차이점 프레임워크는 운영 체제(OS)을 추상화 해 놓은 것이다 RTL 코드와 프레임워크 코드를 가능한 많이 사용하는 것이 바람직하다 프레임워크는 서로 다른 운영 체제 간의 차이점을 추상화 한다 VCL 프레임워크와 FMX 프레임워크 간의 차이점 상세 프레임워크 간의 차이점 상세: 좌표(coordinate) 체계 [VCL] 정수 기반 좌표 체계 [FMX] 부동 소수점 기반 좌표 체계 FMX는 배율 확대(scaling) 및 회전(rotation) 가능 그리기(painting)과 마우스 다루기에 영향을 줌 프레임워크 간의 차이점 상세: 기본적인 클래스들이 다름 서로 다른 타입들이 많다. 그 중 몇 가지는 성가실 정도로 다르다. [VCL] TFont: color 프로퍼티가 있음 [FMX] TFont: color 프로퍼티가 없음, TFill을 사용해서 텍스트에 색상을 반영함 프레임워크 간의 차이점 상세: UI 입력 다루기 필수적인 키보드 입력과 마우스 입력에 대한 서명(Signature, 파라미터)이 다름 [VCL] procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyPress(var Key: Char); override; procedure KeyUp(var Key: Word; Shift: TShiftState); override; [FMX] procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override; procedure MouseMove(Shift: TShiftState; X, Y: Single); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override; procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override; procedure KeyUp(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override; 프레임워크 간의 차이점 상세: UI 입력 다루기 더 심하게는, [VCL] procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; procedure DragDrop(Source: TObject; X, Y: Integer); override; [FMX] procedure DialogKey(var Key: Word; Shift: TShiftState); override; procedure DragDrop(const Data: TDragObject; const Point: TPointF); override; 프레임워크 간의 차이점 상세: UI 그리기(painting) [VCL] Control.Canvas: TCanvas VCL.Graphics TCanvas = class(TCustomCanvas) [FMX] Control.Canvas: TCanvas FMX.Graphics TCanvas = class abstract(TInterfacedPersistent) 프레임워크 간의 차이점 상세: UI 캔버스(canvas) [VCL] TCanvas는 윈도우에서 GDI를 감싼 래퍼(wrapper)이다 정수 좌표 체계 24bit 색상 공간 + 시스템 색상 TBrush, TPen MoveTo()/LineTo() Rectangle() Polyline(), Polygon() + 더 많은 차이점이 있음 [FMX] TCanvas는 OpenGL, Quartz, GDI+ 등 여러 가지를 하나로 둘러싼 래퍼(wrapper)이다. 부동 소수점 좌표 체계 32bit 색상 공간 + 투명도(opacity) TFill, TStroke DrawLine() FillRect() DrawPolygon() / FillPolygon() + 더 많은 차이점이 있음 프레임워크 간의 차이점 상세: 목적이 같은데 타입은 다름 [VCL] TColor: clRed, clYellow, clGreen, ... Key : VK_F1, VK_DELETE, VK_UP, ... TAlignment : taLeftJustify, taCenter, taRightJustify [FMX] TAlphaColor: claRed, claYellow, claGreen, ... Key : VKF1, VKDELETE, VKUP, ... TTextAlign = (Center, Leading, Trailing); 프레임워크 간의 차이점 상세: 이미지 파일 유형 지원 [VCL] TBitmap: Windows BMP files TPicture: 기반 클래스와 자손 클래스들로 구성됨 TPNGImage, TJPEGIImage, TGIFImage [FMX] TPicture: BMP, GIF, JPEG, PNG를 지원 FNC (Framework Neutral Components, 프레임워크 중립 컴포넌트 세트) 개요 FNC 기반 요소 개요 기반(Base) 클래스들: TTMSFNCCustomControl TTMSFNCCustomScrollControl TTMSFNCCustomComponent 기반(Base) 그래픽 라이브러리: TTMSFNCGraphics FNC 공통(common) 타입들: TTMSFNCGraphics: Canvas TTMSFNCGraphicsStroke: line style, width, color TTMSFNCGraphicsFill: solid, gradient fill TTMSFNCGraphicsFont: font with suppor for text color TTTMSFNCGraphicsColor: gcRed, gcGreen, ... TTMSFNCBitmap: one class covering BMP,JPEG,PNG,IMG support FNC 기반 (base) 컨트롤 클래스들 TTMSFNCCustomControl 클래스와 해당 가상(virtual) 메서드(method)들 protected procedure HandleMouseLeave; virtual; procedure HandleMouseEnter; virtual; procedure HandleMouseDown({%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); virtual; procedure HandleMouseMove({%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); virtual; procedure HandleDblClick({%H-}X, {%H-}Y: Single); virtual; procedure HandleMouseUp({%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); virtual; procedure HandleKeyPress(var {%H-}Key: Char); virtual; procedure HandleKeyDown(var {%H-}Key: Word; {%H-}Shift: TShiftState); virtual; procedure HandleDialogKey(var {%H-}Key: Word; {%H-}Shift: TShiftState); virtual; procedure HandleKeyUp(var {%H-}Key: Word; {%H-}Shift: TShiftState); virtual; procedure HandleMouseWheel({%H-}Shift: TShiftState; {%H-}WheelDelta: Integer; var {%H-}Handled: Boolean); virtual; procedure HandleDragOver(const {%H-}Source: TObject; const {%H-}Point: TPointF; var {%H-}Accept: Boolean); virtual; procedure HandleDragDrop(const {%H-}Source: TObject; const {%H-}Point: TPointF); virtual; procedure Paint; virtual; TTMSFNCCustomScrollControl 클래스는 TTMSFNCCustomControl의 자손이다. protected procedure SetHScrollValue(AValue: Single); virtual; procedure SetVScrollValue(AValue: Single); virtual; function GetHScrollValue: Single; virtual; function GetVScrollValue: Single; virtual; public function HorizontalScrollBar: TScrollBar; function VerticalScrollBar: TScrollBar; [데모] FNC(프레임워크 중립적인) UI 컨트롤을 직접 만들기 사용자 지정 그리기(painting)을 가지는 컨트롤 키보드 입력을 다루는 컨트롤 마우스 입력을 다루는 컨트롤 이미지(PNG)를 사용하는 컨트롤 (시작 위치는 17:11 지점입니다. 이 데모부터 비디오를 보려면 위 이미지를 클릭하세요) [데모] TMS FNC UI 컴포넌트들 TMS FNC Grid (시작 위치는 38:03 지점입니다. 이 데모부터 비디오를 보려면 위 이미지를 클릭하세요) TMS FNC Planner (시작 위치는 40:06 지점입니다. 이 데모부터 비디오를 보려면 위 이미지를 클릭하세요) TMS FNC Richeditor (시작 위치는 41:47 지점입니다. 이 데모부터 비디오를 보려면 위 이미지를 클릭하세요) TMS FNC Treeview (시작 위치는 44:04 지점입니다. 이 데모부터 비디오를 보려면 위 이미지를 클릭하세요) TMS FNC ReponsiveList (시작 위치는 45:31 지점입니다. 이 데모부터 비디오를 보려면 위 이미지를 클릭하세요) 자료 링크 TMS FNC UI Pack: http://www.tmssoftware.com/site/tmsfncuipack.asp 샘플 컨트롤 전체 소스: http://www.tmssoftware.net/public/TMSFNCCUSTOMCONTROLS.ZIP Q&A FNC는 VCL 스타일을 지원하나요? 네, (세미나 발표 시점인 2016년의 최신 버전 기준인 1.6에서) VCL 스타일과 FMX 스타일을 모두 지원합니다. 현재 VCL용으로 제공되는 "TMS 다이아그램 스튜디오"를 FMX용으로도 제공할 계획이 있나요? "TMS 다이아그램 스튜디오"를 FNC 기술로 옮겨서 VCL과 FMX에서 모두 사용할 수 있도록 일원화하는 것을 고려하고 있습니다. 데모에서 보여준 "FNC Planner(플래너)"는 안드로이드에서 작동하나요? 네, 맞습니다. FNC 컨트롤들은 파이어몽키(FMX) 프레임워크에서 지원하는 모든 타겟 플랫폼을 지원합니다. 또한 모바일에서 작동하게 되는지 여부를 탐지하여, 그 경우에는 터치 스트린에서 손가락을 사용하여 조작하기에 더 쉽도록 반응합니다. FNC 다운로드 링크는 어디에 있나요? http://www.tmssoftware.com/site/tmsfncuipack.asp FNC RichEditor가 HTML을 지원하나요? FNC RichEditor는 HTML 가져오기/내보내기를 지원합니다. 물론 HTML을 다루는 기능 자체는 RAD 스튜디오 자체의 RichEditor 기능입니다. 그 기능은 마이크로소프트의 워드패드의 일종이라고 생각하면 됩니다. 예를 들어 MS 워드패드에서 HTML을 읽어왔을 때 워드패드에서 처리하지 못하는 것이 있다면 FNC RichEditor 역시 그런 것들을 무시하게 됩니다. 하기만 그 외에 모든 것들 폰트, 색상, 하이퍼링크, 이미지 등등은 HTML을 파싱(parsing)하여 RichEditor로 가져옵니다. FNC UIPack을 구입하면 데모에서 보여준 것처럼 사용자 지정(custom) 컨트롤을 FNC 프레임워크 기반으로 만드는 것이 가능한가요? 네. 물론입니다. 데모에서 트랙바를 직접 만드는 것을 보여주었는데, FNC를 설치하고 나서 똑같은 방법으로 하면 됩니다. TMS FNC Custom Control을 상속받고, (TCanvas와 호환되는) TMS FNC Graphics 를 사용하고, 마우스나 키보드에 반응할 수 있는 메서드들을 사용하면 됩니다. FNC 프레임워크를 기반으로 새 컴포넌트를 만들어서 외부에 재배포할 수 있나요? 관련 라이선스는 어떻게 되어 있나요? 현재 핵심 모듈인 프레임워크 중립 레이어는 재배포 대상이 아닙니다. 만약 새 컴포넌트를 만들어서 외부에 재배포하는데 관심이 있는 사용자가 있다면 그 수요를 검토한 후 정책 변경을 고려해 볼 수 있습니다. 관심이 있다면 저(Bruno Fierens)에게 이메일을 보내주세요. 현재 우리는 우리의 컴포넌트들 중에서 가장 많이 사용되는 것들을 이 새 프레임워크로 옮기는 것에 주력하고 있습니다. 따라서 이런 결정에는 사용자들이 원하는 방향과 기능 요구가 가장 중요합니다. 의견이나 질문이 있으면 언제든지 이메일을 보내주세요. 튜토리얼 도움말이 TMS FNC UIPack 홈페이지에 있나요? 우리 매뉴얼 페이지에서 PDF로 다운로드 받을 수 있습니다. 또한, TMS FNC UIPack을 설치하면, 관련된 모든 PDF 가이드 문서들도 함께 설치됩니다. PDF 가이드에는 광범위한 전체 정보가 들어 있습니다. 이 컴포넌트들의 기능 대부분을 반영하는 50 가지가 넘는 데모가 VCL과 FMX 용으로 들어 있습니다. (안드로이드, iOS를 포함하여) 멀티-플랫폼 용으로 컴포넌트를 디자인할 때 어떻게 하면 되는지 데모가 있나요? 오늘 보여준 데모는 안드로이드와 iOS에서 모두 작동합니다. 이 세션에서 사용된 모든 데모의 소스 코드와 PDF 문서와 발표 자료를 모두 받을 수 있습니다. 이 프레임워크를 사용하여 만들고 싶은 UI 컨트롤이 있다면 참고하기 바랍니다. View full 엠바카데로 기술자료 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.