Search results for '파이어몽키'

  1. 2015.06.04 -- 앱의 상태바(StatusBar) 제어하기(색상변경, 감추기, 투명하게)
  2. 2015.06.04 -- [XE8] 스피드버튼의 이미지를 크게 표시할 수 있습니다.
  3. 2015.05.18 -- [JVESoft] 광고와 결재 컴포넌트(AdMob, Paypal 등)
  4. 2015.05.18 -- [iOS] 배포파일 아이클라우드 백업 옵션설정하기
  5. 2015.04.14 -- 파이어몽키에서 외부 라이브러리 연동하기(jar, so, a) (3)
  6. 2015.03.04 -- [FMX] ListBox 전체체크 기능 구현하기
  7. 2015.02.24 -- [XE7] iOS 시뮬레이터 배포 시 'Please specify exact device preset UUID.' 오류 대응
  8. 2015.02.23 -- 파이어몽키 용 그리드 컴포넌트 안내 - FirePower
  9. 2015.02.12 -- [XE7] 안드로이드 블루투스 활성화 조회와 설정하기
  10. 2015.02.11 -- [XE7] 안드로이드 WiFi 상태조회와 설정하기
  11. 2015.02.09 -- 태블릿용 멀티컬럼 리스트뷰 ItemAppearace 만들기 (6)
  12. 2015.01.28 -- 트루타입 폰트(FontAwesome) 파일을 이용해 아이콘 표시하기(안드로이드, iOS)
  13. 2015.01.23 -- [XE7] 안드로이드 L 스타일팩 다운로드
  14. 2015.01.13 -- 안드로이드에 설치된 앱 목록(AppList)을 표시하는 앱(소스코드 공개)
  15. 2015.01.07 -- [XE7] 안드로이드 4.4 스타일의 대화상자 사용하기
  16. 2014.12.22 -- 커스텀 폰트 배포와 사용하기(Android/iOS)
  17. 2014.12.03 -- [XE5~XE7] FGX 컴포넌트 소개(오픈소스) - ProgressDialog, LinkedLabel 등
  18. 2014.12.03 -- 안드로이드 5.0(Lollipop)에서 실행 시 오류대응 방법
  19. 2014.12.03 -- [XE7] 자체적으로 원격푸쉬알림(GCM, APN) 전송 구현방법 (8)
  20. 2014.12.01 -- 파이어몽키 안드로이드 네이티브 컴포넌트(오픈소스) - DPF

앱의 상태바(StatusBar) 제어하기(색상변경, 감추기, 투명하게)

2015.06.04 11:08

iOS 상태바 제어하기

iOS 앱의 상태바 색상을 변경하고, 감추고, 투명하게 할 수 있습니다.

1, 상태바 색상 변경하기

상태바 색상은 폼의 색상(Fill.Color)을 그대로 반영합니다.

  • 폼의 Fill.Color 변경
  • 폼의 Fill.Kind = Solid

2, 전체화면 전환(상태바 감추기)

폼의 테두리를 표시하지 않으면 상태바도 표시되지 않습니다.

  • 폼의 BorderStyle = None
참고로 코드로 BorderStyle을 변경 시 메모리 참조 에러가 간혹 발생합니다. 만약, 코드로 전체화면으로 전환이 필요한 경우 아래글의 Under the hood – FullScreen & TPlatformServices 섹션을 참고하시기 바랍니다.

3, 상태바 투명하게 하기

상태바를 투명하게 하기 위해서는 파이어몽키 소스코드(FMX.Platform.iOS.pas)를 수정해야합니다.

다음 글을 세번째 항목(三、透明状态栏(能见底图))을 참고하시기 바랍니다.


중국인 개발자(龟山阿卍)의 블로그입니다. 


Tip> 파이어몽키  소스코드를 수정하기

1, RAD Studio 소스코드 경로에서 파이어몽키 소스코드를 복사합니다.(설치경로로\source)

2, 프로젝트 경로에 파이어몽키 소스코드를 붙여넣기 합니다.

3, 프로젝트 매니저에서 위의 파이어몽키 소스코드를 추가합니다.

4, 프로젝트의 파이어몽키 소스코드를 수정 후 컴파일 시 프로젝트의 소스코드를 참고해 빌드됩니다.

안드로이드 상태바 제어하기

안드로이드는 XE7부터 몰입(Immersive)모드를 지원합니다. 몰입모드는 Android KitKat(4.4) 이상에서 동작합니다.

전체화면(상태바 감추기)

폼의 FullScreen 속성을 이용해 전체화면으로 전환/해제 할 수 있습니다.

  • 폼의 FullScreen = True
FullScreen 진입해 전체화면이 되면 상/하단을 쓸어 시스템 메뉴를 표시할 수 있습니다.

참고 글




저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 파이어몽키

[XE8] 스피드버튼의 이미지를 크게 표시할 수 있습니다.

2015.06.04 10:32

파이어몽키에 이미지리스트가 추가(XE8~)되어 스피드버튼에 이미지 표시가 아주 편리해졌습니다.


하지만, 이미지의 기본크기가 너무 작다고 느끼신 경우 다음 글을 통해 스타일을 수정해 큼지막한 이미지를 표시해 보세요.



중국인 개발자(龟山阿卍)의 블로그입니다. 


저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 파이어몽키 Imagelist, Speedbutton, XE8

[JVESoft] 광고와 결재 컴포넌트(AdMob, Paypal 등)

2015.05.18 09:29

JVESoft는 각종 광고 플랫폼과 결재 플랫폼에 연결할 수 있는 컴포넌트를 제작해 판매하고 있습니다.


RAD Studio에서는 TBannerAd 컴포넌트로 광고기능TInAppPuchase 컴포넌트로 결재 기능을 지원하고 있습니다.

각 컴포넌트의 기능과 편의성을 검토해 보시고 원하는 컴포넌트를 선택해서 광고와 결재기능을 여러분의 앱에 추가하시기 바랍니다.




저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 파이어몽키

[iOS] 배포파일 아이클라우드 백업 옵션설정하기

2015.05.18 09:15

iOS앱 배포 시 함께 배포하는 파일에 대해 아이클라우드 백업 설정하는 코드입니다.

대상은 "StartUp\Documents"에 배포하는 파일이며, 아이클라우드 백업 설정하지 않으면 앱스토어 배포 시 리젝처리 될수 있다고 하니 아래 코드를 참고해서 아이클라우드 백업 설정처리하시기 바랍니다.

uses iOSapi.Foundation;
 
function SetBackupFlag( AFileName: string; ABackup: boolean): boolean;
var
  URL : NSUrl;
  Err : PPointer;
begin
  URL := TNSURL.Wrap(TNSURL.OCClass.fileURLWithPath(NSStr(AFileName)));
  Result := URL.setResourceValue(TNSNumber.OCClass.numberWithBool(not ABackup),
              NSStr ('NSURLIsExcludedFromBackupKey'), err) and (err = nil);
end;



참고 글



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 파이어몽키

파이어몽키에서 외부 라이브러리 연동하기(jar, so, a)

2015.04.14 09:58

안드로이드 라이브러리 연동하기

JAR 라이브러리 연동하기

안드로이드 커스텀 라이브러리 연동하는 방법은 엠바카데로 기술문서를 통해 확인할 수 있습니다.

위 페이지에서 제공하는 링크를 따라가며 상세 내용을 익히시기 바랍니다.

libXXX.so 라이브러리 연동하기

엠바카데로 팀 제팬 블로그(http://blogs.embarcadero.com/teamj/)의 글을 링크합니다.

아래 글에서 이클립스로 so 라이브러리를 만들고 델파이에서 dlopen 함수를 이용해 로드해 오는 내용을 참고할 수 있습니다.

(델파이 XE5에서 작성된 글이지만 사용방식은 최신버전에서도 동일합니다.)

iOS 라이브러리 연동하기

정적 라이브러리(*.a) 연동하기

iOS에서는 동적 라이브러리(*.dylib)를 사용하면 앱을 앱스토어에 등록 시 거절 사유가 되기 때문에 정적 라이브러리(*.a)만 사용 가능합니다.


iOS에서 정적 라이브러리 연동하는 방법은 최원식옹(http://blog.naver.com/simonsayz)님의 블로그 글을 링크합니다.

(델파이 XE4에서 작성된 글이지만 사용방식은 최신버전에서도 동일합니다.)

    델파이(파이어몽키)에서 Objective-C 라이브러리를 사용하기 위한 로더를 만드는 내용을 샘플로 소개합니다.

    델파이(파이어몽키)에서 Objective-C 라이브러리와 컨트롤 연동하는 방법을 샘플로 소개합니다.

      실무에서 사용하는 라이브러리(ZBar)를 델파이에서 연동하는 내용을 샘플을 통해 소개합니다.



      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      1. Blog Icon
        윤수아

        이제 막 XE7으로 안드로이드 개발을 시작하려고 하는데
        안드로이드 SDK, JAVA, 브릿지파일, 자바임포트, Java2OP
        이런 개념들이 뒤죽박죽 섞여서 개념 잡기가 힘이 드네요..

        그러다가 아래와 같은 컴포넌트 판매 페이지를 보게 되었는데...
        저 둘의 구분이 뭔지도 모르겠고.. JAVA2OP.exe 가 저 역활 아닌가.. 하면서 다시 혼란스럽네요..
        http://www.winsoft.sk/jbridge.htm
        http://www.winsoft.sk/jimport.htm

      2. Blog Icon
        김윤태

        위 주제에 반대로 하고 싶은데요. 파이어몽키에서 정적 또는 동적 라이브러리를 만들어서 외부 프로그램 (XCode, JAVA)에 연동하는 것은 어떻게 되는지 궁금합니다. 인터넷에서 찾아 봤는데 자료가 없더군요. 꼭 답변 부탁드립니다. ^^

      3. 델파이에서 아직 파이어몽키 라이브러리 개발을 지원하지 않습니다.

      [FMX] ListBox 전체체크 기능 구현하기

      2015.03.04 13:28

      리스트박스(TListBox)에 체크박스를 두고 버튼 클릭 시 전체체크하는 기능에 대한 문의가 있어 정리해 봤습니다.


      이 글에서는 아래 내용을 학습할 수 있습니다.

      • 리스트박스를 동적으로 생성하는 방법
      • 리스트박스 아이템에 체크박스를 표시하는 속성

      화면 구성

      컴포넌트 속성 설정

      주요 속성을 설정합니다.(Object Inspector에서 속성을 설정해도 됩니다.)

      procedure TForm2.FormCreate(Sender: TObject);
      begin
        Button1.StaysPressed := True; //버튼 눌림(IsPressed) 상태 유지
      
        ListBox1.DefaultItemStyles.ItemStyle := 'listboxitemrightdetail'; // 텍스트와 오른쪽에 상세정보가 표시되도록 기본속성 지정
        ListBox1.ShowCheckboxes := True; // 리스트박스 항목에 체크박스가 표시되도록 설정
      end;

      새로고침

      procedure TForm2.Button2Click(Sender: TObject);
      var
        I: Integer;
        Item: TListBoxItem;
      begin
        ListBox1.Items.Clear;
        ListBox1.BeginUpdate;
        try
          for I := 0 to 10 do
          begin
            Item := TListBoxItem.Create(ListBox1);
            Item.Parent := ListBox1;
            Item.Text := 'Item ' + I.ToString;
            Item.ItemData.Detail := 'Description';
          end;
        finally
          ListBox1.EndUpdate;
        end;
      end;

      전체선택

      procedure TForm2.Button1Click(Sender: TObject);
      var
        I, Idx: Integer;
      begin
        Idx := ListBox1.ItemIndex;
        ListBox1.BeginUpdate;
        try
          for I := 0 to ListBox1.Items.Count - 1 do
          begin
            ListBox1.ListItems[I].IsChecked := Button1.IsPressed;
          end;
        finally
          ListBox1.EndUpdate;
          ListBox1.ItemIndex := Idx;
        end;
      end;

      소스코드

      ProjectLBCheck.zip


      Tips>

      커스텀 스타일로 TListBoxItem 스타일을 만드는 경우 TCheckBox의 StyleName을 "check"로 지정하기 바랍니다.


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      [XE7] iOS 시뮬레이터 배포 시 'Please specify exact device preset UUID.' 오류 대응

      2015.02.24 17:48

      iOS 시뮬레이터 실행 시 아래와 같은 오류 발생 시 대처사항입니다.



      결과적으로 원인은 RAD Studio XE7에서 iOS Simulator 8.1을 지원하지 않아서 입니다.

      (iOS Device에서는 8.1을 지원합니다.)

      Hotfix iPhone Simulator 7.1 지원

      RAD Studio XE7 출시 이후 나온 7.1에 대한 패치가 필요합니다. 아래 글의 2번째 Hotfix 설치하기 바랍니다.

      iPhone Simulator 7.1 설치 및 설정

      1. 맥에서 XCode(6.1) 실행 > XCode > Preferences... > Download 화면에서 iOS 7.1 Simulator 다운로드
      2. 델파이 Project Manager의 iOS Simulator에서 Property > SDK에서 iPhoneSimulator 7.1 선택(없으면 Add new... 선택)
      3. (PAServer가 연결된 상태에서)자동으로 iPhoneSimulator 7.1 관련 라이브러리 생성(만약 동작하지 않으면 PAServer 재시작)
      4. iOS Simulator로 다시 배포 및 테스트


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      파이어몽키 용 그리드 컴포넌트 안내 - FirePower

      2015.02.23 13:24

      태블릿용 앱에서는 한 화면에 많은 정보(여러 컬럼과 레코드)를 표시해야하는 경우가 있는데요.

      이때, 기본 컴포넌트를 이용한다면 리스트뷰에 컬럼을 추가해 구현할 수 있지만, 아무래도 전통적인 그리드 컴포넌트가 필요할 수 있습니다.


      오늘은 이미 인포파워 그리드로 유명한 Woll2Woll사의 파이어몽키용 그리드 컴포넌트인 FirePower 컴포넌트를 소개합니다.


      제가 트라이얼로 돌려본 주요 기능은 아래와 같습니다.

      • 기본 그리드 컴포넌트(TGrid, TStringGrid) 대비 스크롤 속도가 상당히 빠릅니다.(이 부분은 기본 컴포넌트의 성능도 꾸준히 개선되고 있습니다.)
      • 다양한 스타일(배경색상, 글자색, 글자 스타일 등)을 적용할 수 있습니다.
      • 셀에 버튼, 이미지 등 속성을 지정할 수 있습니다.
      • 컬럼별 색상을 지정할 수 있습니다.
      • 컬럼별 정렬이 가능합니다.

      그 외의 기능들은 제품소개 또는 트라이얼로 테스트 할 수 있습니다.

      엠바카데로 테크니컬 파트너 페이지에도 등록되어 있습니다.(최신버전을 지원하는 다른 컴포넌트도 알아보시기 바랍니다.)


      참고 링크



      관련 글


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 XE7, 그리드

      [XE7] 안드로이드 블루투스 활성화 조회와 설정하기

      2015.02.12 09:39

      일본인 개발자인 山本隆(야마모토 타카시)의 글을 참고해 안드로이드에서 블루투스 활성여부 조회와 설정하는 내용을 공유합니다.

      블루투스 활성여부 조회

      uses
        Androidapi.JNI.Bluetooth;
      
      procedure TForm2.Button1Click(Sender: TObject);
      var
        Adapter: JBluetoothAdapter;
      begin
        Adapter := TJBluetoothAdapter.JavaClass.getDefaultAdapter;
        if Adapter.isEnabled then
          ShowMessage('Bluetooth가 활성화 되어있습니다.')
        else
          ShowMessage('Bluetooth가 활성화 되지 않았습니다.');
      end;

      블루투스 활성화 설정

      uses
        Androidapi.JNI.Bluetooth;
      
      procedure TForm2.Button2Click(Sender: TObject);
      var
        Adapter: JBluetoothAdapter;
      begin
        Adapter := TJBluetoothAdapter.JavaClass.getDefaultAdapter;
        if Adapter.enable then
          ShowMessage('Bluetooth를 활성화합니다.')
        else
          ShowMessage('사용할 수 없습니다.');
      end;
      
      procedure TForm1.Button3Click(Sender: TObject);
      var
        Adapter: JBluetoothAdapter;
      begin
        Adapter := TJBluetoothAdapter.JavaClass.getDefaultAdapter;
        if Adapter.disable then
          ShowMessage('Bluetooth를 비활성화합니다.')
        else
          ShowMessage('사용할 수 없습니다.');
      end;

      블루투스 권한이 있는지 확인

      uses
        Androidapi.Helpers,
        Androidapi.JNI.GraphicsContentViewText;
      
      procedure TForm2.Button3Click(Sender: TObject);
        function HasPermission(const Permission: string): Boolean;
        begin
          Result := SharedActivityContext.checkCallingOrSelfPermission(StringToJString(Permission)) = TJPackageManager.JavaClass.PERMISSION_GRANTED
        end;
      
      begin
        if HasPermission('android.permission.BLUETOOTH') then
          ShowMessage('Bluetooth 통신 권한이 있습니다.')
        else
          ShowMessage('Bluetooth 통신 권한이 없습니다');
      
        if HasPermission('android.permission.BLUETOOTH_ADMIN') then
          ShowMessage('Bluetooth 설정 수정 권한이 있습니다.')
        else
          ShowMessage('Bluetooth 설정 수정 권한이 없습니다.');
      end;

      • 블루투스 관련 권한(Project Options > Uses Permissions)이 필요합니다.
        • Bluetooth
        • Bluetooth admin

      샘플프로그램 다운로드

      ProjectSetBluetooth.zip

      참고 글


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 XE7, 블루투스, 안드로이드

      [XE7] 안드로이드 WiFi 상태조회와 설정하기

      2015.02.11 10:44

      일본인 개발자인 山本隆(야마모토 타카시)의 글을 참고해 안드로이드 앱에서 Wifi 상태를 읽고 키고끄는 기능을 구현해 보고 공유합니다.

      ❑ 안드로이드 WifiManager 델파이 브릿지 파일 생성

      Java2OP 툴을 이용해 WifiManager 델파이 브릿지 파일을 만듭니다.

      Java2OP.exe -classes android.net.wifi.WifiManager -unit Androidapi.JNI.WifiManager


      위 명령어를 실행하면 아래와 같이 Androidapi.JNI.WifiManager.pas 유닛파일이 생성됩니다. 



      해당 유닛파일을 프로젝트 경로 또는 본인이 관리하는 라이브러리 경로에 복사합니다.(저는 D:\Projects\common\rtl\XE7\android 경로에 복사 후 Option > Library Path에 경로를 등록했습니다.)


      만약, 아래와 같은 "Missing JDK. Please install JDK 1.7+ or make sure that it is in your PATH" 메시지가 표시된다면


       커맨드라인에서 아래의 명령어를 이용해 환경변수에 추가 후 다시 시도하기 바랍니다.(도움말)
      SET PATH=%PATH%;C:\Program Files\Java\jdk1.7.0_25\bin


      ❑ Androidapi.JNI.WifiManager 유닛을 이용해 WiFI 제어기능 구현

      새로운 프로젝트를 생성하고, 위에서 생성한 Androidapi.JNI.WifiManager를 추가합니다.

      uses 절에 구현에 필요한 유닛을 추가합니다.

      uses
        Androidapi.Helpers,
        Androidapi.JNI.JavaTypes,
        Androidapi.JNI.GraphicsContentViewText,
        Androidapi.JNIBridge,
        Androidapi.JNI.WifiManager;

      WiFi 설정(키고 끄기)하기

      procedure SetWifiEnabled(AEnable: Boolean);
      var
        Obj: JObject;
        WifiManager: JWifiManager;
      begin
        Obj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
        if Obj = nil then
          Exit;
      
        WifiManager := TJWifiManager.Wrap((Obj as ILocalObject).GetObjectID);
        WifiManager.setWifiEnabled(AEnable);
      end;

      WiFi 상태 조회

      function IsWifiEnabled: Boolean;
      var
        Obj: JObject;
        WifiManager: JWifiManager;
      begin
        Obj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
        if Obj = nil then
          Exit;
      
        WifiManager := TJWifiManager.Wrap((Obj as ILocalObject).GetObjectID);
        Result := WifiManager.isWifiEnabled;
      end;

      ❑ 사용자 권한 설정

      위 Wifi 제어와 상태조회 기능을 사용할 경우 사용자 권한을 추가해야 합니다.

      Project Option > Uses permissions

      • Access wifi state : Wifi 상태 조회

      • Change wifi state : Wifi 상태 설정

      ❑ 최종 화면과 소스코드


      참고 글



      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      태블릿용 멀티컬럼 리스트뷰 ItemAppearace 만들기

      2015.02.09 11:28

      모바일(폰과 패드)용 목록을 만드는 컴포넌트는 대표적으로 ListView와 ListBox가 있습니다.

      두 목록 컴포넌트의 차이점은 이름으로 알수 있듯이 목적에 차이가 있습니다.


      ListView는 

      View 즉 보여주는 것을 목적으로 하기 때문에 목록을 빠르게 이동할 수 있지만 목록아이템을 꾸미는데 제한적입니다.

      반면, 

      ListBox는 

      Box 즉 목록 아이템에 다른 아이템을 담아 자유롭게 목록을 구성할 수 있는 컴포넌트입니다. 목록을 원하는데로 꾸밀 수 있지만 많은 컴포넌트를 담는다면 스크롤이 상대적으로 느려질 수 있습니다.


      두 목록 컴포넌트의 목적을 잘 이해하고 사용하시기 바랍니다.


      ListView는 목록 아이템을 꾸미는데 제한적이라고 했는데요. 그 이유는 TListViewItem은 (TFMXObject를 상속받지 않았기 때문에)다른 컴포넌트를 올릴 수 없도록 설계되었습니다. 아이템 외관을 꾸미기 위해서는 ListView의 ItemAppearance 속성을 이용할 수 있습니다. 이 속성은 기본으로 7개의 항목만 제공됩니다.

      기본 제공되는 ItemAppearance는 모바일 폰(작은화면)을 기준으로 제공합니다. 태블릿용 앱에서는 화면이 다소 허전해 질 수 있습니다.

      이렇게 기본 제공되는 외관을 변경(항목 추가, 위치 이동)하기 위해서는 ItemAppearance 패키지 프로젝트를 직접 만들어 설치(Install) 후 사용할 수 있습니다.

      ItemAppearance 패키지 제작

      기본 샘플 참고

      델파이 기본 샘플에서 ListView 샘플(Samples\Object Pascal\Mobile Samples\User Interface\ListView)을 참고할 수 있습니다.

      ListView 샘플에는 상세정보를 여러건 보여주는 MultiDetailItem, 별점을 표시하는 RatingItem 등의 목록을 구성할 수 있는 패키지 프로젝트(*.dpk)가 있고, 그 패키지를 사용하는 샘플 프로젝트가 있습니다.

      먼저 패키지 프로젝트를 열고 프로젝트 매니저에서 설치(오른쪽 마우스 > Install) 후 샘플 프로젝트를 열어 확인하기 바랍니다.

      패키지 프로젝트를 열면 ItemAppearance 속성에 새로운 항목이 추가된 것을 볼 수 있습니다.

      MultiDetailHorzItem

      제가 직접 4개의 열을 갖는 ItemAppearance를 만들어 테스트 해 봤습니다. 기본 제공되는 MultiDetailItem을 수정했습니다.

      확실히 ListBox, Grid, StringGrid에 비해 목록을 스크롤하는 속도가 빠릅니다.


      unit MultiDetailHorzAppearanceU;
      
      interface
      
      uses FMX.ListView, FMX.ListView.Types, System.Classes, System.SysUtils,
      FMX.Types, System.UITypes, FMX.MobilePreview;
      
      type
      
        TMultiDetailHorzAppearanceNames = class
        public const
          ListItem = 'MultiDetailHorzItem';
          ListItemCheck = ListItem + 'ShowCheck';
          ListItemDelete = ListItem + 'Delete';
          Detail1 = 'det1';  // Name of MultiDetail object/data
          Detail2 = 'det2';
          Detail3 = 'det3';
        end;
      
      implementation
      
      uses System.Math, System.Rtti;
      
      type
      
        TMultiDetailHorzItemAppearance = class(TPresetItemObjects)
        public const
          cTextMarginAccessory = 8;
          cDefaultHeight = 40;
        private
          FMultiDetail1: TTextObjectAppearance;
          FMultiDetail2: TTextObjectAppearance;
          FMultiDetail3: TTextObjectAppearance;
          procedure SetMultiDetail1(const Value: TTextObjectAppearance);
          procedure SetMultiDetail2(const Value: TTextObjectAppearance);
          procedure SetMultiDetail3(const Value: TTextObjectAppearance);
        protected
          function DefaultHeight: Integer; override;
          procedure UpdateSizes; override;
          function GetGroupClass: TPresetItemObjects.TGroupClass; override;
          procedure SetObjectData(const AListViewItem: TListViewItem; const AIndex: string; const AValue: TValue; var AHandled: Boolean); override;
        public
          constructor Create; override;
          destructor Destroy; override;
        published
          property MultiDetail1: TTextObjectAppearance read FMultiDetail1 write SetMultiDetail1;
          property MultiDetail2: TTextObjectAppearance read FMultiDetail2 write SetMultiDetail2;
          property MultiDetail3: TTextObjectAppearance read FMultiDetail3 write SetMultiDetail3;
          property Accessory;
        end;
      
        TMultiDetailHorzDeleteAppearance = class(TMultiDetailHorzItemAppearance)
        private const
          cDefaultGlyph = TGlyphButtonType.Delete;
        public
          constructor Create; override;
        published
          property GlyphButton;
        end;
      
        TMultiDetailShowCheckAppearance = class(TMultiDetailHorzItemAppearance)
        private const
          cDefaultGlyph = TGlyphButtonType.Checkbox;
        public
          constructor Create; override;
        published
          property GlyphButton;
        end;
      
      const
        cMultiDetail1Member = 'Detail1';
        cMultiDetail2Member = 'Detail2';
        cMultiDetail3Member = 'Detail3';
      
      constructor TMultiDetailHorzItemAppearance.Create;
      begin
        inherited;
        Accessory.DefaultValues.AccessoryType := TAccessoryType.More;
        Accessory.DefaultValues.Visible := True;
        Accessory.RestoreDefaults;
        Text.DefaultValues.VertAlign := TListItemAlign.Trailing;
        Text.DefaultValues.TextVertAlign := TTextAlign.Center;
        Text.DefaultValues.Visible := True;
        Text.RestoreDefaults;
      
        FMultiDetail1 := TTextObjectAppearance.Create;
        FMultiDetail1.Name := TMultiDetailHorzAppearanceNames.Detail1;
        FMultiDetail1.DefaultValues.Assign(Text.DefaultValues);  // Start with same defaults as Text object
        FMultiDetail1.DefaultValues.IsDetailText := True; // Use detail font
        FMultiDetail1.VertAlign := TListItemAlign.Leading;
        FMultiDetail1.Align := TListItemAlign.Trailing;
        FMultiDetail1.TextVertAlign := TTextAlign.Center;
        FMultiDetail1.RestoreDefaults;
        FMultiDetail1.OnChange := Self.ItemPropertyChange;
        FMultiDetail1.Owner := Self;
      
        FMultiDetail2 := TTextObjectAppearance.Create;
        FMultiDetail2.Name := TMultiDetailHorzAppearanceNames.Detail2;
        FMultiDetail2.DefaultValues.Assign(FMultiDetail1.DefaultValues);  // Start with same defaults as Text object
        FMultiDetail2.VertAlign := TListItemAlign.Leading;
        FMultiDetail2.Align := TListItemAlign.Trailing;
        FMultiDetail2.TextVertAlign := TTextAlign.Center;
        FMultiDetail2.RestoreDefaults;
        FMultiDetail2.OnChange := Self.ItemPropertyChange;
        FMultiDetail2.Owner := Self;
      
        FMultiDetail3 := TTextObjectAppearance.Create;
        FMultiDetail3.Name := TMultiDetailHorzAppearanceNames.Detail3;
        FMultiDetail3.DefaultValues.Assign(FMultiDetail2.DefaultValues);  // Start with same defaults as Text object
      //  FMultiDetail3.DefaultValues.Height := 20; // Move text down
        FMultiDetail3.VertAlign := TListItemAlign.Leading;
        FMultiDetail3.Align := TListItemAlign.Trailing;
        FMultiDetail3.TextVertAlign := TTextAlign.Center;
        FMultiDetail3.RestoreDefaults;
        FMultiDetail3.OnChange := Self.ItemPropertyChange;
        FMultiDetail3.Owner := Self;
      
        // Define livebindings members that make up MultiDetail
        FMultiDetail1.DataMembers :=
          TObjectAppearance.TDataMembers.Create(
            TObjectAppearance.TDataMember.Create(
              cMultiDetail1Member, // Displayed by LiveBindings
              Format('Data["%s"]', [TMultiDetailHorzAppearanceNames.Detail1])));   // Expression to access value from TListViewItem
        FMultiDetail2.DataMembers :=
          TObjectAppearance.TDataMembers.Create(
            TObjectAppearance.TDataMember.Create(
              cMultiDetail2Member, // Displayed by LiveBindings
              Format('Data["%s"]', [TMultiDetailHorzAppearanceNames.Detail2])));   // Expression to access value from TListViewItem
        FMultiDetail3.DataMembers :=
          TObjectAppearance.TDataMembers.Create(
            TObjectAppearance.TDataMember.Create(
              cMultiDetail3Member, // Displayed by LiveBindings
              Format('Data["%s"]', [TMultiDetailHorzAppearanceNames.Detail3])));   // Expression to access value from TListViewItem
      
        GlyphButton.DefaultValues.VertAlign := TListItemAlign.Center;
        GlyphButton.RestoreDefaults;
      
        // Define the appearance objects
        AddObject(Text, True);
        AddObject(MultiDetail1, True);
        AddObject(MultiDetail2, True);
        AddObject(MultiDetail3, True);
        AddObject(Image, True);
        AddObject(Accessory, True);
        AddObject(GlyphButton, IsItemEdit);  // GlyphButton is only visible when in edit mode
      end;
      
      constructor TMultiDetailHorzDeleteAppearance.Create;
      begin
        inherited;
        GlyphButton.DefaultValues.ButtonType := cDefaultGlyph;
        GlyphButton.DefaultValues.Visible := True;
        GlyphButton.RestoreDefaults;
      end;
      
      constructor TMultiDetailShowCheckAppearance.Create;
      begin
        inherited;
        GlyphButton.DefaultValues.ButtonType := cDefaultGlyph;
        GlyphButton.DefaultValues.Visible := True;
        GlyphButton.RestoreDefaults;
      end;
      
      function TMultiDetailHorzItemAppearance.DefaultHeight: Integer;
      begin
        Result := cDefaultHeight;
      end;
      
      destructor TMultiDetailHorzItemAppearance.Destroy;
      begin
        FMultiDetail1.Free;
        FMultiDetail2.Free;
        FMultiDetail3.Free;
        inherited;
      end;
      
      procedure TMultiDetailHorzItemAppearance.SetMultiDetail1(
        const Value: TTextObjectAppearance);
      begin
        FMultiDetail1.Assign(Value);
      end;
      
      procedure TMultiDetailHorzItemAppearance.SetMultiDetail2(
        const Value: TTextObjectAppearance);
      begin
        FMultiDetail2.Assign(Value);
      end;
      
      procedure TMultiDetailHorzItemAppearance.SetMultiDetail3(
        const Value: TTextObjectAppearance);
      begin
        FMultiDetail3.Assign(Value);
      end;
      
      procedure TMultiDetailHorzItemAppearance.SetObjectData(
        const AListViewItem: TListViewItem; const AIndex: string;
        const AValue: TValue; var AHandled: Boolean);
      begin
        inherited;
      
      end;
      
      function TMultiDetailHorzItemAppearance.GetGroupClass: TPresetItemObjects.TGroupClass;
      begin
        Result := TMultiDetailHorzItemAppearance;
      end;
      
      procedure TMultiDetailHorzItemAppearance.UpdateSizes;
      const
          // Total Rate = 1.0
          TextWidthRate = 0.4;
          Det1WidthRate = 0.2;
          Det2WidthRate = 0.2;
          Det3WidthRate = 0.2;
      
      var
        LOuterHeight: Single;
        LOuterWidth: Single;
        LInternalWidth: Single;
        LImagePlaceOffset: Single;
        LImageTextPlaceOffset: Single;
      begin
        BeginUpdate;
        try
          inherited;
      
          // Update the widths and positions of renderening objects within a TListViewItem
          LOuterHeight := Height - Owner.ItemSpaces.Top - Owner.ItemSpaces.Bottom;
          LOuterWidth := Owner.Width - Owner.ItemSpaces.Left - Owner.ItemSpaces.Right;
          Text.InternalPlaceOffset.X :=
            Image.ActualPlaceOffset.X +  Image.ActualWidth + LImageTextPlaceOffset;
      
          LInternalWidth := (LOuterWidth - Text.ActualPlaceOffset.X - Accessory.ActualWidth);
          if Accessory.ActualWidth > 0 then
            LInternalWidth := LInternalWidth - cTextMarginAccessory;
          Text.InternalWidth := Max(1, LInternalWidth * TextWidthRate);
      
          MultiDetail1.InternalWidth := LInternalWidth * Det1WidthRate;
          MultiDetail1.InternalPlaceOffset.X := Text.InternalPlaceOffset.X + Text.InternalWidth;
          MultiDetail2.InternalWidth := LInternalWidth * Det2WidthRate;
          MultiDetail2.InternalPlaceOffset.X := MultiDetail1.InternalPlaceOffset.X + MultiDetail1.InternalWidth;
          MultiDetail3.InternalWidth := LInternalWidth * Det3WidthRate;
          MultiDetail3.InternalPlaceOffset.X := MultiDetail2.InternalPlaceOffset.X + MultiDetail2.InternalWidth;
        finally
          EndUpdate;
        end;
      end;
      
      type
        TOption = TCustomListView.TRegisterAppearanceOption;
      const
        sThisUnit = 'MultiDetailHorzAppearanceU';     // Will be added to the uses list when appearance is used
      initialization
        // MultiDetailItem group
        TCustomListView.RegisterAppearance(
          TMultiDetailHorzItemAppearance, TMultiDetailHorzAppearanceNames.ListItem,
          [TOption.Item], sThisUnit);
        TCustomListView.RegisterAppearance(
          TMultiDetailHorzDeleteAppearance, TMultiDetailHorzAppearanceNames.ListItemDelete,
          [TOption.ItemEdit], sThisUnit);
        TCustomListView.RegisterAppearance(
          TMultiDetailShowCheckAppearance, TMultiDetailHorzAppearanceNames.ListItemCheck,
          [TOption.ItemEdit], sThisUnit);
      finalization
        TCustomListView.UnregisterAppearances(
          TArray.Create(
            TMultiDetailHorzItemAppearance, TMultiDetailHorzDeleteAppearance,
            TMultiDetailShowCheckAppearance));
      end.



      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      1. Blog Icon
        고재학

        소스 코드에 버그가 있는것 같네요.
        230 Text.InternalPlaceOffset.X :=
        231 Image.ActualPlaceOffset.X + Image.ActualWidth + LImageTextPlaceOffset;


      2. 어떤 증상이 있죠? 좀 더 자세히 알려주시면 감사하겠습니다.^^

      3. Blog Icon
        고재학

        윈도우에서 테스트할 경우에는 문제가 없었는데 모바일에서 컴파일하면 내용을 표시하는 과정에서 "Invalid floating point operation"가 나타납니다.
        위 코드를 제거하고 테스트해보니 정상작동 하였습니다.

      4. Blog Icon
        고재학

        질문에 답변도 해주시는지요?
        위의 예제를 응용하여 리스트뷰를 만들었는데... MultiDetail1에 대입되는 값에 따라 글자색을 변경하고 싶습니다.

        예를 들어
        MultiDetail1의 값이 1이면 MultiDetail1의 글자색은 빨강색
        MultiDetail1의 값이 2이면 MultiDetail1의 글자색은 파랑색

        모바일앱에서 MultiDetail1의 TextColor를 어떻게 동적으로 변경할 수 있을까요?

      5. C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ListView\ListViewMultiDetailAppearance

        위 ListView 샘플에 다음 코드로 진행해 봤습니다.(잘되네요^^)

        // ListView의 OnUpdateObjects 이벤트에 아래 코드 구현
        procedure TForm594.ListViewMultiDetailUpdateObjects(const Sender: TObject;
        const AItem: TListViewItem);
        var
        Textitem: TListItemText;
        begin
        Textitem := AItem.View.FindDrawable(TMultiDetailAppearanceNames.Detail1) as TListItemText;
        if Assigned(TextItem) then
        begin
        // M으로 시작하는 text 빨간색으로 표시
        if Textitem.Text.StartsWith('M') then
        begin
        TextItem.TextColor := $FFFF0000;
        end;
        end;
        end;

        위 디렉토리의 샘플을 참고하시면 다양한 기능을 구현할 수 있습니다.

      6. Blog Icon
        고재학

        와~~~ 멋지네요.
        XE8에서 작동하지않아 Seattle로 업그레이드하니 잘 됩니다.
        감사합니다.

      트루타입 폰트(FontAwesome) 파일을 이용해 아이콘 표시하기(안드로이드, iOS)

      2015.01.28 09:20

      트루타입 폰트에 그림을 등록해 아이콘으로 사용하는 방식은 최근 웹개발에서 많이 사용됩니다.

      델파이에서 어떻게 사용할까. 궁금했는데요. 마침 엠바카데로 커뮤니티 블로그에 관련 글이 올라와 소개합니다.



      간단한 개발팁을 보태면
      1. FontAwesome에서 다운로드 후 폰트파일 설치(fontawesome-webfont.ttf 찾아 더블클릭 > 설치)
      2. 윈도우 유틸리지 중 "문자표" 실행 후 FontAwesome 폰트 선택 후 사용할 아이콘 선택 > 클립보드 복사
      3. 델파이에서 Label 등을 추가 후 문자타입(Font.Family)를 "FontAwesome" 선택 후 값에 2번의 클립보드 내용 붙여넣기
      4. 안드로이드, iOS에 폰트파일 배포와 사용하도록 설정(원글 참고)

      관련 글


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      [XE7] 안드로이드 L 스타일팩 다운로드

      2015.01.23 11:07

      최근 안드로이드 L(롤리팝: 5.0)을 적용한 스마트폰이 나오고 있습니다.


      엠바카데로에서도 안드로이드 5.0 지원을 위해 핫픽스를 배포하고 안드로이드 L에 맞는 스타일팩을 배포합니다.


      안드로이드 L 스타일팩 활용방법은 Sarina DuPont의 글을 참고하기 바랍니다.

      관련 글



      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 XE7, 롤리팝, 스타일, 안드로이드, 안드로이드 L

      안드로이드에 설치된 앱 목록(AppList)을 표시하는 앱(소스코드 공개)

      2015.01.13 12:05

      안드로이드 디바이스에 설치된 앱을 빠르게 찾아 실행할 수 있는 안드로이드 앱의 소스코드를 FMXExpress.com에서 공개하였습니다.


      해당 앱은 설치된 앱 목록을 표시하고, 항목 선택 시 앱을 실행합니다. 그리고, 검색창을 통해 키워드로 필터링해 빠르게 앱을 검색할 수 있습니다. 기존에는 안드로이드 디바이스에서 페이지 단위로 넘겨가며(Swipe) 앱을 찾던 수고를 크게 줄일 수 있습니다.


      이 앱에서는 다음의 기술을 학습할 수 있습니다.

      • 설치된 앱 목록 조회하기
      • 설치된 앱의 아이콘 가져오기
      • 앱 실행(앱의 패키지명, 앱이름으로)
      • ListView 필터링 하기




      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 oDesk, 안드로이드

      [XE7] 안드로이드 4.4 스타일의 대화상자 사용하기

      2015.01.07 10:04

      델파이를 이용해 안드로이드 앱개발 시 기본 대화상자(Dialog)는 안드로이드 2.3 버전으로 표시됩니다.

      이 이슈는 엠바카데로 커뮤니티 3.0 사이트에 등록되었으며 David I가 직접 답변을 달고 해결방안을 소개했습니다.


      결과 적으로 FMX.Helper.Android.pas 유닛의 GetNativeTheme 함수를 수정해 해결할 수 있습니다.

      (변경된 소스 적용은 프로젝트에 수정한 파일을 추가해서 간단히 해결할 수 있네요.)



      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 XE7, 델파이, 안드로이드

      커스텀 폰트 배포와 사용하기(Android/iOS)

      2014.12.22 10:28

      커스텀 폰트를 배포하고 사용하는 방법을 안내하는 글이 있어 소개합니다.

      배포기능을 이용해 폰트를 배포하고 플랫폼 별로 배포된 폰트를 사용하도록 설정할 수 있습니다.

      (점점 다양한 종류의 아티클들이 나오고 있어 반갑네요^^)




      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 Firemonkey, ios, 안드로이드

      [XE5~XE7] FGX 컴포넌트 소개(오픈소스) - ProgressDialog, LinkedLabel 등

      2014.12.03 10:14

      러시아의 개발자(Бровин Ярослав)가 오픈소스로 공개한 컴포넌트를 소개합니다.

      라이선스는 MPL 2.0(소스코드 변경 시 오픈, 사용 시 오픈하지 않아도 됨)

      • TfgProgressDialog, TfgActivityDialog이 - 긴 작업의 진행 상태를 표시합니다 (아이폰 OS, 안드로이드) 
      • TfgVirtualKeyboard - 가상 키보드와 단순화 된 작업 (아이폰 OS, 안드로이드) 
      • TfgActionSheet이 - 페이지 작업을 선택합니다 (http://fire-monkey.ru/topic/23-kak-sdelat-panel-dlia-vybora-deistvii-na-podob/ ) 
      • TfgGradientEdit - 그라데이션을 설정하기위한 더 나은 제어 
      • TfgColorsPanel - 색상의 설정은, 사용자가 색상을 선택할 수 있습니다. 
      • TfgLinkedLabel - 링크를 표시합니다. 링크를 클릭하면 표준 브라우저에서 열립니다으로 (모든 플랫폼을 지원합니다)
      • Style 생성 시 필요한 오브젝트 컴포넌트 등록

      다운로드(XE5, XE6, XE7): 

       - http://fire-monkey.ru/topic/83-fgx-indikatciia-khoda-vypolneniia-dlitelnykh-operatci/



      컴포넌트도 좋지만 내부에 구현된 소스를 참고하면 실력향상에 도움이 될겠습니다.

      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키

      안드로이드 5.0(Lollipop)에서 실행 시 오류대응 방법

      2014.12.03 10:02

      안드로이드의 새로운 운영체제인 롤리팝에서 앱 실행 시 스플래쉬 이미지 이후 예외가 발생해 앱이 정상 구동되지 않는 이슈가 발생하고 있습니다.


      간단하게 안내해 드리면

      안드로이드 5.0(롤리팝)에서 앱 구동 시 EBitmapLoadingFailed 오류가 발생합니다. 해당 오류는 *.fmx에 포함된 TBitmap 데이터를 LoadFromStream으로 읽어 올때 발생하는 것으로 보이며, 해결 방안은 Image등의 컴포넌트에 등록된 이미지를 파일로 배포 후 동적으로 읽어 들이는 방법으로 해결할 수 있습니다.


      아래 원문에서는 위 작업을 자동화 할 수 있는 팁과 관련 소스를 제공하며, 더 자세한 내용을 확인할 수 있습니다.

      (이탈리아어 이므로 구글 번역기를 통해 번역해서 보시기 바랍니다.)

      참고 글

      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 EBitmapLoadingFailed, 롤리팝, 안드로이드

      [XE7] 자체적으로 원격푸쉬알림(GCM, APN) 전송 구현방법

      2014.12.03 09:43

      스페인의 델파이 개발자(fgonzalez.visiblogs.com/)가 자체적으로 원격푸쉬 알림 기능을 구현한 동영상을 소개합니다.


      RAD Studio에서 원격 푸쉬 알림(Remote Push Notification)을 구현하기 위해서는 XE6 버전에 추가된 BaaS 클라이언트 컴포넌트를 통해 가능했는데요. 

      이 동영상에서는 IdHttp(안드로이드), TCPClient(iOS) 컴포넌트 등을 활용해 푸쉬 메시지를 전송하고, System.PushNotification 클래스를 활용해 푸쉬 메시지를 수신하는 내용을 소개합니다.


      동영상은 스페인어로 이야기를 합니다. 팁을 드리면 유투브의 자막을 한국어로 설정하고 화면과 코드위주로 보시면 충분히 이해할 수 있습니다.


      참고 글


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 APN, Firemonkey, gcm, ios, push, Remote Push Notification, 안드로이드

      1. Blog Icon
        석만근

        와우 감사합니다.
        전 서버를 웹페이지로 구현하고 Post방식으로 날렸는데 바로 날리네요;; 구글로 ㅎㅎ
        그리고 왠지 될것 같은데.... 당채 말을 알아들을수가 없네요
        감사합니다. 도움이 많이 될듯합니다.

      2. 그래도 개발자들에게는 코드가 있어 위안이 됩니다^^
        시도해 보시고 팁될만한 것 있으면 공유해주세요.
        감사합니다.^^

      3. Blog Icon
        오진성

        감사합니다 ^^
        잘되네요 근데 궁금증이있는데요
        message를 한글로 보내면 한글이 깨져서 나오든데 ... 어떻게 해결해야하나요 ?

      4. Blog Icon
        정상언

        한글 깨지는 분 저도 고생 좀 했는데
        AData := TStringStream.Create(AJson.ToString) 이부분을

        다음 처럼 하면 되네요
        AData := TStringStream.Create(AJson.ToJSON);

      5. Blog Icon
        키위

        영상을 통해 푸쉬 메세지 전송에 성공 했습니다.
        그런데 푸쉬를 여러개 받으면 받은만큼 아이콘과 알림이 생기는데
        이걸 어떻게 아이콘 하나에 "x개 메세지"로 만들수 있을까요?...
        여기저기 검색을 해봐도 통.. 찾을 수가 없네요.
        보내는놈, 받는놈, manifest file, 서비스.. 어디를 건드려야 하는지도 감이 안잡히네요.ㅡㅡ

      6. Blog Icon
        난다요

        푸시연구 중인데 도저히 모르겠어서 질문올립니다.

        여기 홈페이지에서 동영상 보면서 만들고 있는데요

        다른건 다 이해가 가는데

        DeviceToKen := '';

        이 디바이스토큰값을 어디서 가져오는지 모르겠습니다.

        혹시 아시는분은 자세히 설명좀 부탁드립니다. ㅜㅜ

      7. Blog Icon
        하이요

        종료시에 push를 받고싶은데
        그럴려면 안드로이드 스튜디오의 경우 gradle 파일을 수정하던데...
        델파이에서는 어떻게 해야하나요?

      8. 다음글을 참고해 종료 이벤트를 감지해보세요.
        WillTerminate 이벤트에 푸쉬를 발생하세요.
        http://blog.hjf.pe.kr/114

        푸쉬를 발생하는 내용은 아래 링크를 참고하세요.
        http://docwiki.embarcadero.com/RADStudio/Berlin/en/Mobile_Tutorial:_Using_Notifications_(iOS_and_Android)

      파이어몽키 안드로이드 네이티브 컴포넌트(오픈소스) - DPF

      2014.12.01 10:42

      파이어몽키 멀티-디바이스 앱 개발의 장점은 하나의 소스코드로 여러개의 플랫폼을 개발할 수 있다는 것입니다.

      그리고, 또다른 장점은 필요한 경우 네이티브 API와 SDK를 사용할 수 있다는 장점도 있습니다.


      위 장점을 최대한 활용한 오픈소스 프로젝트를 소개합니다.

      이 오픈소스 프로젝트에서는 안드로이드 네이트브 기능(SDK, API)를 이용해 네이티브 UI와 기능을 갖는 컴포넌트를 제공합니다.

      만약, 안드로이드 전용 앱을 만드는 경우 해당 오픈소스를 활용한다면, 기본 컴포넌트 외에도 더 풍부한 컴포넌트를 이용해 앱을 만들 수 있습니다.


      Some components:
      + Added TDPFJAlertDialog
      + TDPFJAnalogClock
      + TDPFJButton
      + TDPFJCheckBox
      + TDPFJChronometer
      + TDPFJDatePicker
      + TDPFJDatePickerDialog
      + TDPFJEditText
      + TDPFJImageView
      + TDPFJListView (not completed)
      + TDPFJProgressBar
      + TDPFJProgressDialog
      + TDPFJTextView
      + TDPFJTimePickerDialog
      + TDPFJToast
      + TDPFJView
      + TDPFJRadioButton
      + TDPFJNumberPicker
      + TDPFJSeekBar
      + TDPFJTabHost Component (Tabbed view)
      + TDPFJSpinner Component (Dropdown list)
      + TDPFJTextSwitcher Component (Fade/Slide Texts)
      + TDPFJTextClock
      + TDPFJWebView


      그리고, XE5 부터 꾸준히 업그레이드를 제공하고 있는 것도 큰 장점으로 꼽을 수 있습니다.


      저작자 표시 비영리 동일 조건 변경 허락
      신고
      크리에이티브 커먼즈 라이선스
      Creative Commons License

      험프리.김현수 험프리.김현수 파이어몽키 dpf, 네이티브, 안드로이드, 컴포넌트