• 0
x11

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

Вопросы

Нет ли у 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 ответа на этот вопрос

  • 0

ОК. Просто я думал, что я неправильно делаю.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От PavelS
      Здравствуйте! Начал изучать FireMonkey  и столкнулся с тем, что TBitmap не поддерживает размер изображения больше 8132, кажется. Т.е. большие размеры рисунка он грузит, но за счёт потери качества, размер пиксела растёт, а размер рисунка по оси всё равно не превышает 8132. В то же время в простом дельфи можно грузить и работать с гораздо большими размерами, например, один из файлов имеет размер 61216 х 1486 точек. Подскажите пожалуйста, есть ли возможность работать с большими файлами в FireMоnkey и как это можно организовать? Программа создаётся для работы только в Windows.
    • От SIARHEI RAHOUSKI
      Создал проект там куча компонентов. Но разворачивании формы на весь экран компоненты размер не меняют:
      Прочитал про свойства align Но как только я выставлю Group box например left другим right все сбивается в кучу и поправить это не могу. 
      Как настроить align ?

    • От SIARHEI RAHOUSKI
      Как сделать форму с компонентами под все разрешения?

    • От SIARHEI RAHOUSKI
      Как сделать мозаику (drag/drop) ? Получается есть 2 прямоугольника (которые надо перетаскивать)  и есть ещё 2 прямоугольника (которые должны принимать) и ещё есть кнопка проверки. При нажатии определяет правильно ли разместили прямоугольники.
    • От SIARHEI RAHOUSKI
      Как задать градиентную заливку TChart? именно самих столбцов. 

    • От SIARHEI RAHOUSKI
      При нажатии на Label действия не происходят
      procedure TForm2.Label11Click(Sender: TObject);
      begin
      Button1.visible:= true;
      {label7.Font.Style:= [];
      label8.Font.Style := [];
      label9.Font.Style := [];
      //label11.Font.Style := [fsbold];
      label10.Font.Style := [];  }

        GroupBox12.Visible := false;
        GroupBox13.Visible := false;
        GroupBox14.Visible := false;
        GroupBox15.Visible := true;
        GroupBox16.Visible := false;
      end;
    • От fredhack
      Доброго времени суток подскажите пожалуйста как мне получить ссылку из браузера запущенного через intent в общем суть такова:
      1 запускаю браузер через интент с сылкой http://fire-monkey.ru
      2 на ссылке происходит редирект
      3 я попадаю на http://fire-monkey.ru/forum/
      Как получить последнюю ссылку после редиректа? в данном случае она равна http://fire-monkey.ru/forum/
      var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.setData(StrToJURI('http://fire-monkey.ru')); SharedActivity.startActivity(Intent); end;  
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу