Перейти к содержанию
Fire Monkey от А до Я
  • 0

Открытие ссылки в проекте Firemonkey


x11

Вопрос

Нет ли у FMX готовой функции для открытия веб-ссылок из приложения?

А то приходится городить огород с лисапетами и кучей IFDEF.

В итоге что у меня получилось.

Для удобства разнес все по разным модулям.

Модуль для Windiws

unit uUtilsWindows;

interface

{$IFDEF MSWINDOWS}
uses ShellApi, Variants, Windows, FMX.Types, FMX.Platform.Win;

  procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle);
{$ENDIF}

implementation

{$IFDEF MSWINDOWS}
procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle);
begin
  ShellExecute(FmxHandleToHWND(WindowHandle), 'open', PChar(VarToStr(sURL)), nil, nil, SW_NORMAL);
end;
{$ENDIF}


end.

 

Модуль для Android

unit uUtilsAndroid;

interface

{$IFDEF ANDROID}
uses FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText,
      AndroidApi.Helpers;

  procedure AndroidOpenUrl(const sUrl: string);
{$ENDIF}

implementation

{$IFDEF ANDROID}
procedure AndroidOpenUrl(const sUrl: string);
Var
  Uri: Jnet_Uri;
  OpenLinkIntent: JIntent;
begin

  Uri := StrToJURI(sUrl);
  OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);// будем что-то смотреть
  OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);// смотреть в браузере
  OpenLinkIntent.setData(Uri);// смотреть эту ссылку
  SharedActivity.startActivity(OpenLinkIntent);// открываем
end;
{$ENDIF}

end.

 

теперь в основной форме:

uses ..., ...{$IFDEF ANDROID}, vkbdhelper, uUtilsAndroid{$ENDIF} {$IFDEF MSWINDOWS}, uUtilsWindows {$ENDIF};
...
...
...
procedure TfmEditObject.actOpenUrlExecute(Sender: TObject);
begin
  {$IFDEF ANDROID}AndroidOpenUrl(edMapsCoordUrl.Text);{$ENDIF}
  {$IFDEF MSWINDOWS}WindowsOpenUrl(edMapsCoordUrl.Text, Self.Handle);{$ENDIF}
end;

 

А если добавлять ещё одну платформу, то ещё один модуль понадобится.

Может есть более правильный вариант, так сказать, дизайна исходного кода?

 

Изменено пользователем x11
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Вот какая проблема.

Команда ShellExecute на Windows 10 открывает не только браузер и сайт, но и потом сразу же диалоговое окно выбора файла.

Странно.

Воспроизводится так.

На Multiview лежит Layout, на Layout лежит ImageControl с картинкой. У ImageControl в OnClick прописана строка вызова процедуры со ссылкой.

Изменено пользователем x11
Ссылка на комментарий
  • 0
В 19.08.2017 в 18:34, x11 сказал:

А то приходится городить огород с лисапетами и кучей IFDEF.

Вы не там ифдефы пишете. Не нужно здесь много модулей.
Для примера. (емнип - автор @Равиль Зарипов (ZuBy) ). Единая точка входа в функцию и отличаются только внутренности.

function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
var
  {$IFDEF ANDROID}
  Intent: JIntent;
  {$ENDIF}
  {$IFDEF IOS}
  NSU: NSUrl;
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  Res: HINST;
  {$ENDIF}
begin
  {$IFDEF ANDROID}
  // There may be an issue with the geo: prefix and URLEncode.
  // will need to research
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
    TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(URL))));
  try
    TAndroidHelper.Activity.startActivity(Intent);
    exit(true);
  except
    on e: Exception do
      begin
        if DisplayError then
          TDialog.ShowMessage('Error: ' + e.Message);
        exit(False);
      end;
  end;
  {$ENDIF}
  {$IFDEF IOS}
  // iOS doesn't like spaces, so URL encode is important.
  NSU := StrToNSUrl(URL);
  if SharedApplication.canOpenURL(NSU) then
    exit(SharedApplication.OpenURL(NSU))
  else
    begin
      if DisplayError then
        TDialog.ShowMessage('Error: Opening "' + URL + '" not supported.');
      exit(False);
    end;
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  Res := ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOW);
  Result := Res > 32;
  {$ENDIF}
end;

И теперь "снаружи" этой функции вам без разницы, под какую платформу идет сборка. В любом случае вы пишете "OpenURL('http://blablabla.net');". Безо всяких IFDEF.

Изменено пользователем kami
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...