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

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Platform only|macOS}} {{LanguageBar}} {{Warning|This only works '''if''' the software has an application bundle; otherwise please see Show Application Title, Version, and...")
 
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{Platform only|macOS}}
 
{{Platform only|macOS}}
 +
 
{{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">
// CODE FOR SHOWING APPLICATION TITLE, VERSION, AND COMPANY
+
// КОД ДЛЯ ПОКАЗА НАЗВАНИЯ, ВЕРСИИ И КОМПАНИИ ПРИЛОЖЕНИЯ
 
uses MacOSAll, CarbonProc, StrUtils;
 
uses MacOSAll, CarbonProc, StrUtils;
  
Line 45: Line 46:
 
     StaticTextAppTitle.Caption := Application.Title;
 
     StaticTextAppTitle.Caption := Application.Title;
 
     BundleID := GetInfoPlistString('CFBundleIdentifier');
 
     BundleID := GetInfoPlistString('CFBundleIdentifier');
     '''// CompanyName is presumed to be in the form of: com.Company.AppName'''
+
     '''// Предполагается, что имя компании имеет формат: com.Company.AppName'''
 
     CompanyName := AnsiMidStr(BundleID,AnsiPos('.',BundleID)+1,Length(BundleID));
 
     CompanyName := AnsiMidStr(BundleID,AnsiPos('.',BundleID)+1,Length(BundleID));
 
     CompanyName := AnsiMidStr(CompanyName,0,AnsiPos('.',CompanyName)-1);
 
     CompanyName := AnsiMidStr(CompanyName,0,AnsiPos('.',CompanyName)-1);
Line 58: Line 59:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Sample output:
+
Пример вывода:
  
 
[[File:About1.png]]
 
[[File:About1.png]]
  
== See also ==
+
== См.также ==
 
*[[Mac Preferences and About Menu]]
 
*[[Mac Preferences and About Menu]]
 
*[[Show Application Title, Version, and Company]].
 
*[[Show Application Title, Version, and Company]].

Latest revision as of 14:54, 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.

// КОД ДЛЯ ПОКАЗА НАЗВАНИЯ, ВЕРСИИ И КОМПАНИИ ПРИЛОЖЕНИЯ
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');
     '''// Предполагается, что имя компании имеет формат: 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;

Пример вывода:

About1.png

См.также