• 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

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

Команда 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

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


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

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

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

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

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

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

Войти

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

Войти


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

    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
    • От Виталий Иванов
      Ошибка при запуске программы на отладку:
       
      "
      Can't open socket: Permission denied 
      Exiting
      .
      "
       
      кто знает как побороть ? 
       
      Отладку запускаю на OnePlus3 с Android 8.0.0, драйвера Google USB переустанавливал. 

    • От dim
      Есть код который работает при смещении карты и получив координаты центра пытаюсь получить адрес по ним.
      procedure TMasterDetailForm.MapView3CameraChanged(Sender: TObject); var myCoordinat: TLocationCoord2D; begin inherited; myCoordinat.Create(MapView3.Location.Latitude,MapView3.Location.longitude); if (int(myCoordinat.Latitude)<>0) then begin //проверяю, что координаты определены if not Assigned(fGeocoder) then begin if Assigned(fGeocoder.Current) then fGeocoder := TGeocoder.Current.Create; if Assigned(fGeocoder) then fGeocoder.OnGeocodeReverse := OnGeocodeReverseEventStart; end; if Assigned(fGeocoder) and not fGeocoder.Geocoding then fGeocoder.GeocodeReverse(myCoordinat); end end; все работало до очередного обновления, а сейчас ругается "java.io.IOException: Service not Available" на fGeocoder.GeocodeReverse(myCoordinat);
      подскажите куда копать
    • От striker
      Всем привет!
      Нужен совет.
      Есть Grid, в нем расписание дня.
      В БД каждая строка это отдельная запись.
      Нужно как-то визуально сделать подобие объединения ячеек в Excel.
      Т.е. нужно занять расписание на 2 часа.
      При этом функционал по событиям для строки "второго часа" должен быть недоступен.
      Может хотя бы границу стирать, т.е. оставлять значение в верхней ячейки, а нижнюю просто не отображать.
      Как это лучше сделать?
      FMX, Windows, Delphi XE6, MySQL
       

    • От Roman V
      Всем привет. Учусь работать с ini-файлами на Android. И сразу же возникла проблема, которую никак не могу решить. Хотел написать подобие приложение-тест с хранением данных в ini файле. В итоге все отлично работает на windows,а под Андроид при запуске висит только значок firemonkey секунд 10 и приложение вырубается так и не запустившись. В чем может быть проблема? Использую отладку по USB. 
      TIniFile *Ini = new TIniFile(System::Ioutils::TPath::GetDocumentsPath() + PathDelim + "options.ini"); Юзаю эти библиотеки 
      #include <System.IOUtils.hpp> #include <System.IniFiles.hpp>  
    • От Rustam Bikeev
      Суть проблемы следующая: после перехода с одной вкладки на другую в tabcontrol страница не отображается, фактически она переключается но на экране отображается предыдущая вкладка с которой был переход, ровно до той поры пока на что нибудь не клацнешь, нужно либо нажать на кнопку в тулбаре либо открыть multiview. После того как я первый раз с этим столкнулся я так и делал программно открывал и закрывал multiview, но не могу же я так делать постоянно, нужно решить проблему. Для подробности напишу, что есть основной tabcontrol в котором вкладки открываются из multiview, во вкладках есть вложенные tabcontrol-ы, со своими страницами в основном по 2 страницы. 
      Зря я начал делать приложения в делфи... чем дальше в лес тем больше дров.
    • От Alex7wrt
      Добрый день
      Как заставить TMediaPlayer воспроизводить MPG файлы под Windows? MP4 воспроизводит, а mpg не хочет. Установлены кодеки KLite.
      Добавление строки 
      TMediaCodecManager.RegisterMediaCodecClass('.mpg', 'MPEG Video', TMediaType.Video, TWindowsMediaCodec); не помогает. 
    • От SerhioUser
      Добрый день.
      Как в FMX при перерисовке объекта включить/отключить привязку к вертикальной синхронизации (v-sync) развертки экрана? Есть ли такая возможность в FMX? (В OpenGL и DirectX - есть)
      Например если делаем видео-плеер, то чтобы не было артефактов синхронизация нужна, а если хотим узнать реальный fps - синхронизацию выключаем.
    • От Макс Войтенко
      var Keyboard: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then if TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState then ShowMessage( 'клавиатура открыта' ) else ShowMessage( 'клавиатура скрыта' ); end; ТАК Я на шел для делфи. Но мне нужно для C++
    • От Роман Фил
      Привет Всем уважаемые! 
      Пытаюсь сделать растягивание по содержимому компонента. Как это реализовано в мессенджерах типа WhatsApp если большой текст то растягивает (выделяется) по содержимому большое поле, если короткий то малое. 
        Text2.Text := Memo1.Lines.Strings[4];   text2.Height := canvas.TextHeight(Text2.Text); //по высоте строки меняется т.к. там и есть одна строка в TText просто переносится WordWrap визуально.   text2.Height:=canvas.TextWidth(text2.Text); //  - так чушь  Как это вообще реализовано кто нибудь сталкивался?

  • Последние посетители   0 пользователей онлайн

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