Skip to content
View in the app

A better way to browse. Learn more.

FGX Native

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Александр Клопоцкий

Active subscription
  • Joined

  • Last visited

Everything posted by Александр Клопоцкий

  1. Добрый день. Вопрос по работе с библиотекой: FB4D, на 20.04.2023 г. https://github.com/SchneiderInfosystems/FB4D Delphi 11.3, Java JDK (Java 19), FGX-Native 1.15.4.0 1. Создал новый проект, добавил компонеты: TfgPushNotificationService, TfgFirebaseAnalytics, настроил, запустил приложение, Token от Firebase принимается, Push приходит, Аналитика в консоль передается, Firebase работает! 2. Добавляю в проект один (любой) модуль, например FB4D.Interfaces.pas, никакого кода еще не пишу, приложение собирается без ошибок, показывается заставка, и на ней приложение зависает. 3. Беру пример из билиотеки FB4D: "FSSimpleChat.dproj", компилирую под Windows, работает (новый пользователь в Authentication создается, существующий пользователь логинится, если пароль забыл, на E-mail приходит письмо сменить пароль, в Firestore Database пишутся сообщения): 4. Тот же пример из билиотеки FB4D: "FSSimpleChat.dproj", компилирую FMX под Andriod 32-bit, ошибки при сборке. Возможно FB4D не обновляется, Java JDK (Java 19) не воспринимается? Можно ли как-то работать с FB4D в версии FGX-Native 1.15.4.0 и последующих? Пол года назад, осенью, еще на Delphi 10.4.2 с FGX-Native более ранней версии, этот пример FMX собирался и работал под Andriod 32-bit.
  2. Хочется попробовать новый визуальный компонент TfgBottomNavigationBar, который отображает новые события над каждой кнопкой.
  3. Добрый вечер, По вашему примеру, как прописать класс фрейма в dfm файле формы? Form.Main.pas unit Form.Main; interface {$SCOPEDENUMS ON} uses System.Types, System.Classes, FGX.Forms, FGX.Forms.Types, FGX.Controls, FGX.Controls.Types, FGX.Layout, FGX.Layout.Types; type TFormMain = class(TfgForm) private { Private declarations } public { Public declarations } end; var FormMain: TFormMain; implementation {$R *.xfm} uses System.SysUtils, FGX.Application, FGX.Dialogs, FGX.Log, Unit1; end. Form.Main.xfm object FormMain: TFormMain Size.Width = 360.000000000000000000 Size.Height = 590.000000000000000000 SavedSizeWidth = 360s SavedSizeHeight = 590s object Frame1: TFrame1 Size.Width = 360.000000000000000000 Size.Height = 640.000000000000000000 SavedSizeWidth = 360s SavedSizeHeight = 640s object fgButton1: TfgButton Text = 'fgButton1' Position.X = 56.000000000000000000 Position.Y = 80.000000000000000000 RelativePosition.Left = 56.000000000000000000 RelativePosition.Top = 80.000000000000000000 Size.Width = 120.000000000000000000 Size.Height = 36.000000000000000000 SavedSizeWidth = 120s SavedSizeHeight = 36s end object fgSwitch1: TfgSwitch Position.X = 224.000000000000000000 Position.Y = 88.000000000000000000 RelativePosition.Left = 224.000000000000000000 RelativePosition.Top = 88.000000000000000000 Size.Width = 44.000000000000000000 Size.Height = 26.000000000000000000 SavedSizeWidth = 44s SavedSizeHeight = 26s ColorDefaultName = 'Theme\Text\Text' end end end Unit1.pas unit Unit1; interface {$SCOPEDENUMS ON} uses System.Types, System.Classes, FGX.Forms, FGX.Forms.Types, FGX.Controls, FGX.Controls.Types, FGX.Layout, FGX.Layout.Types, FGX.Button.Types, FGX.StaticLabel, FGX.Switch, FGX.Button; type TFrame1 = class(TfgForm) fgButton1: TfgButton; fgSwitch1: TfgSwitch; private { Private declarations } public { Public declarations } end; var Frame1: TFrame1; implementation {$R *.xfm} uses System.SysUtils, FGX.Application, FGX.Dialogs, FGX.Log; end. Unit1.xfm object Frame1: TFrame1 Size.Width = 360.000000000000000000 Size.Height = 640.000000000000000000 SavedSizeWidth = 360s SavedSizeHeight = 640s object fgButton1: TfgButton Text = 'fgButton1' Position.X = 56.000000000000000000 Position.Y = 80.000000000000000000 RelativePosition.Left = 56.000000000000000000 RelativePosition.Top = 80.000000000000000000 Size.Width = 120.000000000000000000 Size.Height = 36.000000000000000000 SavedSizeWidth = 120s SavedSizeHeight = 36s end object fgSwitch1: TfgSwitch Position.X = 224.000000000000000000 Position.Y = 88.000000000000000000 RelativePosition.Left = 224.000000000000000000 RelativePosition.Top = 88.000000000000000000 Size.Width = 44.000000000000000000 Size.Height = 26.000000000000000000 SavedSizeWidth = 44s SavedSizeHeight = 26s ColorDefaultName = 'Theme\Text\Text' end end
  4. Delphi 10.4.2 Community Edition android-studio-2021.3.1.17-windows.exe ( https://developer.android.com/studio ) android-ndk-r25b-windows.zip ( https://developer.android.com/ndk/downloads ) jdk-19_windows-x64_bin.exe ( https://www.oracle.com/java/technologies/downloads ) Скачиваем Android SDK 33 через Android Studio: Android SDK 33 скачался в папку C:\Development\Sdk: Копируем файлы dx.bat и dx.jar из SDK 30 в папку с SDK 33: Создаем новый профиль Android SDK в Delphi: Чего-то не хватает, не проходит дальше создание нового профиля Android SDK. Если указать стандартный Android SDK Base path, то профиль создается: Что еще нужно добавить?
  5. База данных MySQL на обычном хостинге сайта: https://hoster.by/
  6. Название приложения: ГАЗ-ИНСТИТУТ Платформа: Android 32 bit, Android 64 bit Поддерживаемые версии ОС: Android 5.0 и новее Необходимое свободное место: до 10 Мб Описание: Приложение "ГАЗ-ИНСТИТУТ" предназначено для подачи заявок на обучение. Ссылка на приложение: https://play.google.com/store/apps/details?id=gazinstitut.by Заявки на обучение.mp4
  7. Постоянно коннект не держу. Только в момент нажатия кнопки устанавливаю коннект, вставляю запись в таблицу, с сразу отключаюсь. Чтение чата делаю раз в минуту и отключаюсь. http - будет прослойка, нужно будет все поля таблиц через нее прописывать, неудобно. Хочется работать напрямую с SQL, пока ошибок с обрывом соединения в приложении не было. SecureBridge держит SSH подключение в момент коннекта, хостеры не дают подключаться напрямую к базе на хостинге без SSH сертификата. procedure TdmMain.Hoster_FL_REG_Insert; var UniStoredProc: TUniStoredProc; begin if ((PPL_SURNAME <> '') or (PPL_FIRSTNAME <> '') or (PPL_PHONE <> '')) then begin Hoster_Connect; // Подключение к хостингу UniStoredProc := TUniStoredProc.Create(nil); try UniStoredProc.Connection := UniConnection; UniStoredProc.StoredProcName := 'st_reg_insert'; UniStoredProc.PrepareSQL; UniStoredProc.ParamByName('P_APP_ID').ParamType := ptInput; UniStoredProc.ParamByName('P_APP_ID').DataType := ftInteger; UniStoredProc.ParamByName('P_APP_ID').AsInteger := StrToInt(APP_ID); UniStoredProc.ParamByName('P_PPL_SURNAME').ParamType := ptInput; UniStoredProc.ParamByName('P_PPL_SURNAME').DataType := ftString; UniStoredProc.ParamByName('P_PPL_SURNAME').AsString := PPL_SURNAME; UniStoredProc.ParamByName('P_PPL_FIRSTNAME').ParamType := ptInput; UniStoredProc.ParamByName('P_PPL_FIRSTNAME').DataType := ftString; UniStoredProc.ParamByName('P_PPL_FIRSTNAME').AsString := PPL_FIRSTNAME; UniStoredProc.ParamByName('P_PPL_PHONE').ParamType := ptInput; UniStoredProc.ParamByName('P_PPL_PHONE').DataType := ftString; UniStoredProc.ParamByName('P_PPL_PHONE').AsString := PPL_PHONE; UniStoredProc.Execute; finally UniStoredProc.Free; end; Hoster_Disconnect; // Отключение от хостинга end; end; procedure TdmMain.Hoster_Connect; begin ScFileStorage.Path := TPath.GetDocumentsPath; // Папка на Android ScSSHClient.Connected := True; ScSSHChannel.Connected := True; if ScSSHChannel.Connected then UniConnection.Connected := True else TfgDialogs.ShowMessage('SSH - Not Connected!'); end; procedure TdmMain.Hoster_Disconnect; begin ScSSHChannel.Connected := False; ScSSHClient.Connected := False; end;
  8. Название приложения: Фаберлик Подарки Платформа: Android 32 bit, Android 64 bit Поддерживаемые версии ОС: Android 5.0 и новее Необходимое свободное место: до 80 Мб Описание: Приложение "Фаберлик Подарки" предназначено для для сопровождения постоянных покупателей продукции Фаберлик. Приложение соединяется с базой данных MySQL на обычном хостинге сайта. Для подключения использую компоненты UniDAC, SecureBridge. Каждому скачиванию присваивается порядковый номер, сохраняется в телефоне, по нему отбираются и показываются сообщения чата для данного клиента. При приходе сообщения делаю "Local notification" из примера. Программа администрирования на Delphi 10.4.1 VCL компонентах. Ссылка на приложение: https://play.google.com/store/apps/details?id=faberlic24.by
  9. 1. Удалил версию FGX-Native 1.7.1. Удалились папки: C:\Document and Settings\User\Local Setting\FGX Native\ C:\Users\User\AppData\Local\FGX Native\ 2. Поставил версию FGX-Native 1.8.0. Выбрал - только RADStudio 10.4, - только Android. По новой создались папки: C:\Document and Settings\User\Local Setting\FGX Native\ C:\Users\User\AppData\Local\FGX Native\ 3. Открываю пример: CollectionViewScrollDemo. Компилирую - Ошибка: [DCC Fatal Error] FGX.Platform.pas(195): F2051 Unit FGX.Assets.Android was compiled with a different version of FGX.Helpers.Android.JStringToString Делал полный "Build All Projects", та же ошибка. Где сохранились файлы библиотеки от старой версии? Полный текст компиляции примера CollectionViewScrollDemo: Checking project dependencies... Compiling CollectionViewScrollDemo.dproj (Debug, Android) brcc32 command line for "CollectionViewScrollDemo.vrc" c:\delphi\bin\cgrc.exe -c65001 "CollectionViewScrollDemo.vrc" -foCollectionViewScrollDemo.res dccaarm command line for "CollectionViewScrollDemo.dpr" c:\delphi\bin\dccaarm.exe -$O- --no-config -M -Q -TX.so -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults -DDEBUG -E.\Android\Debug -Ic:\delphi\lib\Android\debug;"C:\Users\User\AppData\Local\FGX Native\Libs\270\Android\Debug";c:\delphi\lib\Android\Release; C:\Delphi\Add\UniDAC\Lib\Android32;C:\Delphi\Add\SecureBridg\Lib\Android32;"C:\Users\User\AppData\Local\FGX Native\Sources"; "C:\Users\User\AppData\Local\FGX Native\Libs\270\Android\Release";"C:\Users\User\AppData\Local\FGX Native\Libs\Common\Android\Debug\armeabi-v7a" -LEC:\Users\Public\Documents\Embarcadero\Studio\21.0\Bpl\Android -LNC:\Users\Public\Documents\Embarcadero\Studio\21.0\Dcp\Android -NU.\Android\Debug -NSSystem;Xml;Data;Datasnap;Web;Soap; -Oc:\delphi\lib\Android\Release;C:\Delphi\Add\UniDAC\Lib\Android32;C:\Delphi\Add\SecureBridg\Lib\Android32; "C:\Users\User\AppData\Local\FGX Native\Sources";"C:\Users\User\AppData\Local\FGX Native\Libs\270\Android\Release";"C:\Users\User\AppData\Local\FGX Native\Libs\Common\Android\Debug\armeabi-v7a" -Rc:\delphi\lib\Android\Release;C:\Delphi\Add\UniDAC\Lib\Android32; C:\Delphi\Add\SecureBridg\Lib\Android32;"C:\Users\User\AppData\Local\FGX Native\Sources";"C:\Users\User\AppData\Local\FGX Native\Libs\270\Android\Release";"C:\Users\User\AppData\Local\FGX Native\Libs\Common\Android\Debug\armeabi-v7a" -Uc:\delphi\lib\Android\debug; "C:\Users\User\AppData\Local\FGX Native\Libs\270\Android\Debug";c:\delphi\lib\Android\Release;C:\Delphi\Add\UniDAC\Lib\Android32; C:\Delphi\Add\SecureBridg\Lib\Android32;"C:\Users\User\AppData\Local\FGX Native\Sources";"C:\Users\User\AppData\Local\FGX Native\Libs\270\Android\Release";"C:\Users\User\AppData\Local\FGX Native\Libs\Common\Android\Debug\armeabi-v7a" --libpath:C:\Development\android-ndk-r21d\sources\cxx-stl\llvm-libc++\libs\armeabi-v7a; C:\Development\android-ndk-r21d\platforms\android-23\arch-arm\usr\lib --linker:C:\Development\android-ndk-r21d\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ld.exe -V -VN -NO.\Android\Debug CollectionViewScrollDemo.dpr [DCC Fatal Error] FGX.Platform.pas(195): F2051 Unit FGX.Assets.Android was compiled with a different version of FGX.Helpers.Android.JStringToString Failed Elapsed time: 00:00:41.4 Даты создания файлов примера:
  10. Все классы, связанные с анимацией перенесли в Android.Api.Animations. (В описании выше: Android.Api.Animation.)
  11. В форме fmCatalog по событию OnSafeAreaChanged опускаю панель навигации (TfgLayout) под системную панель: procedure TfmCatalog.fgFormSafeAreaChanged(Sender: TObject; const AScreenInsets: TRectF); begin loNav.Size.Height := AScreenInsets.Top + 56; loNav.Padding.Top := AScreenInsets.Top; loNav.Realign; end; В версии 1.5.3 - панель опускалась: В версии 1.6.0 - панель не опускается. Возможно AScreenInsets - не может получить значение. Код не менял, скомпилировал под 1.6.0, как исправить? :
  12. Да, верно. Поставил у метки: HitTest = True, и метка стала реагировать на событие OnTap.
  13. В версии 1.4.1.1 перестал работать TfgDrawerLayout. Демо-пример: "DrawerDemo". На Drawer панеле, в текстовой метке fgLabel2 прописал событие OnTap: procedure TForm4.fgLabel2Tap(Sender: TObject); begin fgDrawerLayout1.Close(True); end; Нажимаю на текстовую метку, и нет реакции, не отрабатывает.
  14. При сохранении изменений в дизайнере ресурсов - ошибка связанная с FMX. В проекте никаких FMX библиотек не подключено. Что это может быть? Delphi 10.3, FGX-Native 1.3.0.0
  15. Первая версия каталога, которая работала пару месяцев, у меня была сделана по "демо проекту": "Ресурсы" -> "Изображения" -> "Асинхронная загрузка изображения по URI". На хостинг я выкладывал новые *.jpg страниц каталога, и они открывались в приложении без обновления приложения. Это тот способ обновления, который использует официальное приложение от компании "Фаберлик". Приложение по размеру маленькое, все тащит через интернет. Навигация по страницам каталога: "<< Первая", "< Предыдущая", "Следующая >", "Последняя >>" и "Введите номер", какую страницу показать. Про клиентов приложения - это девушки, которые выбирают товар, рекламируют, продают его везде и всегда, "сетевики", ну и новые клиенты, которые готовы листать этот каталог вдоль и поперек часами, выискивая выгодные цены. Они часто листают каталог, где нет хорошего интернета, за городом, на даче, на шашлыках, и туалете, в автобусе, и им надо быстро сразу весь каталог полистать взад - вперед и увеличить где нужно. Я предложил им второй вариант, где каталог жестко зашит в "Assets Manager". Размер приложения сразу увеличился с 15 Mb до 65 Mb, но зато теперь каталог всегда с ними и они его могут всегда "кручу - верчу - смотрю как хочу", он у них летает. Для обновления в начале каталога нажимают ссылку на "Google Play" и обновляются без проблем. Знают число, когда каталог меняется и я рассылаю по "демо проекту": "Push-уведомления" -> "Получение Push-уведомления" - "Новый каталог, обновите приложение!". Им этот вариант однозначно больше нравиться. Они ведь всегда по причине нестабильного интернета скачивали себе в "Галерею" каталог в виде фото, это 300 *.jpg рисунков разрешения 902 x 1352. Каталог менялся, "Галерея" засорялась, они уже путались, это в "Галерее" новый каталог или старый, чистить не все умели, памяти со временем не хватало. А при обновлении приложения старый каталог гарантированно уйдет из памяти телефона и заменится новым, и не надо "Галерею" чистить потому как каталог в приложении. Ну и насчет памяти, в смысле стремления сделать приложение как можно меньшего размера. Это как с ассемблером, где каждый байт экономили, по тому как раньше объемы памяти были очень ограниченные. Сейчас памяти становиться много, экономить уже не нужно, ограничение это уже снимается, важным становиться удобство использования. Эта ошибка "нехватка памяти" при листании, которую я привел выше возникала на "дохлом" телефоне "Xiaomi Redmi Note 3" без включенной "выгрузки из памяти". В хороших последних телефонах она не возникает даже при выключенной "выгрузки из памяти", хватает памяти загрузить весь "Assets Manager" и листать его. Здесь выбор: Приложение либо универсальное, маленькое но медленное, которое обновлять не надо – Либо не универсальное, большое но быстрое, которое обновлять надо. Мои пользователи однозначно выбрали второе.
  16. Спасибо "sinuke" https://forum.fgx-native.com/profile/7-sinuke/ за публикацию проекта "Проверка контрольных знаков" и исходного кода в общий доступ: https://github.com/sinuke/excises Там я смотрел, как правильно добавлять, вызывать и закрывать дополнительные формы в свой проект. Эту тему можно вынести и на вебинары по обзору возможностей библиотеки. Добавил вызов формы просмотра выбранной страницы каталога: procedure TfmCatalog.ShowCatalogPage; begin fmCatalogPage := TfmCatalogPage.Create(Self); fmCatalogPage.IsAnimating := True; TfgAnimationHelper.ShowForm(fmCatalogPage, [TfgAnimationOption.StartFromCurrent], ANIMATION_DIRATION, procedure begin fmCatalogPage.IsAnimating := False; end); end; По "демо проекту": "Компоненты" -> "TfgCollectionView" -> "Выделение" сделал вызов формы просмотра выделенной страницы каталога: procedure TfmCatalog.cvCatSelectionChanged(Sender: TObject; const ASelectedItems: TArray<System.Integer>); var ItemIndex: Integer; begin for ItemIndex in ASelectedItems do begin CatalogPage := ItemIndex + 1; ShowCatalogPage; end; end; По "демо проекту": "Жесты" -> "Жест "Zoom" - увеличение масштаба" без изменения кода примера добавил функционал просмотра страницы каталога с Zoom: procedure TfmCatalogPage.imCatPageZoom(Sender: TObject; const AZoomInfo: TfgZoomInfo); begin if AZoomInfo.Phase = TfgGesturePhase.&InProgress then begin imCatPage.PositionMode := TfgImage.DefaultPositionMode; imCatPage.Size.SetSizeF(AZoomInfo.InitialSize.cx * AzoomInfo.Scale, AZoomInfo.InitialSize.cy * AzoomInfo.Scale); imCatPage.Position.Point := imCatPage.LocalToForm(AZoomInfo.Focus) - AZoomInfo.InitialFocus * AzoomInfo.Scale; imCatPage.Realign; end; end;
  17. По "демо проекту": "Ресурсы" -> "Изображения" -> "Выгрузка изображений из памяти" сделал каталог. В "Assets Manager" загрузил изображения 292 страниц каталога. Без включения выгрузки из памяти, при прокрутке на 26 странице возникает ошибка нехватки памяти. После включения выгрузки из памяти прокручиваются все 292 страницы. Спасибо, прекрасно работает! TfgAssetsManager.Current.AutoreleaseOptions.Enabled := True;
  18. У меня подписка до 05.04.2020. Буду ждать счет.
  19. Если в демо проекте "GestureZoom" рисунок fgImage1 разместить на странице fgPageControl1, то при каждом увеличении опять есть продергивания. Каждый раз при увеличении рисунок возвращается в центр страницы. Хочу сделать каталог, страницы каталога fgImage1 на страницах fgPageControl1, чтобы пользователь мог листать и увеличивать страница каталога.
  20. Отозвался ваш проект. Когда нажимаю на место текстовой метки, она окрашивается цветом fgLabel.LinkColor и идет переход по адресу ссылки, после возвращения в приложение ссылка уже видна. Похоже fgLabel подхватывает цвет только в момент обращения к ней. Если в текстовой метке свойство LinksTypes.WebLinks := False, то она "не кликабельна", в fgLabel применяется цвет fgLabel.Color. Когда мы присваиваем свойство LinksTypes.WebLinks := True, то она становится "кликабельна", ожидает нажатия на себя, но fgLabel еще не применяет цвет fgLabel.LinkColor, и уже не применяет цвет fgLabel.Color. (цвету текста метки присваивается цвет фона). И только когда мы нажмем на нее, по нажатию переопределяется цвет метки на fgLabel.LinkColor. VID_20200123_085838.mp4

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.