Difference between revisions of "Mac Show Application Title, Version, and Company/ru"
From Free Pascal wiki
Jump to navigationJump to searchLine 3: | Line 3: | ||
{{LanguageBar}} | {{LanguageBar}} | ||
− | {{Warning| | + | {{Warning|Это работает, только '''если''' у программного обеспечения есть пакет приложений; в противном случае см. пожалуйста [[Show_Application_Title,_Version,_and_Company/ru#macOS_.D0.B8_iOS|Show Application Title, Version, and Company]]}} |
Для тех, кто хочет показать название приложения, версию и компанию для приложения в Mac OSX, это можно сделать с помощью следующего метода. | Для тех, кто хочет показать название приложения, версию и компанию для приложения в Mac OSX, это можно сделать с помощью следующего метода. | ||
− | ''' | + | '''Осторожно''' ''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
Эта статья относится только к macOS.
См. также: Multiplatform Programming Guide
│ English (en) │ русский (ru) │
Предупреждение: Это работает, только если у программного обеспечения есть пакет приложений; в противном случае см. пожалуйста 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: