XE6使用FMX(FireMonkey)取得系統字型列表(For Win/Mac OS)

早上看到大陸網友留言發問,在Delphi的VCL架構中,只要Screen.Fonts就可以取得系統的字型列表,那在FMX(FireMonkey)架構裡沒有Screen.Fonts,該如何取得系統的字型列表呢?壽山做了一個簡單的程式做回應跟說明囉:)

首先我們新增一個FireMonkey Desktop Application專案
螢幕快照 2014-06-21 上午11.54.13

 

 

接著在畫面上放三個元件,Listbox、Label以及Button螢幕快照 2014-06-21 上午11.56.45

 

首先,在Uses的下面加上

  {$IFDEF MACOS}
  MacApi.Appkit,Macapi.CoreFoundation, Macapi.Foundation,
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  Winapi.Messages, Winapi.Windows,
  {$ENDIF}

接著我們要寫一個CollectFonts的函數,讓程式在不同平台可以抓到字型。

主要運用的技巧是

Mac OS裡的NSFontManager
Windows裡的EnumFontFamiliesEx

{$IFDEF MSWINDOWS}
function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
  FontType: Integer; Data: Pointer): Integer; stdcall;
var
  S: TStrings;
  Temp: string;
begin
  S := TStrings(Data);
  Temp := LogFont.lfFaceName;
  if (S.Count = 0) or (AnsiCompareText(S[S.Count-1], Temp) <> 0) then
    S.Add(Temp);
  Result := 1;
end;
{$ENDIF}

procedure CollectFonts(FontList: TStringList);
var
{$IFDEF MACOS}
  fManager: NsFontManager;
  list:NSArray;
  lItem:NSString;
{$ENDIF}
{$IFDEF MSWINDOWS}
  DC: HDC;
  LFont: TLogFont;
{$ENDIF}
  i: Integer;
begin
  {$IFDEF MACOS}
    fManager := TNsFontManager.Wrap(TNsFontManager.OCClass.sharedFontManager);
    list := fManager.availableFontFamilies;
    if (List <> nil) and (List.count > 0) then
    begin
      for i := 0 to List.Count-1 do
      begin
        lItem := TNSString.Wrap(List.objectAtIndex(i));
        FontList.Add(String(lItem.UTF8String))
      end;
    end;
  {$ENDIF}
  {$IFDEF MSWINDOWS}
    DC := GetDC(0);
    FillChar(LFont, sizeof(LFont), 0);
    LFont.lfCharset := DEFAULT_CHARSET;
    EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, Winapi.Windows.LPARAM(FontList), 0);
    ReleaseDC(0, DC);
  {$ENDIF}
end;

最後在Button1Click事件加上

procedure TForm1.Button1Click(Sender: TObject);
var fList: TStringList;
    i: Integer;
begin
  fList := TStringList.Create;
  CollectFonts(fList);
  Label1.Text := '系統字型數量'+ IntToStr(fList.Count);
  for i := 0 to fList.Count -1 do
  begin
     ListBox1.Items.Add(FList[i]);
  end;
  fList.Free;
end;

在Windows及Mac OS執行的畫面如下
10374079_10152084884031541_8800976866348499936_n

10402863_10152084884291541_3407519286840592873_n

GitHub >> https://github.com/superlevin/XE6FMXGetFonts

Delphi XE6透過backendpush發推播訊息

昨天在Codedata發表的那篇「Delphi APP 開發入門(七)通知與雲端推播」,網友問說可不可以自己寫一個Windows程式推播?當然是可以的!

一、到 Kinvey 中Addons -> Business Logic -> Custom Endpoints

Custom-Endpoints01

二、按下New新增,增加一個名稱為sendMessage的Endpoints

Custom-Endpoints02 Custom-Endpoints03

