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| | + | {{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"> | ||
− | // | + | // КОД ДЛЯ ПОКАЗА НАЗВАНИЯ, ВЕРСИИ И КОМПАНИИ ПРИЛОЖЕНИЯ |
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'); | ||
− | '''// | + | '''// Предполагается, что имя компании имеет формат: 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> | ||
− | + | Пример вывода: | |
[[File:About1.png]] | [[File:About1.png]] | ||
− | == | + | == См.также == |
*[[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
Эта статья относится только к macOS.
См. также: Multiplatform Programming Guide
│ English (en) │ русский (ru) │
Предупреждение: Это работает, только если у программного обеспечения есть пакет приложений; в противном случае см. пожалуйста 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;
Пример вывода: