2011-09-16 15 views
27

Di solito, io uso: ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);Come aprire un URL con il browser predefinito con le applicazioni multipiattaforma FireMonkey?

Come posso avere lo stesso comportamento (l'apertura di un link nel browser di default), su tutte le piattaforme (Windows e OSX)?

+3

Si consiglia di inviare questo soluzione come risposta e accettarla. Darò un +1 :-) –

+1

concordato. Separa le tue risposte dalle domande. Ecco come dovrebbe essere fatto qui su StackOverflow :-) – LachlanG

+1

Ok, lo sposto ... per favore considera di dare +1 alla risposta di mjn in quanto questo codice è solo una traduzione di ciò che mi ha spiegato; o) – Whiler

risposta

12

nel forum di discussione FireMonkey Ho trovato questo codice per una domanda sul NSWorkspace.URLForApplicationToOpenURL:

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

(non testato da me)


Aggiornamento: Posix non è disponibile su Windows quindi non è possibile scrivere una soluzione che utilizza le stesse chiamate del sistema operativo su tutte le piattaforme. Suggerisco di spostare tale codice in un'unità centrale XPlatform che ha un POSIX IFDEF ecc.

+0

Io provo (su Windows) e facci sapere ... – Whiler

+0

; o (questa unità non esiste in XE2 ... – Whiler

+0

Capisco ifdef ...ma non so come costruire un'applicazione con usi che non esistono o ( – Whiler

17

Per quanto riguarda la risposta di mjn, ho scritto la seguente unità. L'ho provato con successo su Windows ma non ho un OSX per testarlo su questa piattaforma. Se qualcuno può confermare che funziona, lo apprezzerei.

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. 

e mi chiamano in questo modo:

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

Testato su Windows 32 e 64 bit e su mac OSX: funziona; o) – Whiler

1

Ed ora un ++ versione C (codice OSx non testato, inoltre, non sicuro circa l'#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++ codice testato con successo (Windows 7 64 e OSX Lion), miglioramenti minori. Whiler di Grazie, il dolore è più :)

#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

Attenzione ... alcuni caratteri possono generare problemi .... per esempio, prova un URL con '()' ... '()' sono interpretati da 'open' ... devi incapsulare l'URL con' '' ; o) – Whiler

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

non funziona se la stringa URL (sCommand) include char commerciale (&), necessarie per specificare molti argomenti in querystring.

URL inviato a def. il browser in OSX (Safari) viene troncato alla prima occorrenza di &.

1

Come menzionato @NicoBlu, la soluzione accettata sembra troncare l'URL dopo la prima occorrenza di "&". Qui è ciò che funziona per me senza troncamento:

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

dove è condiviso l'oggetto di pplication viene? –

+0

buona domanda @ TuncayGöncüoğlu! Non ho accesso al mio progetto per il fine settimana quindi non sono sicuro al 100% ma dare un'occhiata al codice di esempio della prima risposta [link] (https://stackoverflow.com/questions/16354876/opening-url- raggio-IO-applicazione) –

2

Per tutte le piattaforme (Windows, MacOS, iOS e Android) è possibile utilizzare l'unità che ho scritto per 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. 
Problemi correlati