2011-09-16 39 views
27

Thông thường, tôi sử dụng: ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);Làm cách nào để mở một URL bằng trình duyệt mặc định với các ứng dụng đa nền tảng FireMonkey?

Làm thế nào tôi có thể có hành vi tương tự (mở một liên kết trong trình duyệt mặc định), trên tất cả các nền tảng (Windows OSX)?

+3

Bạn nên đăng bài này giải pháp như một câu trả lời và chấp nhận nó. Tôi sẽ cung cấp +1 :-) –

+1

Đồng ý. Tách câu trả lời của bạn ra khỏi các câu hỏi. Đó là cách nó phải được thực hiện ở đây trên StackOverflow :-) – LachlanG

+1

Ok, tôi di chuyển nó ... hãy cân nhắc đưa +1 cho câu trả lời của mjn vì mã này chỉ là bản dịch những gì anh ấy đã giải thích cho tôi; o) – Whiler

Trả lời

12

Trong diễn đàn thảo luận FireMonkey tôi tìm thấy mã này cho một câu hỏi về NSWorkspace.URLForApplicationToOpenURL:

uses 
    Posix.Stdlib; 
.... 
    _system(PAnsiChar('open ' + ACommand)); 

(không thử nghiệm của tôi)


Cập nhật: Posix là không có sẵn trên Windows nên không thể viết giải pháp sử dụng cùng một cuộc gọi hệ điều hành trên tất cả các nền tảng. Tôi đề xuất chuyển mã như vậy trong đơn vị 'XPlatform' trung tâm có một số POSIX IFDEF, v.v.

+0

Tôi cố gắng (trên Windows) và cho bạn biết ... – Whiler

+0

; o (đơn vị này không tồn tại trong XE2 ... – Whiler

+0

Tôi hiểu ifdef ...nhưng tôi không biết cách xây dựng một ứng dụng có sử dụng không tồn tại, o ( – Whiler

17

Về câu trả lời của mjn, tôi đã viết đơn vị sau đây. Tôi đã thử nghiệm thành công nó trên Windows nhưng tôi không có một OSX để kiểm tra nó trên nền tảng này. Nếu ai đó có thể xác nhận nó hoạt động, tôi sẽ đánh giá cao.

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. 

và tôi gọi nó là như thế này:

TMisc.Open('https://stackoverflow.com/questions/7443264/how-to-open-an-url-with-the-default-browser-with-firemonkey-cross-platform-applic'); 
+3

Thử nghiệm trên Windows 32 & 64bits và trên mac OSX: hoạt động; o) – Whiler

1

Và bây giờ là một C++ phiên bản (OSX đang chưa được kiểm tra, cũng không chắc chắn về #def _POSIX):

#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 
} 
3

XE2 C++ mã được thử nghiệm thành công (Windows 7 64 và OSX Lion), những cải tiến nhỏ. Whiler Thank của, nỗi đau đã qua :)

#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 
} 
+0

Hãy cẩn thận ... một số ký tự có thể tạo ra vấn đề .... ví dụ, hãy thử một URL với '()' ... '()' được giải thích bởi 'mở' ... bạn cần phải đóng gói URL bằng' '' ; o) – Whiler

0
_system(PAnsiChar('open ' + AnsiString(sCommand))); 

không hoạt động nếu chuỗi URL (sCommand) bao gồm char dấu và (&), cần thiết phải xác định nhiều đối số trong chuỗi truy vấn.

URL được sử dụng để xóa. trình duyệt trong OSX (Safari) bị cắt ngắn vào lần xuất hiện đầu tiên của &.

1

Như @NicoBlu đã đề cập, giải pháp được chấp nhận dường như cắt ngắn URL sau lần xuất hiện đầu tiên của '&'. Đây là những gì làm việc cho tôi mà không cần cắt ngắn:

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; 
0
LEncodedString : String; 

begin 
    LEncodedString := TIdURI.URLEncode('http://www.malcolmgroves.com'); 
    sharedApplication.openURL(StringToNSURL(LEncodedString)); 
end; 
+0

nơi điều đó được chia sẻA đối tượng pplication đến từ đâu? –

+0

câu hỏi hay @ TuncayGöncüoğlu! Tôi không có quyền truy cập vào dự án của mình vào cuối tuần nên tôi không chắc chắn 100% nhưng hãy xem mẫu mã của câu trả lời đầu tiên [link] (https://stackoverflow.com/questions/16354876/opening-url- trong ứng dụng ios) –

2

Đối với tất cả các nền tảng (Windows, MacOS, iOS và Android), bạn có thể sử dụng đơn vị tôi đã viết cho my blog

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. 
Các vấn đề liên quan