[후기] RAD Studio XE3.5 - Delphi for iOS

2013.03.08 13:04

3월 8일 데브기어가 주관하는 델파이 세미나가 진행되었습니다.


주요 주제는 Delphi for iOS(with Firemonkey)였습니다.


Firemonkey란?


하나의 델파이(또는 C++) 소스로 Win32, Win64, OSX(MacOS), iOS, Android(준비 중)에서 실행 가능한 어플리케이션을 개발 할 수 있는 Native Compiler 프레임웍입니다.


세미나 내용이 궁금하신 분들이 계실 것 같아 기록합니다.

개인적으로 생각나는 부분만 적으니 내용이 다소 다를 수도 있습니다.


발표자는

옆집 아저씨같은 푸근한 인상의 고든 리(Gordon Li)님이 진행하셨구요.

고드 리는 엠바카데로 중국, 대만, 아세안 지역의 수석 에반젤리스트로 활동 중이라고 합니다.



여러 주제의 세션이 있었지만 시간에 얽매이지 않고 흐름에 맞게 진행되어 괜찮았지요.


생각나는 내용만 간단하게 적어보겠습니다.




| 첫번째 주제는 "멀티 디바이스"


  • 태블릿과 노트북 중 태블릿 비율이 50%를 넘어가는 시기(2013년)
  • 전문가들은 2012년 초에는 2016년으로 예상, 2012년 중후반에는 2015년으로 예상
  • 하지만 2013년 1월에는 올해(2013년)이 50%이상을 태블릿이 점유할 것으로 예상

  • 향후 새로운 스마트 기기(iWatch, Start TV..)가 빠른 속도로 추가됨이 예상
  • 다른 언어와 다르게 파이어몽키는 
    One Source, Multi platform, Multi device 개발 가능
  • 네이티브 개발 만이 사용자의 빠른 반응 속도로 좋은 UX 제공 가능

  • 현재 Mobile Studio는 Beta 테스트 중 (XE3.5 Beta 9)
  • 올 하반기 XE4 발표 예상
  • Android 버전은 개발완료 테스트 중




| 샘플시연


  • Stylelookup으로 아이폰에 맞는 UI를 Properties에서 변경 후 iOS Emulator 및 iPhone에서 실행
  • Standard Action으로 플랫폼의 특화 기능(사진찍기, 사진불러오기, 공유 등)을 사용
  • 사진찍기, 사진불러오기 및 애니메이션, Effect 시연
  • REST API와 JSON을 통해 데이터 수신 후 WebBrowser에 구글맵 출력
  • TabControl 및 ListBox등 아이폰 친화 UI 구현
  • 보통 대만에서 시연하면 박수와 함성이 터지는데 한국사람은 자기를 싫어하는 것 같다며 호응 유도
  • 샘플의 기능을 XCode 6년차 개발자와 누가 먼저 만드는지 내기
  • Firemonkey 하루, XCode 약 2주 걸렸다 함
  • 단편적인 비교인 듯, 반대의 경우(XCode 개발하기 쉬운 기능을 Firemonkey로 쉽게 개발 할 수 있을까?)는 어떨까 생각해 봄

