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

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

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

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

  • Посещение

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

    100

Сообщения, опубликованные Евгений Корепов

  1. В 28.08.2019 в 15:41, Dmitry Stolyarov сказал:

     Delphi 10.3 Community Edition.

    Сделал без потока - все грузится.

    Проблема в потоке, такое ощущение что он умирает не отработав/не запустившись.

    Смотрите, вот ваш код:

    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. По служебной необходимости сижу в Интернете через Чешский 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     *        *        *     Превышен интервал ожидания для запроса.

     

  3. 48 минут назад, krapotkin сказал:

    ненавижу Deploy 

    опять потерялся файл pattern.json, поэтому не создавался шаблон в целом, и парсер его тоже

    приложил. у меня запустилось штатно. проверьте plz

    Предлагаю улучшение )

    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;

     

  4. 27 минут назад, krapotkin сказал:

    под виндой нормально, на андроиде проверю попозже.

    но TVK_LVPattern.itemspaces это record поэтому вроде бы и не нужно

    а LV.ItemSpaces вроде должен сам ListView инициализировать

    Если раньше найдешь, сигналь...

    Вот оно где image.thumb.png.92d322aeac516e06489c5fff46c90562.png

  5. Вылетает 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;

     

  6. 3 часа назад, Сергей Сергеев сказал:

    спасибо - завтра проверю на работе.. как то не провел параллель между тмемо и браузером.. 

     

    Там видимо все контролы ControlType Platform подвержены этому глюку. А Браузер  - это нативный контрол по умолчанию.

  7. 1 час назад, Сергей Сергеев сказал:

    спасибо за проверку..  и встает вопрос - как с этим жить?

    такое впечатление, что клавиатура становится на что то, что определяется как окно ввода, и поэтому появляется, почему не прячется по Done - не понятно..

    также, в тексте примера обнаружил  event не подключенный никуда ( понятно, что нужно на кейдаун  поля адреса), и по кнопке возврат на клаве должен передать фокус на кнопку, что по идее прячет фокус

    но этот частный случай не решает проблемы выскакивания клавы при хождении по сайту.. 

    немного улучщил ситуацию так.. на onShouldLoadStartRequest , поставил активацию таймера, который через 100 мс - делает HideKeyBoard. Помогает, но не всегда.. Событие OnShoKeyBoard возникает при появлении фейковой клавы. Как бы понять , что она не нужна и захлопнуть, но все это пляски.. надо в Emb писать глюк - чтобы правили. Возможно это изза нового SDK Ios - в старой, в скомпиленной в 2017 г. версии в webBrowser такого не заметил. Куда заводить БагТрек, подскажите, или заведите, если не сложно..

    Я в своем сообщении указал способ решения:

    https://quality.embarcadero.com/browse/RSP-25523

    Там Dave Nottage написал причину и способ исправления:

    image.thumb.png.daf0a8db5e626d537db71edade83a397.png

    Прикладываю архив с исправленным FMX.Platform.iOS.pas - положите в папку с проектом и все заработает нормально (я проверил).

    P.S. Несчастный FMX.Platform.iOS.pas изуродовали в Рио бесчеловечно )) Какой то индус прошелся по нему в наркотическом угаре.

    FMX.Platform.iOS.pas.7z

  8. Да, легко удалось воспроизвести проблему - набрал yandex.ru, нажал Go (открылась страница), на странице нажал ссылку "Картинки" - появилась клавиатура, которая не получает фокуса, не реагирует на тыканье.

    Среда 10.3.2, iPhone SE, iOS 12.3.1

    Возможно проблема перекликается с https://quality.embarcadero.com/browse/RSP-25523

    Screen Shot 2019-08-24 at 22.18.46.png

  9. 5 часов назад, Aleks Serov сказал:

    Нас троке TListViewItem (ListView1.Items.Item).Data['Cost'].AsCurrency вылетает ошибка: Invalid class type cast ((((

    где i - переменная цикла перебирающего список

    И сделайте лучше как я предложил - отдельно преобразование класса, отдельно получение данных. Тут invalid class type  cast скорее ошибка TListViewItem (ListView1.Items.Item), а не AsCurrency.

    Вы никак не ускоряете код записывая его одной строкой, но ухудшаете читабельность и усложняете поиск ошибок.

  10. 40 минут назад, qz5 сказал:

     

    
    ASum:=ASum + AItem.Data['Cost'].AsCurrency;

    Наверное будет работать и так в одну строку: TListViewItem (ListView.Items.Item).Data['Cost'].AsCurrency

    Ваш Капитан Очевидность

     

    Да, последняя строчка моего сообщения как раз об этом:

    Цитата

    Вторую процедуру можно было без AItem : TListViewItem; сделать, но для наглядности я сделал именно так.

     

  11. 22 часа назад, Aleks Serov сказал:

    Здравствуйте! Вывожу данные в список ListView который состоит из двух колонок: Text1, Text2(DynamicAppearance):

    var
    MyItem:TListViewItem;

    begin

    MyItem :=Form1.Listview1.Items.Add;
    MyItem.Data['Text1']:='Яблоки';//товар
    MyItem.Data['Text2']:='100';//цена     

    MyItem :=Form1.Listview1.Items.Add;
    MyItem.Data['Text1']:='Груши';//товар
    MyItem.Data['Text2']:='120';//цена 

    MyItem :=Form1.Listview1.Items.Add;
    MyItem.Data['Text1']:='Дыни';//товар
    MyItem.Data['Text2']:='80';//цена

    end;

    Заполнил строки и теперь по нажатию кнопки надо посчитать общую сумму товаров.

    В VCL в цикле легко и просто, а вот в FMX нет такого понятия SubItems в ListView и обратиться к нему нельзя (((

    Перепробовал все что удалось нагулить, результат нулевой. Как решить вопрос?

    Все тоже самое что и 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; сделать, но для наглядности я сделал именно так.

  12. 31 минуту назад, Татьяна сказал:

    Есть еще идеи, как заставить Андроид 9 работать с http?

    Help me please!

    На будущее - при создании темы указывайте все исходные данные (как минимум вашу версию среды), что бы люди не давали вам советы, а потом уже узнали советы для какой версии среды они вам нужны.

    Я поставил Берлин и попробовал - ничего не получилось, результат такой же как у вас. Разбираться времени нет.

    Вот вам варианты:

    1. Постарайтесь избавится от http и перейти на https. В наше время почти не возможно найти сайт http, даже самые отсталые  госслужбы перешли на https на своих порталах. Если это ваш сервер, то я могу проконсультировать по способам перевода его на https.

    2. Перейдите на Delphi 10.3.2.

    3. Сделайте на каком нибудь другом сервере прокладку между запросами приложения по https и запросами к вашему серверу по http.

     

  13. 11 минут назад, Татьяна сказал:

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

    Может, это от того, что у вас 10.3, а у меня 10.1 ?

    Хм. Вот тут не подскажу. 10.1 лениво ставить. Закиньте суда свой AndroidManifest.template.xml (уже отредактированный). И кстати, попробуйте прогнать его онлайн валидатором xml

  14. Я разобрался в чем дело:

    Вместо TMapAccess.Write используйте TMapAccess.ReadWrite. 

    TMapAccess.Write по какой то причине затирает если не все, то некоторые последние изменения канваса. В доке http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Graphics.TBitmap.Map не нашел упоминания о таком поведении.

  15. 16 минут назад, Татьяна сказал:

    Notepad++ я меняю.

    Сейчас удалила строку android:usesCleartextTraffic="true" и успешно скомпилировала apk-файл.

    Мне непонятно сообщение:

    No resource identifier found for attribute 'usesCleartextTraffic' in package 'android'

     

    Вы где то ошиблись. Или в левой кодировке сохранили файл, или еще что.

    На тестовом проекте добавил - все отлично собралось. Вот мой 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) -->

     

  16. К сожалению начиная с Токио, Эмбаркадера почти полностью поломала 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;

     

  17. 6 минут назад, Татьяна сказал:

    Почему код, который работал на Андроид 7 (проверка, есть ли Интернет; отправка get-запроса), перестал работать в Андроид 9?

    Это из-за разрешений? (permissions)

    Возможно вы отправляете запрос на http вместо https ? Запросы без шифрования теперь запрещены по умолчанию. Но это можно обойти - тут в нескольких недавних темах  это обсуждалось.

  18. Вам удалось решить проблему для камеры? Перелопатил весь интернет, но похоже Эмба не озаботилась этим вопросом. 

    Пока присобачил костыль из говна и палок - в AppEvent определяю что приложение стало не активным TApplicationEvent.WillBecomeInactive, значит вылез диалог спрашивания разрешений, После этого по событию TApplicationEvent.BecameActive (диалог завершен), проверяю что приходит от камеры в FCamera.OnSampleBufferReady - если черный-черный ничего, то можно подумать что разрешение не было дано )))))))) От этого костыля у меня кровь из глаз....

×
×
  • Создать...