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

Anatoliy

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

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

  • Посещение

Активность репутации

  1. Like
    Anatoliy отреагировална Brovin Yaroslav в заполнение окна формы 2-3 или колонки в зависимости от ориентации экрана   
    Добрый день,
     
    Используйте TGridLayout. У него вы только указываете размер элемента (ItemWidth, ItemHeight). Далее этот компонент автоматчиески все дочерние контролы выстраивает в сетку с размером ячейки ItemWidth x ItemHeight
  2. Like
    Anatoliy отреагировална Alex7wrt в Исправление отображения Smart Banner, Android   
    Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android. 
    Может быть, эта информация кому-нибудь поможет
     
    В документации Android высота баннера должна вычисляться так:

    Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
    const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
    procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;  
  3. Like
    Anatoliy отреагировална FREEFAR в Рабочее место для IOS разработки   
    исходя из этого
  4. Like
    Anatoliy отреагировална krapotkin в альтернатива диалогу   
    Это уже звучало на другом форуме, но что-то автор темнит
    Я воспроизвел главную форму, модуль данных, из модуля данных(!) открываю OpenDialog
    И все равно не проявляется эффект
     
  5. Like
    Anatoliy отреагировална x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Разобрался.
    когда бот отправляет личное сообщение пользователю, то нужно заполнять только ID, а когда сообщение в канал, то - имя.
     
    Пользователю: UserLink.ID := StrToIntDef64(edUserId.Text, 0);
    В канал UserLink.Username := edUserName.Text;
     
    Для отправки сообщения в канал можно в качестве ID подставить отрицательное  значение chat_ID, у каналов всегда оно отрицательное.
    Т.е. в любом случае можно всегда заполнять только UserLink.ID
     
    В документации Телеграм этого нет
    https://tlgrm.ru/docs/bots/api#sendmessage
  6. Like
    Anatoliy отреагировална mazayhin в XE8, не могу установить соединение с базой Sqlite на устройстве под Android   
    Ну скорее всего у себя вы указали в коннекшене символическое имя для подключения, оно сохраняется в FDConnectionDefs.ini (вроде правильно), а у пользователя его нет. 
    Задайте параметры подключения вручную, явно
  7. Like
    Anatoliy отреагировална Alex7wrt в альтернатива диалогу   
    Возможно, проблема в том что в VCL и FMX по-разному реализована работа с окнами. Пока в голову приходят два варианта и оба касаются исходного кода компонентов TFileOpenDialog либо TOpenDialog:
    1. В исходниках кода TFileOpenDialog переделать работу с контекстом родительского окна  под FMX. Вместо Handle окна использовать WindowHandleToPlatform(Handle).Wnd
    2. В исходниках TOpenDialog разрешить нажатие на 'ОК' без выбора файла.
    Для этого скопируйте в папку проекта модули, в которых реализован функционал TFileOpenDialog или TOpenDialog и поэкспериментируйте с ними.
     
  8. Like
    Anatoliy отреагировална Alex7wrt в альтернатива диалогу   
    Добрый день
    Проверил поведение TOpenDialog в своей программе в полноэкранном режиме. При переключении на другие программы и обратно окно диалога никуда не исчезает. Сложно сказать, чем вызвано подобное поведение диалога в вашем случае. Возможно стоит проверить код в обработчиках событий формы.
    Также, рекомендую поиграться со свойствами формы BorderStyle, FullScreen, WindowState. В частности, попробуйте BorderStyle = None; FullScreen = true; WindowState = wsMaximized.
  9. Like
    Anatoliy отреагировална #WAMACO в XE8, не могу установить соединение с базой Sqlite на устройстве под Android   
    в папку с exe положи sqlite3.dll
    скачать последнюю версию можно с sqlite.org
  10. Like
    Anatoliy отреагировална rareMax в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    Мне очень неудобно, что я не обновил статью. На самом деле с этой библиотекой произошло очень много изменений с проектом:
    - переехал на битБакет: https://bitbucket.org/RareGods/cloudapi/src/master/
    -  теперь там не только работа с телеграмом, но и другие сервисы
    -  после выхода Delphi CE позволил себе вырезать работу с сетевыми библиотеками, отличными от System.Net. 
    - пофиксил больше багов чем добавил.
     
    На вскидку это все. На вопросы оперативно отвечаем в телеграм-чате : @CloudAPI. 
  11. Like
    Anatoliy отреагировална Евгений Корепов в Воспроизведение без задержки   
    Ну вряд ли найдется  метод "более простой", я имел ввиду методы конкретной платформы, к примеру для андроида JAudioTrack или JAudioManager. Посмотрите вот тут http://www.fmxexpress.com/free-game-audio-manager-wrapper-class-in-delphi-xe6-firemonkey-for-android-ios-windows-and-osx/ может вам подойдет, или поищите (даже на этом форуме) JAudioTrack
  12. Like
    Anatoliy отреагировална Alex7wrt в Воспроизведение без задержки   
    var Player: JMediaPlayer; Единожды создаете плеер и готовите файл:
    Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('Путь_к_файлу')); Player.prepare; И, когда потребуется, запускаете воспроизведение
    Player.start; В uses нужно добавить что-то из этого:
    FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.AdMob, Androidapi.JNI.App, Androidapi.JNIBridge, FMX.Advertising, FMX.Platform.Android, Androidapi.JNI.Embarcadero Не помню уже, что именно. Ненужные уберите
  13. Like
    Anatoliy отреагировална Tot999 в TPaintox+Tbitmap   
    Добрый день! 
    Решил покопаться в своей старой спрайтовой игрушке, чтобы освежить в памяти знания и состряпать что-нибудь новое. Возникли сомнения, нормально ли сделано графическое отображение, можно ли доработать.
    Все спрайты в дизайнтайме распиханы по Timagelist-ам.  На старте приложения я загружаю битмапы из имэджлистов в свои обджектлисты, подгоняя под нужный размер. 
    MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList<Tbitmap>;  
    Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:
             
    В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.
  14. Like
    Anatoliy отреагировална ophion в Записать картинку с камеры в BLOB   
    Вот пример того, как писать и читать BLOB
    procedure SaveToFireDACBlob; var MemStream: TMemoryStream; begin FireDAC.Connected := True; MemStream := TMemoryStream.Create; try Image1.Bitmap.SaveToStream(MemStream); MemStream.Seek(0,0); FDQueryInsert.ParamByName('Media').LoadFromStream(MemStream,ftBlob); FDQueryInsert.ParamByName('MType').AsString := '0'; FDQueryInsert.ExecSQL(); except on e: Exception do begin ShowMessage(e.Message); end; end; MemStream.Free; FireDAC.Connected := False; end; procedure LoadFromFireDACBlob; var BlobStream: TStream; begin FireDAC.Connected := True; try FDQuerySelect.Open; FDQuerySelect.First; while(not FDQuerySelect.EOF)do begin // access a stream from a blob like this BlobStream := FDQuerySelect.CreateBlobStream(FDQuerySelect.FieldByName('Media'),TBlobStreamMode.bmRead); // access a string from a field like this if (FDQuerySelect.FieldByName('MType').AsString='0') then begin // load your blob stream data into a control ImageViewer.Bitmap.LoadFromStream(BlobStream); end; BlobStream.Free; FDQuerySelect.Next; end; except on e: Exception do begin //ShowMessage(e.Message); end; end; FireDAC.Connected := False; end; {источник http://www.fmxexpress.com/read-and-write-a-blob-field-using-firedac-with-firemonkey-on-android-and-ios/} Касательно работы с изменением качества/размера, считаю что необходимо использовать TBitmapSurface  (unit FMX.Surfaces)
  15. Like
    Anatoliy отреагировална haword в Не открывается меню загрузить файл в android   
    что то типа этого
     
  16. Like
    Anatoliy отреагировална sinuke в Не открывается меню загрузить файл в android   
    я так понимаю должен открыться выбор файла? ну на андройде логику выбора файла придется реализовывать самому... стандартного нет
  17. Like
    Anatoliy отреагировална Евгений Корепов в IdHTTPServer и возврат параметра из формы в кодировке Windos   
    Если вы прибыли к нам из 1991 года и собираетесь использовать это приложение в прошлом тысячелетии - тогда все нормально. Если же вы наш современник - уберите из приложения и страницы все экзотические кодировки. Только UTF-8, только хардкор!
    AResponseInfo.ContentEncoding := 'utf-8'; AResponseInfo.ContentType := 'text/html; charset=utf-8'; AResponseInfo.ContentLanguage := 'ru'; AResponseInfo.CharSet := 'utf-8'; При формировании содержимого страницы - формируйте как есть, без перекодирования в экзотику. 
  18. Thanks
    Anatoliy отреагировална Евгений Корепов в Реализовать рейтинг   
    Вместо рисования звезды в TPath, проще использовать соотвествующий символ юникода.
    Char($2606) // Не закрашенная звезда
    Char($2605) // Закрашенная звезда

    https://unicode-table.com/ru/sets/stars-symbols/
    Можно даже для еврейский магазинов сделать рейтинг ?
  19. Like
    Anatoliy отреагировална Евгений Корепов в Raise убивает программу для Android   
    Просто возьмите это под свой контроль - не используйте встроенный SearchBox, а создайте отдельное поле TEdit, а фильтрацию обрабатывайте руками.
    TListViewFilterEx = record Category : String; Name : String; Cart : String; end; procedure TFormMain.SearchBoxChangeTracking(Sender: TObject); begin Setting.Filter.Name:=SearchBox.Text; ListViewFilterEx(ListViewAction, Setting.Filter); LoadVisibleListViewItem(ListViewAction); end; procedure TFormMain.ListViewFilterEx(AListView : TListView; AFilter : TListViewFilterEx); begin AListView.Items.FilterEx:= function(X: TListItem): Boolean begin Result:= (AFilter.Category.IsEmpty or TListViewItem(X).Data['Category'].AsString.ToLower.Contains(AFilter.Category.ToLower)) And ((AFilter.Name.IsEmpty or TListViewItem(X).Data['Name'].AsString.ToLower.Contains(AFilter.Name.ToLower)) or (AFilter.Name.IsEmpty or TListViewItem(X).Data['Detail'].AsString.ToLower.Contains(AFilter.Name.ToLower))); end; end; procedure TFormMain.LoadVisibleListViewItem(const AListView : TListView; ATopItemIndex : Integer = -1); Var LTopItemIndex, I : Integer; begin if Setting.Flags.ListViewActionLoaded then begin if ATopItemIndex=-1 then LTopItemIndex:=GetListViewTopItemIndex(AListView) else LTopItemIndex:=ATopItemIndex; for I := LTopItemIndex to LTopItemIndex + LoadVisibleListViewItemCount do if I<=AListView.ItemCount-1 then begin AListView.Adapter.ResetView(AListView.Items.Item[I]); end; end; end; Суффикс Ex в AListView.Items.FilterEx игнорируйте, используйте AListView.Items.Filter. Это я для нормального поиска (по всем полям и Data, а не только по Text) переписывал исходники ListView...
    С таким кодом возможно у вас будет больше возможностей для перехвата исключения. Ну или игнорирования поиска пока работает скролл ListView.
  20. Like
    Anatoliy отреагировална haword в Не открывается меню загрузить файл в android   
    а в хроме такое прокатывет на андроиде? если да скорее всего у ПО нет доступа к файловой системе. В андроиде выше 5 надо спрашивать на это дополнительно у пользователя. 
  21. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Диалоговое окно MessageBox на Android   
    поправить cамому в файлике FMX.Consts.pas и положить рядом с проектом
  22. Like
    Anatoliy отреагировална Barbanel в Размеры формы на разных устройствах   
    Этот код был на этом форуме. Смотрите переменную sScale
    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin sScreenSize := ScreenService.GetScreenSize.Round; sScale := ScreenService.GetScreenScale; DeviceInfo.diScreenLogic := FloatS(sScreenSize.x) + ' x ' + FloatS(sScreenSize.y); DeviceInfo.diScreenPhis := FloatS(sScreenSize.x * sScale) + ' x ' + FloatS(sScreenSize.y * sScale); DeviceInfo.diScreenWidth := sScreenSize.x; DeviceInfo.diScreenHeight := sScreenSize.y; DeviceInfo.diScale := sScale; end;  
    Одно из наших приложений, в архиве чуть побольше фоточек чтобы вы убедились что все действительно хорошо. Ну, заодно и критику от коллег смогу услышать))
    PS. не обращайте внимания на язык, так задумано)
    приложение делается для школ Германии.

    Screens.zip
  23. Like
    Anatoliy отреагировална Barbanel в Возможности Androidapi   
    Правильно.
    Насколько я знаю, не ко всему. Конкретный пример вспомнить не смогу, но некоторые вещи приходится тащить отдельно.
    Также, некоторые вещи проще написать на Java и потом импортировать эти библиотеки в FMX.
    Однако, бОльшая часть необходимых процедур апи - в наличии, этого вполне достаточно чтобы собрать полноценное приложение со средними я бы сказал запросами.
  24. Like
    Anatoliy отреагировална Brovin Yaroslav в Есть ли какая-нибудь возможность вставить тире в package файла AndroidManifest.xml   
    Нет. Название Java пакета не поддерживает "-" в названии. Только латинские буквы в нижнем и верхнем регистрах, числа и '_'.
    https://developer.android.com/guide/topics/manifest/manifest-element?hl=ru#package
     
  25. Like
    Anatoliy отреагировална Brovin Yaroslav в [Android] Не получается увеличить высоту TProgressBar   
    В новой версии студии RAD Studio Berline, дизайнер стилей TStyleBook теперь показывает эти два свойства для каждого стилевого компонента.
    Таким образом открыв стиль в TStyleBook, вы можете сбросить значения этих свойств для снятия ограничений. Или же поменять их на свои.
×
×
  • Создать...