| 차세대 컴파일러


    • LLVM 차세대 컴파일러 명 = NextGen
      • Classic compiler : Win32, Win64, OSX, iOS Emulator
      • NextGen compiler : iOS, Android


    • 향후 Classic compiler 영역도 차츰 NextGen으로 교체 예정
    • C++ Builder 64bit에서 2~10배의 성능을 확인 함
    • LLVM의 가비지콜렉션에 의한 제한이 있음
      • Pointer 사용을 제한할 것
      • Static array 대신 Dynamic array를 사용할 것
      • With문을 없앨 것

    | 기타


      • 파이어몽키 관련 도서를 데브기어에서 번역 중
      • 번역 완료 후 이북형태로 무료 배표 예정
      • (Q&A)애플과 계약된 PAS Bridge(?)로 PAServer가 막힐 일은 없을 것으로 예상
      • (Q&A)앱의 속도는 Native API를 직접 호출 하므로 XCode로 작성하는 것과 비슷할 것이라 함

      | 총평


        엠바카데로에서 파이어몽키에 사할을 거는 듯한 느낌입니다. 
        초반에 고든 리가 어찌나 파이어몽키가 좋다고 자랑을 하기도 하고, David I의 31일 비디오(http://tech.devgear.co.kr/11735)를 봐도 이전과는 다른 엠바카데로의 모습인 것 같습니다.

        기능적인 부분에서는 
        기본적으로 캡슐화 되어 제공되는 플랫폼의 특화 기능이 참 편리하고 좋을 듯하지만, 그 기능 이외의 작업을 추가해야 할 경우 대부분의 개발자는 멘붕이 올듯 함(기본지식이 없이 제공해주는 것만 사용하므로 기본기능 제어가 힘들 듯)

        마지막으로
        개발 업체들을 얼마나 파이어몽키로 끌어 올 수 있는가가 성공의 관건일 듯 합니다.
        저는 개인적으로 그리 낙관적이지 않다고 생각합니다.
        긴시간 델파이의 VCL에 익숙해진 개발자(특히 SI 업체)와 업체들이 문법만 같은 새로운 프레임웍을 자발적으로 사용할지 의문이네요.
        차라리 요즘 추세와 같이 오픈소스 개발자나 개인 개발자들을 독려하여 흥미를 유발시켜,
        레퍼런스나 참고자료가 어느정도 쌓여야만 업체나 기존 개발자들도 관심을 갖고 들여다 보지 않을까 생각합니다.

        그러기 위해서는 라이센스 정책도 좀 더 유연하게(예를 들면 저렴한 개인 라이센스 등: Starter Edition처럼 기능 다 막아놓은것 말고) 델파이 빠들에 프렌들리하게 다가가야 하지 않을까 개인적으로 생각하며 마칩니다.


        저작자 표시 비영리 동일 조건 변경 허락
        신고

        험프리.김현수 교육, 세미나 Delphi, Delphi for iOS, Firemonkey, ios개발, NextGen, Rad Studio, XE3.5, 파이어몽키

        1. Blog Icon
          O*X

          수고하셨습니다.^^
          세미나 내용이 궁금했는데 이렇게 정리 한 글 보니 도움이 많이 돼네요. ㅎ
          국내에는 업체들의 개발 플랫폼이 델파이7에 고착되어 유지 보수의 성향이 심하다 보니,
          Delphi IDE 변화나 플랫폼 업그레이드 변화에 따른 대응이나 실험적인 측면이 더딘 감이 많은것 같네요. 저희 회사도 마찬가지로 델파이7에서 현재는 XE2로 컨버전 작업이 조금씩은 이루어 지고 있답니다.

          아무쪼록 Delphi가 국내 환경에서 관심을 많이 받았으면 하는 바램이랍니다.

          앞으로도 좋은 글 부탁드려요~

        2. 감사합니다. 생각보다 많은 분들이 관심을 갖어 주셔서. 글을 쓴 보람을 느끼네요.

          앞으로도 파이어몽키, 델파이 관련 글들 꾸준히 남길테니 관심 부탁드립니다. 감사합니다.^^

        3. 데브기어에서 제공하는 파이어몽키 이북 링크 입니다.
          http://bit.ly/VNzUQL

        [FM2] XE3.FM2에서 Control을 Bitmap으로 내보내기 및 Bitmap.Pixels 사용하기

        2012.10.04 20:49

        Firemonkey2로 버전업 된 후로 참 많은 것이 변했습니다.


        TControl은 말할 것도 없고 TBitmap도 많은 내용이 변했네요.


        Unit test에서 특정 Pixel의 색상을 얻어오고자 할때 기존 Bitmap.Pixels이 없어진 것을 확인 후 깜짝 놀랐습니다.


        자... 그럼 제가 삽질로 얻어온 내용을 공유하도록 합니다.


        | Control을 Bitmap(TImage)으로 내보내기

        var
          Bitmap: TBitmap;
          Map: TBitmapData;
        begin
          Bitmap :=  TBitmap.Create(Round(Panel1.Width), Round(Panel1.Height));
          try
            Bitmap.Canvas.BeginScene;
        
            // Bitmap으로 내보내기
            Bitmap.Assign(Panel1.MakeScreenshot);
         
            // Pixel의 값을 원하실 때는 이렇게
            Bitmap.Map(TMapAccess.maRead, Map);
            //AlphaColor := Map.GetPixel(Round(X), Round(Y));
            Bitmap.Unmap(Map);
            Bitmap.Canvas.EndScene;
        
            Image1.Bitmap.Assign(Bitmap);
          finally
            Bitmap.Free;
          end;
        end;
        


        Panel1의 화면을 Bitmap으로 내보내는 코드 입니다.

        특정 좌표의 값은 Map.GetPixel로 얻어오실 수 있구요 반환은 TAlphaColor 입니다.


        TBitmapData라는 구조체를 이용하는군요 구글링에도 없는 따끈한 정보입니다. 실은 많이 안찾아 봣습니다. -_-;

        저작자 표시 비영리 동일 조건 변경 허락
        신고

        험프리.김현수 파이어몽키 Bitmap.Pixels, Delphi, Fm2, FMX, TBitmapData, XE3, 태그를 입력해 주세요.

        델파이 구조체(record) 사용 팁

        2012.01.31 10:37

        구조체(Record) 많이 사용하시죠?

        생각보다 구조체를 사용하는 방법이 다양해서 소개하려 합니다.

        우선 간단한 샘플
        연/월/일 형식으로 데이터 입력 후 한번에 데이터 저장하는 코드입니다. 

        type
          TRecordType = (rtData, rtStructure);
        
          TDateRec = record
            case TRecordType of
            rtData:       (Data: array[0..5] of Byte);
            rtStructure:  (Year, Month, Day: Word);
          end;
        
        위와 같이 구조체가 정의 되어 있습니다.

        2가지 타입(rtData, rtStructure)로 사용해 봅니다.
         
        | rtStructure - 연월일 형식으로 입력
        procedure TForm2.btnAddClick(Sender: TObject);
        var
          Rec: TDateRec;
        begin
          DecodeDate(dtpDate.Date, Rec.Year, Rec.Month, Rec.Day);
        
          AddDate(Rec);
        end;

        | rtData - 데이터 형식으로 저장
        procedure TForm2.AddDate(ADate: TDateRec);
        var
          FilePath: string;
          FS: TFileStream;
        begin
          FilePath := ExtractFilePath(Application.ExeName) + 'test.dat';
        
          FS := TFileStream.Create(FilePath, IfThen(FileExists(FilePath), fmOpenReadWrite, fmCreate));
          try
            FS.Position := FS.Size;
            FS.Write(ADate.Data, SizeOf(ADate.Data));
          finally
            FS.Free;
          end;
        end;

         위의 2가지 코드대로 하나의 구조체를 다양한 방식으로 사용가능합니다.
        TRecordType 은 제가 임의로 2개를 정의한 것이므로, 여러개로 나누어 사용하여도 됩니다.
        또한, 굳이 위 구조체가 아니어도 아래와 같은 코드로도 사용 가능합니다.

        | Messages.pas의 window message record 
          TMessage = packed record
            Msg: Cardinal;
            case Integer of
              0: (
                WParam: WPARAM;
                LParam: LPARAM;
                Result: LRESULT);
              1: (
                WParamLo: Word;
                WParamHi: Word;
                LParamLo: Word;
                LParamHi: Word;
                ResultLo: Word;
                ResultHi: Word);
          end;
        
        끝~
        신고

        험프리.김현수 Delphi/C++Builder Delphi, Packed record, Record

        2GB 이상 파일크기 구하는 함수

        2011.12.19 10:51
        function FileSize(const AFileName: string): Int64;
        var
          srData: TSearchRec;
          FileData: DWORD;
          SizeHigh, SizeLow: Integer;
          RetVal: array[0..7] of Byte;
        begin  Result := -1;
        {$IFDEF MSWINDOWS}
          FileData := FindFirst(AFileName, faReadOnly, srData);
          if FileData <> 0 then
            Exit;
        
          SizeHigh := srData.FindData.nFileSizeHigh;
          SizeLow  := srData.FindData.nFileSizeLow;
          ZeroMemory(@RetVal[0], SizeOf(RetVal));
          Move(SizeLow, RetVal[0], 4);
          Move(SizeHigh, RetVal[4], 4);
          Move(RetVal[0], Result, 8);
        {$ENDIF}
        end;
        
        신고

        험프리.김현수 Delphi/C++Builder Delphi, 델파이, 파일사이즈

        [Delphi] Wild Card 문자비교

        2010.03.23 12:33
        문자열에서 Wild Card('?': single character, '*': multi character)를 포함하여 비교한다.
        function MatchString(ASource, APattern: String): Boolean;
          function _MatchPattern(element, pattern: PChar): Boolean;
          begin
            if 0 = StrComp(pattern, '*') then
              Result := True
            else if (element^ = Chr(0)) and (pattern^ <> Chr(0)) then
              Result := False
            else if element^ = Chr(0) then
              Result := True
            else
            begin
              case pattern^ of
              '*': if _MatchPattern(element, @pattern[1]) then
                     Result := True
                   else
                     Result := _MatchPattern(@element[1],pattern);
              '?': Result := _MatchPattern(@element[1],@pattern[1]);
              else
                if element^ = pattern^ then
                  Result := _MatchPattern(@element[1],@pattern[1])
                else
                  Result := False;
              end;
            end;
          end;
        var
          pSource, pPattern: PChar;
        begin
          pSource   := StrAlloc(Length(ASource)+1);
          pPattern  := StrAlloc(Length(APattern)+1);
          try
            StrPCopy(pSource,   ASource);
            StrPCopy(pPattern,  APattern);
        
            Result := _MatchPattern(pSource, pPattern);
          finally
            StrDispose(pSource);
            StrDispose(pPattern);
          end;
        end;
        
        출처 : 인터넷 어딘가...:-)
        // sample
        var 
          source: string;
          target: string;
        begin
          source := 'abcdefg';
          target := 'ab*e?g';  // correct('cd' = '*', 'f' = '?')
        
          if MatchString(source, target) then  
            ShowMessage('Correct match')
          else 
            ShowMessage('Incorrect match')
          ;
        end;
        
        신고

        험프리.김현수 Delphi/C++Builder Delphi, 델파이, 문자비교