Alex7wrt

Пользователи
  • Публикаций

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

  • Посещение

  • Победитель дней

    16

Весь контент Alex7wrt

  1. Alex7wrt

    ListView, сброс SearchBox

    Добрый день Использую ListView.SearchBox для фильтра текста итемов. При первом использовании все норм. Но если после первого использования заменить тексты итемов, то поиск работает уже некорректно, то есть не находит итемы, которые содержат вводимый в SearchBox текст. Что нужно сделать, чтобы после замены текстов у итемов в ListView поиск через SearchBox всегда работал корректно? Может быть, какой-то сброс или что-то типа того? Заранее спасибо Rad Studio 10.1.2
  2. На Xiaomi "Now" выдает правильное время. Посмотрите в настройках телефона параметр "Регион"
  3. Всем здравствуйте! Необходимо отлавливать событие, когда музыкальный трек заканивает воспроизведение (причем, определять нужно точно). В медиаплеере такого события не нашел. Все, что придумал - это в таймере с маленьким интервалом (10-50 мс) выполнять проверку TMediaplayer.State = TMediaState.Stopped, но это довольно ресурсоемко, и все равно интервал великоват. Есть ли способ сделать так, чтобы по окончанию воспроизведения трека генерировалось это событие? Или есть ли нересурсоемкий способ зациклить воспроизведение трека с минимальной задержкой между циклами?
  4. Alex7wrt

    System.Net.Socket.TSocket

    Используйте TCPServer/TCPClient Для отправки по TCP. Там принцип работы тот же, многие методы/свойства идентичны. У меня все работает на всех платформах Прием данных в TCPServer делайте в OnExecute. В TCPClient для приема используйте поток: procedure TTCPConnectThread.Execute; begin while not Terminated do begin try if TCPClient.Connected then begin //Здесь считываем данные, например с помощью TCPClient.IOHandler.ReadLn, и обрабатываем их end; finally sleep(100); end; end; end;
  5. Уважаемый X11, пожалуйста, не вводите людей в заблуждение. По теме обязательного использования последних API на форуме уже есть несколько тем. С августа разрешена публикация новых приложений только с API не ниже 26 (Android 8.0), а с ноября для обновлений. Для того, чтобы приложение соответствовало новым требованиям, в файле мвнифеста нужно поменять параметр TargetSDKVersion на 26 или выше. Google никого банить не будет. Приложение просто не пропустят на публикацию. Уже сейчас при размещении в Google Play приложения с более ранней версией SDK, появляется предупреждение, что скоро публиковать можно только с SDK 26 и выше. Существующие же приложения никто трогать не будет.
  6. Alex7wrt

    PopUp и Canvas

    Можете сами рисовать PopUp на той же канве. Любой формы, цвета и т.д. По событиям мыши переприсваивать булевы переменные показать/скрыть PopUp, по координатам курсора определять над каким Item находится курсор мыши и т.д. Да, это более длинный подход, зато более универсальный.
  7. Полностью согласен с Krapotkin. Выделять отдельный поток только для создания визуальных компонентов не имеет смысла, так как синхронизацией вы все равно создаете их в главном потоке. Поток нужен для работы с данными или невизуальными компонентами, например THTTPClient, UDP, TCP и т.д. К примеру, вот вариант загрузки картинок по http: procedure TInitThread.Execute; var HTTP: THTTPClient; Stream: TStringStream; i: shortint; success: boolean; begin try try HTTP:=THTTPClient.Create; Stream:= TStringStream.Create('',TEncoding.ANSI); HTTP.Get('адрес www', stream); Stream.Position:=0; names.LoadFromStream(Stream); i:=names.Count; while i>0 do begin try setlength(images,length(images)+1); images[length(images)-1]:=TBitMap.Create; Stream.Clear; HTTP.Get('адрес www'+names[i-1]+'.png',Stream); Stream.Position:=0; Synchronize(procedure begin images[length(images)-1].LoadFromStream(Stream); end); except images[length(images)-1]:=noname; end; names.Delete(i-1); i:=i-2; end; success:=true; except names.Clear; success:=false; end; finally HTTP.Free; Stream.Free; end; end; Пример может немного корявый, но из него видно, что синхронизация используется только для загрузки данных в Bitmap, (и то потому что это код под 10.1 Berlin. Начиная с версии 10.2 битмапы тоже можно загружать в потоке), все остальное в синхронизации не нуждается. Прошу прощения за небольшой оффтоп (хотя это можно отнести к вопросу № 3), но как вы делаете переключение фреймов свайпом? Очень интересно
  8. По моему, все равно. Как вам удобнее. Я так понимаю, что TTask разработаны с прицелом на параллельные вычисления, когда нужно выполнять однотипные операции в нескольких потоках. Для этого дела там имеются опции по ожиданию выполнения остальных потоков и т.д. TTask также удобен тем, что его можно сразу использовать, не нужно объявлять поток. TThread удобен, если нужно выполнить определенный набор действий по завершению потока (с помошью OnTerminate). Может и в TTask такое есть, не знаю Лично я просто привык использовать TThread
  9. Дело в том, что индикатор отрисовывается в основном потоке. По видимому ваша процедура также выполняется в основном потоке. Чтобы не было подтормаживаний, выполняйте фоновые операции в отдельном потоке, а при необходимости отрисовать какой-нибудь визуальный компонент, пользуйтесь Synchronize или Queue.
  10. Alex7wrt

    TMotionSensor

    Подтверждаю Раньше никогда не работал с сенсорами. И вот сразу обнаружил эту неприятную особенность на некоторых телефонах. На Xiaomi Redmi 3S все работает отлично, но на Samsung Galaxy S7 Edge (который по идее супер нафарширован сенсорами) что акселерометр, что гироскоп выдает сплошные нули. Другие приложения из Google Play типа "Уровень" или "Компас" работают понятное дело отлично, а собранное в FMX - Нет. ((( По комментарию выше подозреваю что проблема с самсунгами. Но ведь сторонние приложения работают. В чем же может быть причина? Хотя судя по тому, что это единственная тема на форуме по датчикам движения, подозреваю, что ответ вряд ли получу )) Но хоть для истории коммент останется unit uMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms3D, FMX.Forms, FMX.Dialogs, System.Sensors, FMX.Controls3D, FMX.Objects3D, FMX.StdCtrls, FMX.Layers3D, FMX.MaterialSources, FMX.Types3D, System.Math.Vectors, FMX.Controls.Presentation; type TGyroscopeForm = class(TForm3D) Rectangle3D1: TRectangle3D; Timer1: TTimer; LightMaterialSource1: TLightMaterialSource; Light1: TLight; Layer3D1: TLayer3D; Label1: TLabel; procedure Timer1Timer(Sender: TObject); procedure Form3DCreate(Sender: TObject); end; var GyroscopeForm: TGyroscopeForm; FSensor1: TCustomOrientationSensor; FSensors: TSensorArray; FSensorManager: TSensorManager; implementation {$R *.fmx} {$R *.LgXhdpiPh.fmx ANDROID} procedure TGyroscopeForm.Form3DCreate(Sender: TObject); var Sensor: TCustomSensor; begin { attempt to get and activate the sensor manager } FSensorManager := TSensorManager.Current; FSensorManager.Activate; FSensors := TSensorManager.Current.GetSensorsByCategory(TSensorCategory.Orientation); FSensor1 := nil; for Sensor in FSensors do if TCustomOrientationSensor(Sensor).SensorType = TOrientationSensorType.Inclinometer3D then begin FSensor1 := TCustomOrientationSensor(Sensor); Break; end; if not Assigned(FSensor1) then begin Label1.Text := 'Gyro not found'; Exit; end; if not FSensor1.Started then begin FSensor1.Start; Timer1.Enabled := True; end; end; procedure TGyroscopeForm.Timer1Timer(Sender: TObject); begin { check for sensor assignment } if Length(FSensors) > 0 then if Assigned(FSensor1) then begin Rectangle3D1.RotationAngle.X := FSensor1.TiltX; Rectangle3D1.RotationAngle.Y := FSensor1.TiltY; Rectangle3D1.RotationAngle.Z := FSensor1.TiltZ; Label1.Text := Format('Gyro: %3.1f %3.1f %3.1f',[Rectangle3D1.RotationAngle.X, Rectangle3D1.RotationAngle.Y, Rectangle3D1.RotationAngle.Z]); end; end; end.
  11. Чтобы сохранялась прозрачность, перед заполнением канвы делайте Canvas.Clear(0);
  12. Добрый день Есть приложение, которое работает в полноэкранном режиме. Первый раз тестил его на экране с соотношением сторон 18:9 (Xiaomi Redmi 5). По умолчанию приложение открывается с черными полосами сверху/снизу либо слева/справа (смотря какая ориентация) В недрах настроек телефона есть опция "полноэкранный режим", где любому приложению можно разрешить/запретить работу на весь экран. При активации этой опции для моего приложения, размер экрана все равно определяется неверно (должно быть 1440*720, а получаю 1344*720), и из-за этого при отрисовке элементов интерфейса вблизи границ экрана получаю не то, что должно быть. Например, есть элемент шириной W, тогда при отрисовке элемента в точке с горизонтальным значением Point.X:=20 и в точке с Point.X:=Screen.Width - W - 20, получаю разные расстояния от элемента до левой и правой стороны экрана соответственно (альбомная ориентация). При этом для "обычных" экранов все работает отлично.Подозреваю, что это как-то связано с наэкранными кнопками меню, но не знаю, это особенность Xiaomi или вообще всех таких современных экранов. Кто в теме, подскажите.
  13. Alex7wrt

    Увеличение содержимого TImage

    C помощью DrawBitmap отрисовать канву увеличиваемой области в прямоугольнике большего размера.
  14. Пробовали сделать все 120 картинок в один ряд, без столбцов?
  15. Все равно спасибо за участие!
  16. Alex7wrt

    Настройки SDK для Токио

    Это пути к файлам Android SDK, которая в целом отношения к студии не имеет. Если она у вас расположена в папке Берлина, то укажите пути к ней и все.
  17. На этих телефонах экран 16/9, а не 18/9. Как раз в Redmi 5 и есть мой вопрос. Если получится посмотреть, буду очень благодарен
  18. Этот параметр остался из единого кода с iOS, где он скрывает статусбар.
  19. Все-таки сделал пример. Прикрепил архив с проектом app.zip Вот весь код: procedure TForm1.FormCreate(Sender: TObject); var i: byte; begin Container:=TRectangle.Create(Form1); with Container do begin Parent:=Form1; Align:=TAlignLayout.Contents; Stroke.Kind:=TBrushKind.None; Fill.Color:=TAlphaColors.Black; end; for i:= 1 to 4 do with TRectangle.Create(Container) do begin Parent:=Container; Stroke.Kind:=TBrushKind.None; Fill.Color:=TAlphaColors.White; end; end; procedure TForm1.FormResize(Sender: TObject); var i: byte; begin w:=screen.Width; h:=screen.Height; for i:= 1 to 4 do begin with TRectangle(Container.Children[i-1]) do begin Height:=min(w,h)*(0.35+0.1*byte(w>h)); Width:=Height*1.33; if h>w then begin Position.X:=(w - 2*Width-0.1*width)*0.5 + ((i+1) mod 2)*(Width+0.1*width); Position.Y:=(h - 2*Height-0.6*width)*0.5 + (i div 3)*(Height+0.1*width); end else begin Position.X:=(w - Width-0.03*h)*((i+1) mod 2)+0.015*h; Position.Y:=(h - Height-0.03*h)*max((round(i*0.5)-1),0)+0.015*h; end; end; end; end; В альбомной ориентации на "обычных" устройствах интерфейс имеет следующий вид: Но на Redmi 5 рамка справа намного шире, из-за чего картинка теряет симметрию. Скорее всего это из-за некорректного определения размера экрана
  20. Да вот с этим проблема Само приложение представляет собой клиент, который работает только в связке с серверной частью на компе, поэтому скинуть не получится А сам Redmi 5 мне на данный момент не доступен, поэтому сомневаюсь, что сделаю адекватный пример. Вчера на нем тестировал. Если бы был при мне, может быстрее нашел бы решение. Но Redmi 3S у меня есть, на нем как и на абсолютно всех других телефонах с соотношением 16 на 9 и меньше, и с аппаратными кнопками, все работает норм. Думаю сама концепция тестового примера сводится к следующему В свойствах формы FullScreen = true; BorderStyle = bsNone; Помещаем 2 кнопки, и для их горизонтальных координат указываем то, что я писал в посте выше X:=20; X:=Screen.Width - W - 20;
  21. Добрый день. Столкнулся со следующей задачей: не получается использовать микрофон под iOS. В документации Apple нашел следующее: ссылка. Судя по этой информации, начиная с iOS 10 нужно выполнять запросы на разрешение использования тех или иных функций. Кто-нибудь знает как добавить запрос на разрешение использования микрофона в iOS? На тестируемом устройстве установлена iOS 11.4. Среда 10.1.2.
  22. Проверьте в Project->Options->User Permissions проставлены ли разрешения на Modify Audio Settings и Record Audio (предполагаю, что после Bass_Init вы пишите Bass_RecordInit, как в моем примере).
  23. Измените в Deployment RemotePath этого файла на assets\internal\
  24. Alex7wrt

    Audio Streaming

    Можно еще поиграться с размером буфера в Bass, который измеряется в миллисекундах и по умолчанию равен 500. Чем он больше, тем меньше вероятность потерь, но больше задержка звука при стримминге.