通常、私は以下を使用します:ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);
すべてのプラットフォーム(WindowsおよびOSX)で同じ動作(デフォルトのブラウザーでリンクを開く)を行うにはどうすればよいですか?
通常、私は以下を使用します:ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);
すべてのプラットフォーム(WindowsおよびOSX)で同じ動作(デフォルトのブラウザーでリンクを開く)を行うにはどうすればよいですか?
mjnの答えについては、次の単元を書きました。Windowsでのテストに成功しましたが、このプラットフォームでテストするためのOSXがありません。誰かがそれが機能することを確認できれば、私は感謝します。
unit fOpen;
interface
uses
{$IFDEF MSWINDOWS}
Winapi.ShellAPI, Winapi.Windows;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
Posix.Stdlib;
{$ENDIF POSIX}
type
TMisc = class
class procedure Open(sCommand: string);
end;
implementation
class procedure TMisc.Open(sCommand: string);
begin
{$IFDEF MSWINDOWS}
ShellExecute(0, 'OPEN', PChar(sCommand), '', '', SW_SHOWNORMAL);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
_system(PAnsiChar('open ' + AnsiString(sCommand)));
{$ENDIF POSIX}
end;
end.
そして私はそれをこのように呼びます:
TMisc.Open('https://stackoverflow.com/questions/7443264/how-to-open-an-url-with-the-default-browser-with-firemonkey-cross-platform-applic');
FireMonkeyディスカッションフォーラムで、NSWorkspace.URLForApplicationToOpenURLに関する質問の次のコードを見つけました。
uses
Posix.Stdlib;
....
_system(PAnsiChar('open ' + ACommand));
(私はテストしていません)
更新:PosixはWindowsで使用できないため、すべてのプラットフォームで同じOS呼び出しを使用するソリューションを作成することはできません。このようなコードは、IFDEFPOSIXなどがある中央の「XPlatform」ユニットに移動することをお勧めします。
すべてのプラットフォーム(Windows、macO、iOS、Android)で、ブログ用に作成したユニットを使用できます
unit u_urlOpen;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
{$IF Defined(IOS)}
macapi.helpers, iOSapi.Foundation, FMX.helpers.iOS;
{$ELSEIF Defined(ANDROID)}
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Net,
Androidapi.JNI.App,
Androidapi.helpers;
{$ELSEIF Defined(MACOS)}
Posix.Stdlib;
{$ELSEIF Defined(MSWINDOWS)}
Winapi.ShellAPI, Winapi.Windows;
{$ENDIF}
type
tUrlOpen = class
class procedure Open(URL: string);
end;
implementation
class procedure tUrlOpen.Open(URL: string);
{$IF Defined(ANDROID)}
var
Intent: JIntent;
{$ENDIF}
begin
{$IF Defined(ANDROID)}
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setData(StrToJURI(URL));
tandroidhelper.Activity.startActivity(Intent);
// SharedActivity.startActivity(Intent);
{$ELSEIF Defined(MSWINDOWS)}
ShellExecute(0, 'OPEN', PWideChar(URL), nil, nil, SW_SHOWNORMAL);
{$ELSEIF Defined(IOS)}
SharedApplication.OpenURL(StrToNSUrl(URL));
{$ELSEIF Defined(MACOS)}
_system(PAnsiChar('open ' + AnsiString(URL)));
{$ENDIF}
end;
end.
正常にテストされたXE2C++コード(Windows 764およびOSXLion)、マイナーな改善。ありがとうWhiler、痛みは終わった:)
#include <fmx.h>
// ---------------------------------------------------------------------------
#ifdef _WIN32
#include <shellapi.h>
#endif// Windows
#ifdef TARGET_OS_MAC
#include <Posix.Stdlib.hpp>
#endif // Mac
void OpenCommand(String _sCommand) {
#ifdef _Windows
String open = "open";
ShellExecute(0, open.w_str(), _sCommand.c_str(), NULL, NULL, SW_SHOWNORMAL);
#endif // Windows
#ifdef TARGET_OS_MAC
system(AnsiString("open " + AnsiString(_sCommand)).c_str());
#endif // Mac
}
そして今、C ++バージョン(OSxコードはテストされておらず、_POSIX #defについてもわかりません):
#ifdef _Windows
#include <Winapi.Windows.hpp>
#endif // _Windows
#ifdef _POSIX
#include <Posix.Stdlib.h>
#endif // _POSIX
void OpenCommand(String _sCommand)
{
#ifdef _Windows
ShellExecute(0, _T("open"), _sCommand.c_str(), _T(""), _T(""), SW_SHOWNORMAL);
#endif // _Windows
#ifdef _POSIX
_system(AnsiString("open " + AnsiString(_sCommand)).c_str());
#endif // _POSIX
}
@NicoBluが述べたように、受け入れられたソリューションは、「&」が最初に出現した後にURLを切り捨てているようです。切り捨てなしで私に役立つものは次のとおりです。
uses Macapi.AppKit, Macapi.Foundation, Macapi.Helpers;
// ...
procedure OpenLinkInDefaultBrowser(const Link: string);
var URL : NSURL;
Workspace : NSWorkspace;
begin
URL := TNSURL.Wrap(TNSURL.OCClass.URLWithString(StrToNSStr(Link)));
Workspace := TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);
Workspace.openURL(URL);
end;
_system(PAnsiChar('open ' + AnsiString(sCommand)));
URL文字列(sCommand
)にアンパサンド文字()が含まれている場合は機能しません。これ&
は、クエリ文字列で多くの引数を指定するために必要です。
defに送信されたURL。OSX(Safari)のブラウザは、の最初の出現時に切り捨てられ&
ます。
LEncodedString : String;
begin
LEncodedString := TIdURI.URLEncode('http://www.malcolmgroves.com');
sharedApplication.openURL(StringToNSURL(LEncodedString));
end;