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

sargon

Пользователи
  • Постов

    27
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные sargon

  1. В 11.03.2018 в 03:13, Вадим Смоленский сказал:

    Ха! Нет, не по-старому функционирует приложение! Добавился новый баг, еще хуже. При щелчке по системной кнопке "Свернуть" никакого сворачивания не происходит. Убрал вставленный фрагмент - всё восстановилось. Что-то в этом фрагменте точно напутано. Давайте взглянем на него еще разок:

    
    WM_SYSCOMMAND:
      begin
       if wParam = SC_MINIMIZE then
         PlatformWin.MinimizeApp
       else if wParam = SC_RESTORE then
         PlatformWin.RestoreApp;
       DefWindowProc(HWND, uMsg, wParam, LPARAM);
       sleep(50); // у FMX какая-то беда с потоками, иногда при нажатии по иконуе приложения в TaskBar окно не сворачивается а снова активируется, sleep уменьшает количество таких глюков
       Winapi.Windows.SetActiveWindow(FormToHwnd(LForm)); // после разворота активирует окно - проверил в Berlin и Tokyo 10.2.2
      end;

    Что тут не так?

    Да, все верно, там были ошибки, наверное уже не актуально, но выложу. Тот код у меня вырос до такого вот

     

            WM_SYSCOMMAND:
              begin
                case wParam of
                  SC_MINIMIZE:begin
                    PlatformWin.MinimizeApp;
                    Result:=DefWindowProc(HWND, uMsg, wParam, LPARAM);
                    FinalActionsOfPopups;
                  end;
                  SC_RESTORE:begin
                    PlatformWin.RestoreApp;
    
                    if Application.MainForm <> nil then
                      if OldWindowState = TWindowState.wsMaximized  then
                        Application.MainForm.WindowState := TWindowState.wsMaximized ;
    
                    DefWindowProc(HWND, uMsg, wParam, LPARAM);
                    Winapi.Windows.SetActiveWindow(FormToHwnd(LForm){WinAPI.Windows.FindWindow('TForm1','Form1')});
                  end;
                  SC_CLOSE:begin
                    if CannotClose = True then
                      exit
                    else
                      if Application.MainForm <> nil then
                      begin
                        for I := 0 to Screen.FormCount - 1 do
                       // if FormToHWND(Screen.Forms[I]) = hwnd then
                       // begin
                          Screen.Forms[I].Close;
      //                   Exit;
                       // end;
    
    
    
    
                        Application.MainForm.BorderStyle:=TFmxFormBorderStyle.None;
                        Application.MainForm.Height:=0;
                        Application.MainForm.Width:=0;
                        PlatformWin.RestoreApp;
                       // Application.MainForm.Activate;
                      end;
                    Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
                  end;
                  SC_MAXIMIZE:begin
                    Winapi.Windows.ShowWindow(FormToHwnd(LForm), SW_MAXIMIZE);
                    DefWindowProc(HWND, uMsg, wParam, LPARAM);
                  end;
                end;
              end;

    С такими изменениями вроде все работает корректно, еще раз просмотрел сейчас тот проект, вроде бы все адекватно отрабатывает, как и в VCL. 

  2. Ярослав, а что стало с проектом, вы не знаете случайно? Сайт их не доступен. Как раз пару недель назад вспомнил про этот проект, стало интересно как он развивается, а сайта уже и нет...

  3. 43 минуты назад, Равиль Зарипов (ZuBy) сказал:

    Попробуйте обработать клавиши в событии формы и поставить там key=0

    Благодарю, но не помогло, попробовал, оказалось, что в первую очередь срабатывает нажатие для контролов, а потом уже для формы, ну такое у меня впечатление сложилось... но даже если прописать обработчик контролу, он тоже срабатывает после Ctrl+Tab

  4. Добрый день, у меня есть один вопрос, делаю приложение в виде программы-мастера на FMX, в качестве страничек мастера использую TTabControl, случайно обнаружил, что при нажатии Tab+Ctrl вкладки переключаются, вроде так и должно быть, но мне вот такое поведение не подходит. Можно ли как-то отключить\заблокировать переключение вкладок по нажатию клавиш. Пробовал обрабатывать события KeyUp и KeyDown для TTabItem, но переключение вкладки происходит раньше, чем происходит вызов обработчика. Оно не критично конечно, но может быть кто-то сталкивался (если коротко, хочу переключать вкладки только по нажатию кнопок в программе)? Спасибо.

  5. В 07.03.2017 в 08:55, Равиль Зарипов (ZuBy) сказал:

    кто-то в чатике просил сделать подобное, вот что получилось

    FMX.AppMinimized.zip

    сворачивание/разворачивание делается, только после разворота не делается активация формы (не было времени с этим разбираться у меня)

    Старая тема, но столкнулся с такой же проблемой, также добавил WM_SYSCOMMAND, точно также после разворота не активировалось окно, пофиксил это дело, выложу тут, может кому пригодится. Такая же проблема ив Tokyo 10.2.2 - хотелось бы, чтобы такой глюк был пофиксен из коробки, хотя бы в следующей версии

    WM_SYSCOMMAND:
    begin
      if wParam = SC_MINIMIZE then
        PlatformWin.MinimizeApp
      else if wParam = SC_RESTORE then
        PlatformWin.RestoreApp;
    
      DefWindowProc(HWND, uMsg, wParam, LPARAM);
    
      sleep(50); // у FMX какая-то беда с потоками, иногда при нажатии по иконуе приложения в TaskBar окно не сворачивается а снова активируется, sleep уменьшает количество таких глюков
      Winapi.Windows.SetActiveWindow(FormToHwnd(LForm)); // после разворота активирует окно - проверил в Berlin и Tokyo 10.2.2
    end;

    Нужно добавить код в FMX.Platform.Win в функцию function WndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

  6. В 24.09.2016 в 16:47, krapotkin сказал:

    сами формы в андроиде не анимируются, можно только содержимое этой формы взять и с помощью AnimateFloat вывести на экран

    если разместить на форме TabControl и спрятать табы, то анимация - слайд выполняется с помощью TActionList - TChangeTabAction

    Большое спасибо за помощь, премного благодарен!

  7. Добрый день уважаемое сообщество. Возможно ли, и если возможно, то как, сделать что-то наподобие этого http://developer.alexanderklimov.ru/android/animation/overridependingtransition.php. В Android есть стандартная анимация при переходе между окнами в приложениях, мне было бы достаточно и такой, не знаю только как ее прикрутить, в какую сторону рыть - ничего не нагуглил, знаю про TFloatAnimation но может быть есть какой-нибудь нативный способ для этого в FMX. Заранее благодарю за помощь.

  8. В 19.09.2016 в 13:27, Brovin Yaroslav сказал:

    Добрый день,

    Можно взять компонент TFlowLayout с плавающей разметкой внутренних компонентов. Накидывать туда TLabel со специальным стилем и AutoSize. Там где нужен перенос вставлять TFlowLayoutBreak.

    Всплывающий список со списком, я думаю не проблема. Можно взять TPopup с TListBox. Можно просто заюзать пикеры FMX.Pickers.pas. Взять пикер TCustomListPicker

    Отличная идея, Ярослав, благодарю, буду пробовать. В принципе Rusland тоже интересное решение предлагает. 

  9. Добрый день! Нигде не нашел, как сделать в FMX что-то наподобие этого? Идея такая, выбирать из ListBox параметры, а после выбора хотелось бы чтобы они отображались в каком-нибудь контролле (наиболее для этого подходящем) подобным образом как на рисунке. Направьте хотя бы в какую сторону копать. Заранее благодарю!

     

    Снимок.PNG

  10. Заранее прошу простить если не в ту ветку, не знаю в какую лучше написать - больше вроде к жестам относится, Есть боковое меню на Android  которое прекрасно выезжает и заезжает по жестам влево-вправо, может быть кто-то уже сталкивался, как сделать чтобы панель как бы "прилипла" к пальцу и следовала за ним, т.е. пока палец без отрыва от тачскрина двигается вправо - панель следует за ним вправо, если палец пошел влево она следует влево и закрывается. В общем так как сделано в большинстве приложений на Java - Facebook, VK и других. И вообще возможно ли это сделать на Delphi. (у меня Delphi Berlin android 4.2)

  11. Добрый день, уважаемое сообщество! Может быть кто-то подобное делал - хочу отрисовать маршрут между двумя точками, нужна помощь кодом. Что-то не могу ничего нагуглить похожего, интересует именно реализация (надеюсь гугл не забанил). Прошу помощи или совета. (Во время поисков понял, что нужно делать через GoogleDistance, но не могу понять с какой стороны подступиться)

  12. Доброго дня, спасибо за скрины - вроде все как нужно по ним

    4 часа назад, Rusland сказал:

    Компилировал сам в Берлине

     

    В 21.07.2016 в 09:54, Rusland сказал:

    На одном 7'' планшете Lenovo вижу на месте JMapView белое окно (карты не вижу),

    80% вероятности, что вы не сгенерили ключ для своей IDE (debug.keystore как оказалось разный на разных компах даже если одну и ту же инсталляшку используешь) и не прописали его в Google.console для Google Maps сервиса. Если сгенерили - то переименуйте проект - потому что в моей консоли проект с таким именем уже существует - там у гугла какой-то дивный глюк с именами проектов, даже под разными пользователями. Работает ли у вас апк собранная у меня?

    В 21.07.2016 в 09:54, Rusland сказал:

    А на 8'' Lenovo вообще программа вылетает при старте.

    Это нужно в дебаге посмотреть, что за ошибка вываливается, идей никаких нет, тут что угодно может быть - какие версии андройдов на устройствах? Возможные причины: не обновлены гугл-сервисы, версия Андройда (я собирал тестовую АПК под 6-ку), интелловский проц - при эмуляции ARM кода MapView не работает, да и много чего еще может быть.

    Нашел устройство на котором навигационная панель "рисованная" - проверил - да, проблема воспроизводится. Как оказалось, причина в косяках при реализации джавовского NativeLayout - на котором размещается MapView. На нем размещается оно везде, что в FireMonkey, что в Java. На java такая же проблема с картой... но получилось устранить так 

    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

    Это на Java (код скрывает панель) - работает, но карту надо перерисовать invalidate сделать, иначе панелька "как бы" и не убирается - т.е. она отображается на карте как рисунок - в java так решена проблема с размещением чего-то поверх карты я так понимаю.

    Интерпретация Java на Delphi

    type
      TRunner = class(TJavaLocal, JRunnable)
      private
        FRunMethod: TThreadProcedure;
      public
        constructor Create(RunMethod: TThreadProcedure); overload;
        procedure run; cdecl;
      end;
    
    var
      Runner:TRunner;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Runner := TRunner.Create(
        procedure
        begin
          TAndroidHelper.Activity.getWindow.getDecorView().setSystemUiVisibility
            (TJView.JavaClass.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        end);
    
      TAndroidHelper.Activity.runOnUiThread(Runner);
    
      Sleep(400);
      Form1.Recreate;
      Map.Repaint; // Вот тут нужно что-то додумать
    end;
    
    { TRunner }
    
    constructor TRunner.Create(RunMethod: TThreadProcedure);
    begin
      FRunMethod := RunMethod;
      Create;
    end;
    
    procedure TRunner.run;
    begin
      FRunMethod;
    end;

    У меня срабатывает, но панелька не исчезает, потому что она рисуется системой на карте как картинка (как и в случае с Java), и пропадает только после касания области панельки на карте, когда она перерисуется (если вы коснетесь панельки она съедет вниз, но Map.repaint нужно закомментить, иначе оно так и висит, repaint немного не так как ожидается работает), точнее не она NativeLayout.

    map.repaint не срабатывает - как сделать на delphi пока не придумал. Сейчас к сожалению нету времени покапаться и решить вопрос.

  13. 11 часов назад, Rusland сказал:

    На одном 7'' планшете Lenovo вижу на месте JMapView белое окно (карты не вижу), ведет себя так же как TMapView - в режиме FullScreen=true при нажатии на JMapView вылезает нижняя панель с кнопками (смена FullScreen c false на true не помогает, нижняя панель потом уже не исчезает).

    А на 8'' Lenovo вообще программа вылетает при старте.

    А можете скинуть данные утилиты SysCheck по этим планшетам?

    А вы компилировали сами или ставили apk который идет в архиве?

  14. В 18.07.2016 в 10:05, Rusland сказал:

    Можете приложить тестовый проект, в котором используете JMapView?

    Конечно, прикладываю. Сразу скажу писал для себя и на скорую руку поэтому комментов нет практически, и где-то используются не особо красивые решения, есть также явные косяки в реализации, но их не устранял так как под себя делал, и знаю как обойти их - например jmapview не корректно  размещается в tabcontrol (не корректно прорисовывается), но у меня задачи с размещением контрола сугубо на форме, поэтому до исправления руки не дошли - но можете дописать это под себя, если сие пофиксите и скините мне - буду очень благодарен. Модуль называется Android.Native.JMapView - он дает возможность работы с JMapView. TMapView тоже естественно основан на JmapView но там гораздо больше функционала, на мой взгляд лишнего, а того что надо нету. Здесь сделано по-проще по аналогии с Java. Мне этого модуля хватает во всяком случае. За основу взят DPF.JmapView Романа Янковского большое спасибо ему за это. Android.BaseControl - этот файл содержит класс от которого унаследован мой класс карты в модуле  Android.Native.JMapView.

    TAndroidNativeMapView умеет все самое необходимое для карты (ну по моим меркам естественно)

    вот список возможностей

        procedure AddMarker - добавляет маркер на карту
        procedure AddPolyline - добавляет полилинию
        procedure RemoveMarker - удаляет маркер
        procedure SetCameraPosition(Lat, Lng: Double; Zoom: Single) - устанавливает камеру по координатам с зумом
        procedure Clear; - очищает карту от всего
        procedure Loaded; override; - загрузить карту
        procedure MapShow; - показать карту (без миганий удалось сделать)
        procedure MapHide; скрыть карту без миганий
        procedure Resume; возобновить прорисовку карты
        procedure Suspend; приостановить прорисовку карты
        function Snapshot(Recipient: TMapScreenshotRecipient): Boolean; - сделать скрин карты
        function SelectMarker(MarkerIndex:integer):Boolean; выделить маркер заданным цветом
        function SelectReset:Boolean; сбросить выделенный маркер к цвету который у него был или битмапу
     

        property MyLocationEnabled - мое местоположение  включение\выключение
        property ZoomControlEnabled - включение\выключение зумма
        property OnMarkerClick - обработка события клика по маркеру
        property OnMapLoaded - обработка события загрузки карты
        property OnMapClick - обработка события клика по карте
        property OnInfoWindowClick - обработка события клика по информационному окну
        property Color - задать цвет информационного окна
        property CustomWindowAdapter - использовать ли кастомное информационное окно (true\false)

    любой другой функционал который есть или нету в стандартном MapView в рамках JGoogleMap можно легко добавить если он вам понадобится

    Ну и если будут вопросы задавайте - постараюсь оперативно отвечать

    Прикрепляю также apk -шку на всякий - там по нажатию кнопки тест выполняется ваш код  

    Form1.FullScreen:=not Form1.FullScreen;

    У меня нормально работает ничего не появляется никаких панелей - пробуйте у себя. IDE Delphi Berlin - проверял на Android 4.1 и 5.0

    TEST.rar

  15. В 14.07.2016 в 13:28, Rusland сказал:

    Поставил кнопочку и написал обработчик чтобы скрывать показывать верхнюю и нижнюю панель системы

    
    procedure TForm1.SbtMaximizeClick(Sender: TObject);
    begin
      Form1.FullScreen:=not Form1.FullScreen;
    end;

    Если на экране есть MapView и Form1.Fullscreen = true, то стоит только один раз потыкать пальцем по карте, как снизу появляется стандартная панель с кнопками Back, Home, Menu и никуда не пропадает, причем она перекрывает часть рабочей области приложения.

    Как от этого избавится?

    Вот и у меня была похожая проблема, вернее одна из множества проблем с отображением при использовании TMapView. Найти решение в рамках TMapView за разумное время так и не получилось к сожалению. Именно поэтому сделал свой контрол для отображения карты. Все проблемы исчезли - практически все, те, что остались, получилось обойти при построении UI с учетом этих "особенностей", но мне под мои нужды хватает за глаза своего контролла. TMapView имхо сыроват пока,можно посмотреть на WebGMaps от TMS или TECN для сравнения - но все платное. Справедливости ради хочу сказать, что и андройд сам по себе не без греха, так что дело может быть совсем и не в TMapView. Пишу также на Java, так там проблем с JmapView еще больше.

    Если кто-то опишет как решить проблемы перерисовки (мигания, артефакты при открытии и проч) средствами TMapView - это будет супер. Ну или ждем новой версии от разрабов.

    А вам уважаемый Rusland могу посоветовать, если есть возможность, отказаться от использования TMapView, и сделать контрол на базе Jmapview - и все проблемы такого рода отпадут, должны отпасть. А если вы все-таки найдете решение с использованием стандартного MapView, то прошу поделиться. 

  16. Ребята, а есть ли в FireMonkey что-то подобное https://developer.android.com/guide/topics/resources/accessing-resources.html?hl=ru - можно ли получить как-то доступ к ресурсам по-типу слоя R в Java? Мне нужно свой layout загрузить?

  17. 5 часов назад, Rusland сказал:

    Есть компонент MapView для отображения карты.

    Как ставить маркеры смотрите здесь

    Да, я знаю про этот компонент. К сожалению мне пришлось от него отказаться, он почему-то как-то странно мигает при переключении с вкладки на вкладку (TTabControl), не знаю только у меня ли это, может быть что-то делаю не правильно. (мигания эти не устраивают заказчика). Может быть вы подскажите, есть ли у вас промигивания, когда компонент лежит на одной из вкладок TabControl и вы между вкладками переключаетесь??? (заметил что такое поведение чаще на разных Huawei и TCL и проч. на исконно брендовых аппаратах работает нормально). 

    Свой вопрос частично решил - строю свой popup в getInfoWindow, getInfoContent почему-то не срабатывает. В документации говориться, что должен срабатывать сначала getInfoWindow, а потом getInfoContent если getInfoWindow возвращает Null. Вот пишу Resuly:=nil и вылетает ошибка а до getInfoContent не доходит. В принципе нормально работает и текст свой можно писать и цвет задавать и шрифт, все можно, кроме картинки и без описания layout в xml. Единственно, что не устраивает, окно без язычка к маркеру получилось, а хочется с язычком (corner), попробую описать Layout и подключить. В любом случае, очень благодарен вам за ответ! 

  18. Добрый день, уважаемое сообщество. Возник такой вопрос, по нажатию на маркер на карте нужно показывать свой InfoWindow. как тут. Может быть кто-то такое уже делал, прошу помочь кодом. Попытался сделать как здесь. Там на Java, но я переписал на Delphi. Компилится, но в рантайме выдает Segmentation class (11), AV и проч. может кто-нибудь может подсказать в чем проблема. Делаю так

    ... 
    TMyAndroidInfoWindowAdapter = class (TJavaLocal, JGoogleMap_InfoWindowAdapter)
     private
       FMapControl: TAlexAndroidMapView;
     public
       function getInfoContents(P1: JMarker): JView; cdecl;
       function getInfoWindow(P1: JMarker): JView; cdecl;
     end;
    ...
    
    function TMyAndroidInfoWindowAdapter.getInfoContents(P1: JMarker):JView;
    var
    
      LinearLayout:JLinearLayout;
      snippet, title:JTextView;
    begin
        LinearLayout:=TJLinearLayout.JavaClass.init(TAndroidHelper.Activity);
    
    
        title:=TJTextView.JavaClass.init(TAndroidHelper.Activity);
        title.setTextColor(TAlphaColorRec.Brown);
        title.setText(JCharSequence(P1.getTitle));
    
        snippet:=TJTextView.JavaClass.init(TAndroidHelper.Activity);
        snippet.setTextColor(TAlphaColorRec.Coral);
        snippet.setText(JCharSequence(P1.getSnippet));
    
        LinearLayout.addView(title);
        LinearLayout.addView(snippet);
    
      result:=LinearLayout;
    
    end;
    
    function TMyAndroidInfoWindowAdapter.getInfoWindow(P1: JMarker):JView;
    begin
      Result:=nil;
    end;
    
    

    При создании экземпляра JMapView делаю так

    ...    
    if not Assigned(FWindowsAdapter) then
            FWindowsAdapter:=TAlexAndroidInfoWindowAdapter.Create;
    
          FJMapView.getMap.setInfoWindowAdapter(FWindowsAdapter);
    ...

    FWindowsAdapter это поле в моем классе

      TMyAndroidMapView = class(TDPFANDBaseControl)
    
      protected
        ...
        FWindowsAdapter:TAlexAndroidInfoWindowAdapter;

    MapView не использую реализовал свой контрол на базе dpf android native components Романа Янковского. Ошибки валятся после выполнения этого метода

    function TMyAndroidInfoWindowAdapter.getInfoWindow(P1: JMarker):JView;
    begin
      Result:=nil; <------ выполнился и сразу Class Segmentation Fault (11)
    end;

    Опишу зачем вообще я это делаю. Мне в InfoWindow по клику на маркер на карте нужно всего навсего отобразить текст в несколько строк (свойство маркера Snippet), но так как перенос строк почему-то не работает взялся за реализацию WindowInfoAdapter. Может быть все это проще можно сделать. Заранее благодарю за помощь.

  19. 22 часа назад, krapotkin сказал:

    тут проблема обозначена вовсе неверно

    карта - это лишь отображение информации. сколько маркеров вы на нее поместите, столько их там и будет

    соответственно, остается только выбрать из общего числа только те, что в радиусе R. Сделать это элементарно

    Их и отобразить

    Большое спасибо! 

  20. Может быть кто-нибудь такое делал. Подскажите пожалуйста, мне нужно отображать/скрывать маркеры на карте в зависимости от заданного радиуса от местоположения, например радиусы 2,4 и 6 км - если выбираем радиус например 4 км, определяется местоположение (это знаю как сделать) и отображаем все маркеры на карте в радиусе до 4 км, а те что превышают 4 км скрываем. Подтолкните в какую сторону рыть, как это может быть реализовано при помощи TMapView??? Заранее весьма благодарю!

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