Difference between revisions of "Mac Show Application Title, Version, and Company/ru"

From Free Pascal wiki
Jump to navigationJump to search
Line 3: Line 3:
 
{{LanguageBar}}
 
{{LanguageBar}}
  
{{Warning|This only works '''if''' the software has an application bundle; otherwise please see [[Show Application Title, Version, and Company#macOS and iOS|Show Application Title, Version, and Company]]}}
+
{{Warning|Это работает, только '''если''' у программного обеспечения есть пакет приложений; в противном случае см. пожалуйста [[Show_Application_Title,_Version,_and_Company/ru#macOS_.D0.B8_iOS|Show Application Title, Version, and Company]]}}
  
 
Для тех, кто хочет показать название приложения, версию и компанию для приложения в Mac OSX, это можно сделать с помощью следующего метода.
 
Для тех, кто хочет показать название приложения, версию и компанию для приложения в Mac OSX, это можно сделать с помощью следующего метода.
  
'''Beware''' ''CFBundleGetMainBundle'' does not really return '''nil''' if application has no bundle. Instead it tries to create that handle. See [https://developer.apple.com/documentation/corefoundation/1537085-cfbundlegetmainbundle?language=objc Apple's documentation]. So we should check ''ValueRef'' existence too.
+
'''Осторожно''' ''CFBundleGetMainBundle'' на самом деле не возвращает '''nil''', если у приложения нет пакета. Вместо этого он пытается создать этот дескриптор. См. [https://developer.apple.com/documentation/corefoundation/1537085-cfbundlegetmainbundle?language=objc документацию Apple]. Таким образом, мы должны также проверить наличие ''ValueRef''.  
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">

Revision as of 14:52, 18 August 2020

macOSlogo.png

Эта статья относится только к macOS.

См. также: Multiplatform Programming Guide

English (en) русский (ru)

Warning-icon.png

Предупреждение: Это работает, только если у программного обеспечения есть пакет приложений; в противном случае см. пожалуйста Show Application Title, Version, and Company

Для тех, кто хочет показать название приложения, версию и компанию для приложения в Mac OSX, это можно сделать с помощью следующего метода.

Осторожно CFBundleGetMainBundle на самом деле не возвращает nil, если у приложения нет пакета. Вместо этого он пытается создать этот дескриптор. См. документацию Apple. Таким образом, мы должны также проверить наличие ValueRef.

// CODE FOR SHOWING APPLICATION TITLE, VERSION, AND COMPANY
uses MacOSAll, CarbonProc, StrUtils;

var
  BundleID: String;
  BundleName: String;
  BundleRef: CFBundleRef;
  BundleVer: String;
  CompanyName: String;
  KeyRef: CFStringRef;
  ValueRef: CFTypeRef;

function GetInfoPlistString(const KeyName : string) : string;
begin
  try
    Result := '';
    BundleRef := CFBundleGetMainBundle;
    if BundleRef = nil then Exit;  {Executable not in an app bundle?}
    KeyRef := CFStringCreateWithPascalString(nil,KeyName,kCFStringEncodingUTF8);
    ValueRef := CFBundleGetValueForInfoDictionaryKey(BundleRef, KeyRef);
    if ValueRef = nil then Exit;  {Executable not in an app bundle!}
    if CFGetTypeID(ValueRef) <> CFStringGetTypeID then Exit;  {Value not a string?}
    Result := CFStringToStr(ValueRef);
  except
  on E : Exception do
    ShowMessage(E.Message);
  end;
  FreeCFString(KeyRef);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   try
     Form1.Caption := 'About '+Application.Title;
     StaticTextAppTitle.Caption := Application.Title;
     BundleID := GetInfoPlistString('CFBundleIdentifier');
     '''// CompanyName is presumed to be in the form of: com.Company.AppName'''
     CompanyName := AnsiMidStr(BundleID,AnsiPos('.',BundleID)+1,Length(BundleID));
     CompanyName := AnsiMidStr(CompanyName,0,AnsiPos('.',CompanyName)-1);
     BundleVer := GetInfoPlistString('CFBundleVersion');
     StaticTextAppVer.Caption := Application.Title+' version '+BundleVer;
     StaticTextCompany.Caption := CompanyName;
   except
   on E : Exception do
          ShowMessage(E.Message);
   end;
end;

Sample output:

About1.png

See also