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

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; fixed wiki markup)
m (Rationalised macOS categories)
Line 1: Line 1:
{{Platform only|Mac OS X|Mac OS X|Mac OS X}}
+
{{Platform only|macOS}}
Also see [[Show Application Title, Version, and Company]].
+
{{LanguageBar}}
 +
 
 +
{{Warning|This only works '''if''' the software has an application bundle; otherwise please see [[Show Application Title, Version, and Company#Mac OS X and iOS|Show Application Title, Version, and Company]]}}
  
 
For those who want to show the Application Title, Version, and Company for an application on  Mac OSX, this can be done using the following method.
 
For those who want to show the Application Title, Version, and Company for an application on  Mac OSX, this can be done using the following method.
  
This only works '''if''' the application has an application bundle; otherwise please see [[Show Application Title, Version, and Company#Mac OS X and iOS]].
+
'''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.
 
 
----
 
'''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'' existance too.
 
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 67: Line 64:
 
== See also ==
 
== See also ==
 
*[[Mac Preferences and About Menu]]
 
*[[Mac Preferences and About Menu]]
 +
*[[Show Application Title, Version, and Company]].
  
[[Category:Mac OS X]]
+
[[Category:macOS]]
 +
[[Category:Code Snippets]]

Revision as of 02:34, 14 December 2019

macOSlogo.png

This article applies to macOS only.

See also: Multiplatform Programming Guide

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

Warning-icon.png

Warning: This only works if the software has an application bundle; otherwise please see Show Application Title, Version, and Company

For those who want to show the Application Title, Version, and Company for an application on Mac OSX, this can be done using the following method.

Beware CFBundleGetMainBundle does not really return nil if application has no bundle. Instead it tries to create that handle. See Apple's documentation. So we should check ValueRef existence too.

// 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