2012-11-12 27 views
5

フォントピッカーを作成するには、Firemonkeyで使用可能なフォントのリストを取得する必要があります。 Screen.FontsはFireMonkeyには存在しないので、私はFMX.Platformを使用する必要があると思いましたか? 例:利用可能なフォントのリストを取得する方法 - Delphi XE3 + Firemonkey 2?

if TPlatformServices.Current.SupportsPlatformService(IFMXSystemFontService, IInterface(FontSvc)) then 
    begin 
    edit1.Text:= FontSvc.GetDefaultFontFamilyName; 
    end 
    else 
    edit1.Text:= DefaultFontFamily; 

しかし、利用可能な唯一の機能は、デフォルトのフォント名を返すことです。

現時点では、私はクロスプラットフォームのサポートについては心配していませんが、私がFiremonkeyに移行しようとしたら、可能であればWindowsコールに頼ることはありません。

答えて

7

条件付き定義でMacApi.AppKitとWindows.Winapiを一緒に使用する必要があります。

まず、あなたのuses節にこれらのコードを追加します。

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

を次に、あなたの実装にこのコードを追加します。

{$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; 

今、あなたはCollectFontsプロシージャを使用することができます。非nil TStringlistを手続きに渡すことを忘れないでください。典型的な使い方はこのようなものかもしれません。用途にFMX.Printerを宣言

Printer.ActivePrinter; 
    memo1.lines.AddStrings(Printer.Fonts); 

procedure TForm1.FormCreate(Sender: TObject); 
var fList: TStringList; 
    i: Integer; 
begin 
    fList := TStringList.Create; 
    CollectFonts(fList); 
    for i := 0 to fList.Count -1 do 
    begin 
    ListBox1.Items.Add(FList[i]); 
    end; 
    fList.Free; 
end; 
+0

ありがとうございました!私はそれを試してみる機会が得られたら正解だと思っていますが、それは私にとって素晴らしい答えのようです:) – sergeantKK

+0

こんにちは、私のブログをチェックして、全面的な解決策を見てください:http://delphiscience.wordpress.com/2012/11/20/getting-system-fonts-list-in-firemonkey-the-new-tplatformextensions-class/ –

+0

@ mehmed.aliところで、ここにあなたのブログのホームページへのリンクを追加することができる場所があります。 –

3

私は、次のソリューションを使用しました。

+0

ありがとうございます - それも同様に動作するようです! – sergeantKK

+0

こんにちは、MAcSideでテストしましたか? TPrinterのRefreshFontsメソッドはMacSideには実装されていないので、あなたのコードをクロスプラットフォームにすることはできません。 –

0

unit Unit1; 

interface 

uses 
    Windows, SysUtils, Classes, Forms, Controls, StdCtrls; 

type 
    TForm1 = class(TForm) 
    ComboBox1: TComboBox; 
    procedure FormShow(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.DFM}      

procedure TForm1.FormShow(Sender: TObject); 
begin 
    ComboBox1.Items.Assign(Screen.Fonts); 
    ComboBox1.Text := 'Fonts...'; 
end; 

end. 

関連する問題