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

Евгений Корепов

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

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

  • Посещение

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

    100

Весь контент Евгений Корепов

  1. Смотрите, вот ваш код: procedure TfmMain.LoadBitmapFromURL(const AURL: string; const AItem: TListViewItem; aBitmap: TBitmap; aSourceBmp: TRectangle); var K: Integer; // Анонимная процедура захватывает локальную переменную, а не обращается к AItem, которой уже может не быть в момент _окончания_ скачивания фотки FHTTPClient : THTTPClient; ResourceStream: TResourceStream; begin Вы используете асинхронный вызов FHTTPClient.BeginGet , начинает выполнятся HTTP запрос, одновременно процедура LoadBitmapFromURL завершает работу и компилятор уничтожает локальные переменные, включая FHTTPClient. Асинхронные вызовы с получением результат происходят уже после уничтожения FHTTPClient и естественно ничего не работает. Вод виндой работает случайно - из за другой модели управления памятью. У вас несколько путей: 1. Сделать FHTTPClient глобальным - лучший и простой путь. 2. Создавать поток самостоятельно, использовать в нем FHTTPClient.Get (не асинхронный) 3. И еще куча вариантов.... Посмотрите как реализовано у меня (по первому варианту)
  2. Вопрос решился благодаря компонентам https://www.jvesoft.com/wp/ads-and-in-app-payments/ . Подробности в этой теме
  3. По служебной необходимости сижу в Интернете через Чешский forpsi.net , доступа к форму нет, приходится роутить маршрут отдельно для форума, что не удобно. D:\>tracert fire-monkey.ru Трассировка маршрута к fire-monkey.ru [92.53.96.202] с максимальным числом прыжков 30: 1 76 ms 74 ms 80 ms 10.1.0.1 2 76 ms 75 ms 76 ms 3.211.forpsi.net [80.211.211.3] 3 77 ms 75 ms 76 ms bee-core.cloud-bee-bee.forpsi.net [81.2.192.93] 4 * * * Превышен интервал ожидания для запроса. 5 * * * Превышен интервал ожидания для запроса. 6 * * * Превышен интервал ожидания для запроса. 7 * * * Превышен интервал ожидания для запроса.
  4. Понял в чем дело - шаблоны лежат тут \vkrapotkin-vklistview-2389334d1383\Demo\Win32\Debug , а exe файл компилятор создает тут \vkrapotkin-vklistview-2389334d1383\Demo\ В настройках проекта, в Delphi Compiler, Output Direcrory = '', вместо '.\$(Platform)\$(Config)' по умолчанию.
  5. Предлагаю улучшение ) function TVK_LV_BaseAdapter<TDataItem>.AddPatternFromFile( const Filename: string): TVK_LVPattern; begin if Not TFile.Exists(Filename) then raise Exception.Create('Template file not found'); result := TVK_LVPattern.CreateFromFile(Filename); result.LV := LV; Patterns.Add(result); end;
  6. Вылетает AV на GetValue(ItemSpaces.X), ItemSpaces нигде до этого не инициализируется вроде. procedure TVK_LVPattern.SetupListView(const LV: TListView); var i: Integer; begin FNowParsing.Clear; LV.ItemSpaces.Left := GetValue(ItemSpaces.X); LV.ItemSpaces.Top := GetValue(ItemSpaces.Y); LV.ItemSpaces.Right := GetValue(ItemSpaces.X + ItemSpaces.W); LV.ItemSpaces.Bottom := GetValue(ItemSpaces.Y + ItemSpaces.H); end;
  7. У меня ругается на отсутствие JsonableObject. В x-superobject вроде такого нет. Где взять?
  8. Там видимо все контролы ControlType Platform подвержены этому глюку. А Браузер - это нативный контрол по умолчанию.
  9. Я в своем сообщении указал способ решения: https://quality.embarcadero.com/browse/RSP-25523 Там Dave Nottage написал причину и способ исправления: Прикладываю архив с исправленным FMX.Platform.iOS.pas - положите в папку с проектом и все заработает нормально (я проверил). P.S. Несчастный FMX.Platform.iOS.pas изуродовали в Рио бесчеловечно )) Какой то индус прошелся по нему в наркотическом угаре. FMX.Platform.iOS.pas.7z
  10. Да, легко удалось воспроизвести проблему - набрал yandex.ru, нажал Go (открылась страница), на странице нажал ссылку "Картинки" - появилась клавиатура, которая не получает фокуса, не реагирует на тыканье. Среда 10.3.2, iPhone SE, iOS 12.3.1 Возможно проблема перекликается с https://quality.embarcadero.com/browse/RSP-25523
  11. Закиньте сюда тестовый проект, я проверю на своем устройстве.
  12. И сделайте лучше как я предложил - отдельно преобразование класса, отдельно получение данных. Тут invalid class type cast скорее ошибка TListViewItem (ListView1.Items.Item), а не AsCurrency. Вы никак не ускоряете код записывая его одной строкой, но ухудшаете читабельность и усложняете поиск ошибок.
  13. Да, последняя строчка моего сообщения как раз об этом:
  14. Все тоже самое что и VLC, только чуток по другому: procedure TForm1.FillListView; var AItem : TListViewItem; begin AItem :=Listview.Items.Add; AItem.Data['Text1']:='Яблоки';//товар AItem.Data['Cost']:=100;//цена AItem :=Listview.Items.Add; AItem.Data['Text1']:='Груши';//товар AItem.Data['Cost']:=120;//цена AItem :=Listview.Items.Add; AItem.Data['Text1']:='Дыни';//товар AItem.Data['Cost']:=80;//ценаend; end; procedure TForm1.ProcessingListView; var I : Integer; AItem : TListViewItem; ASum : Currency; begin ASum:=0; for I := 0 to ListView.Items.Count - 1 do begin AItem:=(ListView.Items.Item[I] as TListViewItem); ASum:=ASum + AItem.Data['Cost'].AsCurrency; end; Label1.Text:=CurrToStr(ASum); end; Обратите внимание - цену присваиваем как число, а не как строку (не за чем лишние преобразования делать) AItem.Data['Cost']:=120;//цена Вторую процедуру можно было без AItem : TListViewItem; сделать, но для наглядности я сделал именно так.
  15. На будущее - при создании темы указывайте все исходные данные (как минимум вашу версию среды), что бы люди не давали вам советы, а потом уже узнали советы для какой версии среды они вам нужны. Я поставил Берлин и попробовал - ничего не получилось, результат такой же как у вас. Разбираться времени нет. Вот вам варианты: 1. Постарайтесь избавится от http и перейти на https. В наше время почти не возможно найти сайт http, даже самые отсталые госслужбы перешли на https на своих порталах. Если это ваш сервер, то я могу проконсультировать по способам перевода его на https. 2. Перейдите на Delphi 10.3.2. 3. Сделайте на каком нибудь другом сервере прокладку между запросами приложения по https и запросами к вашему серверу по http.
  16. Хм. Вот тут не подскажу. 10.1 лениво ставить. Закиньте суда свой AndroidManifest.template.xml (уже отредактированный). И кстати, попробуйте прогнать его онлайн валидатором xml
  17. Я разобрался в чем дело: Вместо TMapAccess.Write используйте TMapAccess.ReadWrite. TMapAccess.Write по какой то причине затирает если не все, то некоторые последние изменения канваса. В доке http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Graphics.TBitmap.Map не нашел упоминания о таком поведении.
  18. Вы где то ошиблись. Или в левой кодировке сохранили файл, или еще что. На тестовом проекте добавил - все отлично собралось. Вот мой AndroidManifest.template.xml <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%" android:resizeableActivity="false" <!-- Вот сюда я добавил строчку --> android:usesCleartextTraffic="true"> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  19. К сожалению начиная с Токио, Эмбаркадера почти полностью поломала TBitmap. Его поведение стало неадекватным. Вместо сохранения можете делать var BitmapSurface : TBitmapSurface; ... BitmapSurface:=TBitmapSurface.Create; BitmapSurface.Assign(Image1.Bitmap); BitmapSurface.Free; Эта манипуляция в процедуре сохранения, как раз и помогает от затирания канваса. Почему это работает я не понял. Не забывайте так же проверять удалось ли заблокировать канвас. Вот я накидал пример: procedure TForm1.Button1Click(Sender: TObject); var Bitmap : Tbitmap; BitmapData : TBitmapData; I: integer; J: integer; Distance: integer; Surf: TBitmapSurface; begin Bitmap := Tbitmap.Create; Bitmap.CreateFromFile('D:\2012643.jpg'); if Bitmap.Canvas.BeginScene then try Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Blue; Bitmap.Canvas.DrawEllipse(TRectF.Create(10, 10, 20, 20), 1); finally Bitmap.Canvas.EndScene; end; Surf:=TBitmapSurface.Create; Surf.Assign(Bitmap); Surf.Free; if Bitmap.Map(TMapAccess.Write, BitmapData) then try Distance:=10; for I := 0 to Round(BitmapData.Width / Distance) - 1 do for J := 0 to Bitmap.Height - 1 do begin begin AlphaColorToPixel(TAlphaColorRec.Red, @PAlphaColorArray(BitmapData.Data) [J * (BitmapData.Pitch div PixelFormatBytes[Bitmap.PixelFormat]) + Distance * I], Bitmap.PixelFormat); end; end; finally Bitmap.Unmap(BitmapData); end; Image1.Bitmap.Assign(Bitmap); end;
  20. Вот тут рецепт, в манифест добавьте поля, https://stackoverflow.com/questions/51902629/how-to-allow-all-network-connection-types-http-and-https-in-android-9-pie
  21. Возможно вы отправляете запрос на http вместо https ? Запросы без шифрования теперь запрещены по умолчанию. Но это можно обойти - тут в нескольких недавних темах это обсуждалось.
  22. Вам удалось решить проблему для камеры? Перелопатил весь интернет, но похоже Эмба не озаботилась этим вопросом. Пока присобачил костыль из говна и палок - в AppEvent определяю что приложение стало не активным TApplicationEvent.WillBecomeInactive, значит вылез диалог спрашивания разрешений, После этого по событию TApplicationEvent.BecameActive (диалог завершен), проверяю что приходит от камеры в FCamera.OnSampleBufferReady - если черный-черный ничего, то можно подумать что разрешение не было дано )))))))) От этого костыля у меня кровь из глаз....
  23. На ваш вопрос я не могу дать ответа. Но зачем вам использовать OkHttp? Может достаточно стандартных возможностей?
×
×
  • Создать...