2012-11-12 20 views
5

Yazı tipi seçicisi oluşturmak için Firemonkey'de kullanılabilen yazı tipleri listesini almam gerekir. FireMonkey'de Screen.Fonts bulunmadığı için FMX.Platform'u kullanmam gerektiğini düşündüm? örn:Kullanılabilir yazı tipleri listesi nasıl elde edilir - Delphi XE3 + Firemonkey 2?

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

Ancak sadece mevcut işlev varsayılan yazı tipi adı döndürmektir. Ben çapraz platform desteği hakkında rahatsız ama ben daha çok Windows üzerinde güvenmeyin ediyorum FireMonkey geçmek için gidiyorum eğer mümkünse çağırır değilim anda

.

cevap

7

çapraz platform çözeltisi koşullu tanımlayıp birlikte MacApi.AppKit ve Windows.Winapi kullanmalıdır.

Önce kullandığı maddeye bu kodu ekleyin:

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

Sonra uygulanması için bu kodu ekleyin:

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

Artık CollectFonts yordamı kullanabilirsiniz. Nil olmayan bir TStringlist'i prosedüre geçirmeyi unutmayın. Tipik kullanım böyle olabilir. kullanımlarda FMX.Printer ilan

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

Çok teşekkür ederim! Bunu test etmek için şans ben doğru olarak kabul ederiz ancak Merhaba, tam çalışma çözüm görmek bloguma kontrol edebilirsiniz – sergeantKK

+0

:) Benim için çok büyük bir cevap gibi görünüyor: http://delphiscience.wordpress.com/2012/11/20/alma-sistem-yazı tipleri-liste-in-firemonkey-yeni-tplatformextensions-sınıf/ –

+0

@ mehmed.ali Bu arada; Profilinizde, blogunuzun ana sayfasına bir bağlantı ekleyebileceğiniz (ve eklemelisiniz) bir yer var. –

3

ben aşağıdaki çözümü kullandım.

+0

Teşekkürler - bu da işe yarıyor gibi görünüyor! – sergeantKK

+0

Merhaba, MAcSide üzerinde test ettiniz. TPRinter'ın RefreshFonts yöntemi MacSide'de uygulanmadı, bu yüzden kullanırsanız kodunuzun çapraz platform olmayacağını düşünüyorum. –

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.