Anatoliy
-
Постов
176 -
Зарегистрирован
-
Посещение
Активность репутации
-
Anatoliy отреагировална Brovin Yaroslav в заполнение окна формы 2-3 или колонки в зависимости от ориентации экрана
Добрый день,
Используйте TGridLayout. У него вы только указываете размер элемента (ItemWidth, ItemHeight). Далее этот компонент автоматчиески все дочерние контролы выстраивает в сетку с размером ячейки ItemWidth x ItemHeight
-
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;
-
-
Anatoliy отреагировална krapotkin в альтернатива диалогу
Это уже звучало на другом форуме, но что-то автор темнит
Я воспроизвел главную форму, модуль данных, из модуля данных(!) открываю OpenDialog
И все равно не проявляется эффект
-
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
-
Anatoliy отреагировална mazayhin в XE8, не могу установить соединение с базой Sqlite на устройстве под Android
Ну скорее всего у себя вы указали в коннекшене символическое имя для подключения, оно сохраняется в FDConnectionDefs.ini (вроде правильно), а у пользователя его нет.
Задайте параметры подключения вручную, явно
-
Anatoliy отреагировална Alex7wrt в альтернатива диалогу
Возможно, проблема в том что в VCL и FMX по-разному реализована работа с окнами. Пока в голову приходят два варианта и оба касаются исходного кода компонентов TFileOpenDialog либо TOpenDialog:
1. В исходниках кода TFileOpenDialog переделать работу с контекстом родительского окна под FMX. Вместо Handle окна использовать WindowHandleToPlatform(Handle).Wnd
2. В исходниках TOpenDialog разрешить нажатие на 'ОК' без выбора файла.
Для этого скопируйте в папку проекта модули, в которых реализован функционал TFileOpenDialog или TOpenDialog и поэкспериментируйте с ними.
-
Anatoliy отреагировална Alex7wrt в альтернатива диалогу
Добрый день
Проверил поведение TOpenDialog в своей программе в полноэкранном режиме. При переключении на другие программы и обратно окно диалога никуда не исчезает. Сложно сказать, чем вызвано подобное поведение диалога в вашем случае. Возможно стоит проверить код в обработчиках событий формы.
Также, рекомендую поиграться со свойствами формы BorderStyle, FullScreen, WindowState. В частности, попробуйте BorderStyle = None; FullScreen = true; WindowState = wsMaximized.
-
Anatoliy отреагировална #WAMACO в XE8, не могу установить соединение с базой Sqlite на устройстве под Android
в папку с exe положи sqlite3.dll
скачать последнюю версию можно с sqlite.org
-
Anatoliy отреагировална rareMax в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Мне очень неудобно, что я не обновил статью. На самом деле с этой библиотекой произошло очень много изменений с проектом:
- переехал на битБакет: https://bitbucket.org/RareGods/cloudapi/src/master/
- теперь там не только работа с телеграмом, но и другие сервисы
- после выхода Delphi CE позволил себе вырезать работу с сетевыми библиотеками, отличными от System.Net.
- пофиксил больше багов чем добавил.
На вскидку это все. На вопросы оперативно отвечаем в телеграм-чате : @CloudAPI.
-
Anatoliy отреагировална Евгений Корепов в Воспроизведение без задержки
Ну вряд ли найдется метод "более простой", я имел ввиду методы конкретной платформы, к примеру для андроида JAudioTrack или JAudioManager. Посмотрите вот тут http://www.fmxexpress.com/free-game-audio-manager-wrapper-class-in-delphi-xe6-firemonkey-for-android-ios-windows-and-osx/ может вам подойдет, или поищите (даже на этом форуме) JAudioTrack
-
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 Не помню уже, что именно. Ненужные уберите
-
Anatoliy отреагировална Tot999 в TPaintox+Tbitmap
Добрый день!
Решил покопаться в своей старой спрайтовой игрушке, чтобы освежить в памяти знания и состряпать что-нибудь новое. Возникли сомнения, нормально ли сделано графическое отображение, можно ли доработать.
Все спрайты в дизайнтайме распиханы по Timagelist-ам. На старте приложения я загружаю битмапы из имэджлистов в свои обджектлисты, подгоняя под нужный размер.
MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList<Tbitmap>;
Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:
В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.
-
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)
-
-
Anatoliy отреагировална sinuke в Не открывается меню загрузить файл в android
я так понимаю должен открыться выбор файла? ну на андройде логику выбора файла придется реализовывать самому... стандартного нет
-
Anatoliy отреагировална Евгений Корепов в IdHTTPServer и возврат параметра из формы в кодировке Windos
Если вы прибыли к нам из 1991 года и собираетесь использовать это приложение в прошлом тысячелетии - тогда все нормально. Если же вы наш современник - уберите из приложения и страницы все экзотические кодировки. Только UTF-8, только хардкор!
AResponseInfo.ContentEncoding := 'utf-8'; AResponseInfo.ContentType := 'text/html; charset=utf-8'; AResponseInfo.ContentLanguage := 'ru'; AResponseInfo.CharSet := 'utf-8'; При формировании содержимого страницы - формируйте как есть, без перекодирования в экзотику.
-
Anatoliy отреагировална Евгений Корепов в Реализовать рейтинг
Вместо рисования звезды в TPath, проще использовать соотвествующий символ юникода.
Char($2606) // Не закрашенная звезда
Char($2605) // Закрашенная звезда
https://unicode-table.com/ru/sets/stars-symbols/
Можно даже для еврейский магазинов сделать рейтинг ?
-
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.
-
Anatoliy отреагировална haword в Не открывается меню загрузить файл в android
а в хроме такое прокатывет на андроиде? если да скорее всего у ПО нет доступа к файловой системе. В андроиде выше 5 надо спрашивать на это дополнительно у пользователя.
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Диалоговое окно MessageBox на Android
поправить cамому в файлике FMX.Consts.pas и положить рядом с проектом
-
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
-
Anatoliy отреагировална Barbanel в Возможности Androidapi
Правильно.
Насколько я знаю, не ко всему. Конкретный пример вспомнить не смогу, но некоторые вещи приходится тащить отдельно.
Также, некоторые вещи проще написать на Java и потом импортировать эти библиотеки в FMX.
Однако, бОльшая часть необходимых процедур апи - в наличии, этого вполне достаточно чтобы собрать полноценное приложение со средними я бы сказал запросами.
-
Anatoliy отреагировална Brovin Yaroslav в Есть ли какая-нибудь возможность вставить тире в package файла AndroidManifest.xml
Нет. Название Java пакета не поддерживает "-" в названии. Только латинские буквы в нижнем и верхнем регистрах, числа и '_'.
https://developer.android.com/guide/topics/manifest/manifest-element?hl=ru#package
-
Anatoliy отреагировална Brovin Yaroslav в [Android] Не получается увеличить высоту TProgressBar
В новой версии студии RAD Studio Berline, дизайнер стилей TStyleBook теперь показывает эти два свойства для каждого стилевого компонента.
Таким образом открыв стиль в TStyleBook, вы можете сбросить значения этих свойств для снятия ограничений. Или же поменять их на свои.