三、建立完成後在函數裡面加上下面的程式碼(如果對Custom Endpoints有興趣可以參考Custom Endpoints guide

Custom-Endpoints04

  var iOSAps = request.body.iosaps;
  var push = modules.push;
  var iOSExtras = request.body.iosextras;
  var androidPayload = request.body.androidpayload;
  var androidmessage = androidPayload.message;
  var message = request.body.message;
  push.broadcastPayload(iOSAps, iOSExtras, androidPayload);
  response.complete( 200 );

四、接著回到程式部份,我們要在KinveyProvider1的PushEndpoint 屬性設定為在kinvey新增的endpoint名稱’sendMessage’。接著在畫面上增加BackendPush1,將Provider 設定為 KinveyProvider1

五、在畫面上新增Edit元件以及Button元件,在Button的onclick元件中寫上程式碼如下

procedure TForm1.Button1Click(Sender: TObject);
begin
  backendpush1.GCM.Message := edit1.Text;
  backendpush1.Push;
end;

這樣就可以了!一樣附上原始碼供大家參考
https://github.com/superlevin/XE6KinveyPush

Xcode 6 beta下執行XE6 iOS程式問題解決

螢幕快照 2014-06-18 下午3.23.12

因為學習Swift語言的關係,就把XCode6 beta版本也安裝上來!不過卻發生要在iOS Simulator執行程式XE6開發的程式時,出現”Can’t load simulator framework’的錯誤訊息。

因為在網路上遍尋不著解決方案,索性自己發揮柯南精神解決。於是把問題鎖定在XCode的command line上面,在一番測試後果然找到問題就是它了~

在Xcode的Preferences中,有個Locations頁籤,裡面有command line tool,預設是 xcode6。改回成Xcode 5.1.1就可以了!分享給各位~

螢幕快照 2014-06-18 下午3.23.31 螢幕快照 2014-06-18 下午3.23.45

Delphi XE6 GCM+Kinvey推播

詳盡原文刊登於 Codedata

當APP不在前景執行時,能夠用自己的平台或伺服器發送通知給行動的一項技術。在iOS平台上有APNS(Apple Push Notification Service),而Android平台上則叫做GCM(Google Cloud Messaging),在今天我們先以Android的GCM搭配BaaS服務Kinvey為例子。

Google Cloud Messaging

1.進入網站 https://console.developers.google.com
07
2.輸入專案名稱跟專案ID
08
3.完成後,記得專案編號(等等在其他設定會用到)
09
4.接著點選API 找到 Google Cloud Messageing for Anroid 後按關閉按鈕打開

1112

五、點選建立新的金鑰

13

六、點選伺服器金鑰

14

七、如果沒有特別允許使用IP可以略過後按建立就行了

 

15

八、一樣要記得API金鑰
17

kinvey申請

在行動裝置的開發領域目前有個BaaS(後端即服務:Backend as a Service)的技術概念。BaaS是指為行動裝置開發者提供整合雲端的基礎服務,像是資料/文件的儲存或是帳號管理、訊息推送、社群網路整合等….
而在Delphi XE6中支援二個熱門的服務為Kinvey及Parse,在這邊我們以Kinvey做為例子。
1.進入Kinvey網站(http://www.kinvey.com/)按下Sign Up註冊
01

2.註冊帳號只要電子郵件跟密碼就行了

02

3.點選Individual 個人帳戶的Get Started即可

 

 

03

4.接著建立一個新的專案,平台的話選擇Other(其他)的REST API即可
04
5.建立完成後,右下角的API Keys要記下來06

6.接著我們要建立可以存取服務的使用者,點選上面的Addons,在Core內有Users點入22

7.接著點選Add User新增使用者23

8.只要輸入帳號密碼就可以,我們建立一個test使用者24

9. 建立完成後可以看見使用者列表

25

10.接著建立待會使用的 Push Notification,一樣在Addons的目錄下有一個Messaging,裡面有一個Push

18

11.接著我們將剛才在Google控制台的專案編號填入Project ID、API金鑰填入API Key,接著按下Save GCM Configuration。右上角會由inactive轉為active。這樣就完成了相關的申請跟設定,不過先別關掉它。等等會再使用到!19 20 21

程式開發

1.我們延續剛才的通知範例,在畫面加上ListView元件,將Align設為Bottom

螢幕快照 2014-06-17 下午3.40.05

2.接著在畫面上放上二個元件,一個是TKinveyProvider以及TPushEvents

螢幕快照 2014-06-17 下午3.40.38

螢幕快照 2014-06-17 下午3.41.01

3.PushEvents1中的AutoActivate、AutoRegisterDevice設為True以及Provider指定KinveyProvider1

螢幕快照 2014-06-17 下午3.41.33

4.設定 OnPushReceived事件,在裡面的程式寫上

螢幕快照 2014-06-17 下午3.42.21

1
2
3
4
5
procedure TForm1.PushEvents1PushReceived(Sender: TObject;
  const AData: TPushData);
begin
  ListView1.Items.Add.Text := AData.Message;
end;

5.接著在KinveyProvider1設定相關參數
螢幕快照 2014-06-17 下午3.43.31

6.最後開啟專案目錄下的AndroidManifest.template.xml(這個檔案是Delphi編譯過程中產生AndroidManifest.xml的範本檔。

在幾個位置加入設定
.<%uses-permisson%>後面加上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- GCM connects to Google Services. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!--
     Creates a custom permission so only this app can receive its messages.
     NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,
     where PACKAGE is the application's package name.
    -->
    <permission android:name="%package%.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
    <uses-permission android:name="%package%.permission.C2D_MESSAGE" />
    <!-- This app has permission to register and receive data message. -->
    <uses-permission
    android:name="com.google.android.c2dm.permission.RECEIVE" />

.</intent-filter></activity> 後面加上

1
2
3
4
5
6
7
8
<receiver
android:name="com.embarcadero.gcm.notifications.GCMNotification" android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND"
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <category android:name="%package%" />
  </intent-filter>
</receiver>

接著就可以執行程式了!
程式執行後,我們回到Kinvey網站,輸入要推播的訊息後按 Send Push Notification
pushmessage

可以看到程式的Listview會出現推播的訊息。

1907712_10152077090231541_3460962835102390423_n

最後附上原始碼

https://github.com/superlevin/xe6notification

RAD Studio XE6, Delphi XE6, C++ Builder XE6網路研討會

看到信箱躺著網路研討會的訊息,覺得還不錯分享給大家了!其實我還蠻常三更半夜參加Embarcadero總公司發佈的研討會~

報名連結

如果您苦於尋找快速, 強大的移動平台和Windows/Mac開發工具, 那麼您一定要來體驗一下RAD Studio XE6, Delphi XE6, C++ Builder XE6, 因為RAD Studio XE6可讓您使用一套程式碼同時開發Windows, iOS/Android和Mac平台的應用程式.
邀請您一起來探討 XE6 新的 VCL/Windows 及 FMX multi-device 開發優勢,讓您的 app 應用開發更上層樓。

日期: 2014 年 6 月 17 日星期二
時間: 10:00 AM – 11:00 AM CST

delphi XE6 switch元件簡繁體問題

XE6的Switch元件增加了多國語系的功能,不過很遺憾的是它在中文的部份只認得zh,不會分辨zh_CN、zh_TW、zh_SG跟zh_HK。但是幸好Delphi是可以自己修正原始碼的 🙂

 

將 Program Files\Embarcadero\Studio\14.0\source\fmx下的

FMX.Styles.Switch.pas與FMX.Platform.Android.pas複製到自己專案的目錄下

 
FMX.Styles.Switch.pas
第42行修改如下

	// 2014.5.29 by lin shou shan
	// 修正switch文字只有簡體中文問題
    //LocalizedStates: array [0..6] of TStatesForLocale = (
	LocalizedStates: array [0..7] of TStatesForLocale = ( // by lin shou shan
      (Locale: 'en'; OnText: 'ON'; OffText: 'OFF'),
      (Locale: 'jp'; OnText: 'ON'; OffText: 'OFF'),
      (Locale: 'ja'; OnText: 'ON'; OffText: 'OFF'),
      (Locale: 'ko'; OnText: 'ON'; OffText: 'OFF'),
      (Locale: 'de'; OnText: 'AN'; OffText: 'AUS'),
      (Locale: 'fr'; OnText: 'OUI'; OffText: 'NON'),
      //(Locale: 'zh'; OnText: #25171#24320; OffText: #20851#38381)  // by lin shou shan
	  (Locale: 'zh_CN'; OnText: #25171#24320; OffText: #20851#38381),  // by lin shou shan
	  (Locale: 'zh_TW'; OnText: '開'; OffText: '關')  // by lin shou shan
    );

FMX.Platform.Android.pas
第3330行修改如下

function TPlatformAndroid.GetCurrentLangID: string;
var
  Locale: JLocale;
begin
  Locale := TJLocale.JavaClass.getDefault;
  Result := JStringToString(Locale.toString); // 回傳 zh_TW 2014.5.29 lin shou shan
  //Result := JStringToString(Locale.getISO3Language);  // lin shou shan
  //if Length(Result) > 2 then             // lin shou shan
  //  Delete(Result, 3, MaxInt);    // lin shou shan
end;

5/7 Delphi XE6 發表研討會台中場

報名了台中場次!其實重點是要看看有興趣的人多不多~

研討會內容:

  • 令人震撼的新技術 – App Tethering
  • 最先進且業界唯一的完整 C++ for Android 開發工具
  • 最具潛力的雲端技術 – BaaS
  • 強化的執行效率和品質
  • 以及更多的新功能

場次:

  • 103 年 5 月 6 日 (二) 2:00~5:00pm (台北)
  • 103 年 5 月 7 日 (三) 2:00~5:00pm (台中)
  • 103 年 5 月 8 日 (四) 2:00~5:00pm (高雄)
  • 103 年 5 月 9 日 (五) 2:00~5:00pm (新竹)

主講人:

  • Marco Cantu, Product Manager of RAD Studio, Embarcadero
  • 李 維, Embarcadero 大中華區技術總監

台中
103 年 5 月 7 日 (三)

2:00pm~5:00pm
日內瓦會議中心
台中市忠明南路303號17F
亞洲廳

 

報名網址: http://forms.embarcadero.com/AP14Q2TWDeveloperDirectLIVE

Delphi XE6(RAD Studio XE6)讓部落格流量增加?

blogstatus

自從XE4之後,發現自己的部落格有個很妙的現象!

只要遇到 Embarcadero有發表新的RAD STUDIO版本,

部落格的流量就會增加!

昨天 RAD STUDIO XE6發表後也是如此,呈現一柱擎天的現象~

不過老實說台灣關注 Delphi 或 RAD STUDIO的人數真的少很多

除了小弟之外,大概就是

縹緲’s blog

賈氏柏的屋簷下

自己也有在FB成立社群

Delphi Developer【Delphi開發者】

歡迎大家多多聯繫囉!