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

qz5

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

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

  • Посещение

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

    13

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

  1. Like
    qz5 отреагировална Maka в переход к x64?   
    Отвечают долго, 10-14 дней, а потом еще около 7 дней переписка, проверки и ожидание решения. Наберитесь терпения
  2. Like
    qz5 отреагировална krapotkin в Загрузка настроек приложения из БД   
    правильный ответ - не делать так ))
    нужно хранить настройки приложения в отдельном классе
    тогда кроме самого класса нужны методы, которые 
    1) читают пишут его из ... файла, БД, интернета и т.д.
    2) в нужный момент (обычно чтобы изобразить форму и заполнить св-ва компонентов или еще для чего угодно) использовать эти настройки
    3) вытекает из 2) сохранять в нужный момент новые значения в переменную, где лежат настройки
    для хранения настроек отлично подходит JSON. Т.к. он может иметь иерархическую структуру, что очень удобно. Его и хранить в БД.
    Можно и прямо поля, строки и все такое, но все равно, собирать их нужно в некое хранилище в программе.
    Пример разбирал тут http://www.cyberforum.ru/blogs/469693/blog4883.html
  3. Like
    qz5 отреагировална krapotkin в Фреймворк для стандартного ListView   
    еще один пример раскладки из реального проекта

    { "Columns":[], "Variables": [ {"Y_UNIT":"12"}, {"GAP":"8"}, {"ITEM_H":"2*GAP+5*Y_UNIT"}, {"IMG_H":"76"}, {"IMG_W":"76"}, {"STOCK_SIZE":"48"}, {"PRICE_COLW":"53"} ], "Objects": [ {"Name":"ID","Kind":"data"}, , {"Name":"img","Kind":"image", "Place":{"X":"0","Y":"0","W":"IMG_W","H":"IMG_H"}, } , {"Name":"Text","Kind":"text","TextHAlign":"leading","TextVAlign":"leading", "Place":{"X":"img.right","Y":"GAP","W":"itemwidth - IMG_W - GAP - 2*PRICE_COLW - GAP","H":"52"}, "WordWrap":true, "Color":"black", "Font":{"Size":12} } , {"Name":"earlier","Kind":"text","TextHAlign":"leading","TextVAlign":"leading", "Place":{"X":"text.left","Y":"ITEM_H-2*GAP+2","W":"itemwidth - 2*PRICE_COLW","H":"Y_UNIT"}, "WordWrap":false, "Color":"green", "Font":{"Size":10} } , {"Name":"price1","Kind":"text","TextHAlign":"trailing","TextVAlign":"trailing", "Place":{"X":"itemwidth-GAP-PRICE_COLW-W","Y":"GAP+2*Y_UNIT","W":"auto","H":"Y_UNIT*1.5", "priority":"WXYH"}, "WordWrap":false, "Color":"black", "Font":{"Size":15} } , {"Name":"imgstrike","Kind":"image", "Place":{"X":"price1.x-5","Y":"price1.y","W":"price1.w+8","H":"price1.h"}, } , {"Name":"price2","Kind":"text","TextHAlign":"trailing","TextVAlign":"trailing", "Place":{"X":"price1.right-W","Y":"ITEM_H-GAP-Y_UNIT*1.5","W":"auto","H":"Y_UNIT*1.5", "priority":"WXYH"}, "WordWrap":false, "Color":"black", "Font":{"Size":15, "style":"bold"} } , {"Name":"qty","Kind":"text","TextHAlign":"trailing","TextVAlign":"center", "Place":{"X":"itemwidth-PRICE_COLW-GAP","Y":"GAP","W":"PRICE_COLW","H":"2*Y_UNIT"}, "WordWrap":false, "Color":"black", "Font":{"Size":27, "style":"bold"} } , {"Name":"imgstock","Kind":"image", "Place":{"X":"itemwidth-STOCK_SIZE-3","Y":"ITEM_H-STOCK_SIZE-4","W":"STOCK_SIZE","H":"STOCK_SIZE"}, } ], "ItemHeight":"ITEM_H", "ItemSpaces": {"X":"0","Y":"0","W":"0","H":""}, "SideSpace":"0" }  
  4. Like
    qz5 получил реакцию от Anatoliy в Не отрисовываются итемы при FetchOptions.Mode:=fmManual у DataSet'a   
    Короче нашел способ, чтобы добавлялись Item при LiveBinding! Потратил кучу времени. Вот так:
    FDQuery1.FetchNext; LinkFillControlToField1.Active := False; LinkFillControlToField1.Active := true; Но есть тогда другая проблема - ListView прокручивается на самый верх при добавлении новых строк.
    Решил это вот так:
    procedure TForm1.ListView1ScrollViewChange(Sender: TObject); var ItemHeight, p: single; begin p := ListView1.ScrollViewPos; ItemHeight := ListView1.ItemAppearance.ItemHeight; if ListView1.ScrollViewPos + ListView1.Height > ItemHeight * 0.8 * ListView1.ItemCount then begin FDQuery1.FetchNext; LinkFillControlToField1.Active := False; LinkFillControlToField1.Active := true; ListView1.ScrollViewPos := p; end; end; В принципе работает, надо только добавить условия, что все данные показаны и т.п., но наверное не буду я всё равно делать на биндингах.
    Хочу всё переделать назад на ручное добавление элементов. Подумаю как лучше будет работать.
  5. Like
    qz5 отреагировална mab в Не отрисовываются итемы при FetchOptions.Mode:=fmManual у DataSet'a   
    С ListView - нет. Уже и не помню зачем мне это было нужно) Решил задачу другим способом.
  6. Like
    qz5 получил реакцию от Anatoliy в Модерация приложения в google play   
    Сейчас вроде три дня обещают модерировать
  7. Like
    qz5 отреагировална Anatoliy в Умный дом   
    В телеграмм канале обсуждалось создание умного дома. Пишу сюда. Телеграмм канал не удобен. Со временем там каша ничего не найти. Он лучше для флуда, а форум самое то. По теме - в студии для управления домом все есть из коробки. Сами биконы стоят копейки.
    Видио показывает управление. Ну и дополнительные полезные ссылки на  yutube:
     
  8. Like
    qz5 отреагировална Евгений Корепов в Где указать ownerBitmap := true (ImageListItemBottomDetail)   
    Смотрите, вот ваш код:
    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. И еще куча вариантов....
    Посмотрите как реализовано у меня (по первому варианту) 
     
  9. Like
    qz5 отреагировална Ingalime в Ping на Android или на iOS   
    Для платформы Андроид автор библиотеки Indy по имени Remy, приводит свои рассуждения тут:
    https://stackoverflow.com/questions/25096126/delphi-xe6-and-android-ping
     
  10. Like
    qz5 отреагировална krapotkin в Фреймворк для стандартного ListView   
    Всем привет!
    После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный ListView.
    Данные подаются в виде модели данных, описание раскладки итема лежит в JSON.

    Для работы пишется примитивный наследник класса-адаптера, который биндит данные модели на элементы из JSON. Я решил, что руками делать это дешевле чем через RTTI
    { TMyAdapter } procedure TMyAdapter.SetupDrawableContent(const ADrawable: TListItemDrawable; const AData: TMyData); begin if SameText( ADrawable.Name, 'text') then begin (ADrawable as TListItemText).Text := AData.Text; end else if SameText( ADrawable.Name, 'detail') then begin (ADrawable as TListItemText).Text := AData.Detail; end else if SameText( ADrawable.Name, 'balance') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Balance); end else if SameText( ADrawable.Name, 'reserved') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Reserved); end end; Главная хитрость и отличие от стандартного DynamicAppearance+LiveBinding - переменная высота итемов ListView и использование арифметики в описании раскладки.
    Можно указать Detail.Y  = Text.Bottom + 5, ItemHeight = Detail.Bottom + 10, Detail.W = ItemWidth/2 - X
    {"Kind":"rect","Name":"BonusRect","Value":"", "Place":{"X":"itemwidth*3/4","Y":"Text.Y","W":"ItemWidth/4-5","H":"50"}, "BorderColor":"#FF005500", "Color":"lime", "LineWidth":3}, {"TextHAlign":2,"TextVAlign":1,"Kind":"text","Name":"Balance","Value":"", "Place":{"X":"BonusRect.x+5","Y":"Text.Y","W":"BonusRect.w-10","H":"50"}, "WordWrap":true, "Color" :"Black", "Font":{"Size":18,"Style":""}} ], "ItemHeight":"detail.bottom+10", Это дает довольно гибкую систему. Не на все случаи жизни, но все, что нужно, можно после автоматической раскладки дополнительно приписать в OnUpdateObjects 
    Код для работы примерно такой
    procedure TForm1.FormCreate(Sender: TObject); begin data:= TMyDataList.CreateFromFile(ExePath()+'data.json'); // загрузка в модель данных Adapter := TMyAdapter.Create(lvWallets, data.Items, ExePath()+'pattern.json'); // создание адаптера и загрузка шаблона Adapter.Pattern.SetupListView(lvWallets); // задать отступы и разную мелочь Adapter.ResetView(); // здесь в цикле из модели данных создается нужное количество итемов ListView end; procedure TForm1.lvWalletsUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin Adapter.SetupContent(AItem); // загрузить текст, картинки и другое содержимое в элементы итема Adapter.Pattern.DoLayout(AItem); // поправить раскладку в соответствии с содержимым элементов итема end; Для использования кроме стандартных - текст, картинка, кнопка - создано несколько дополнительных элементов итема - прямоугольник, круг, уголок, линия.
    Отличие от ModernLV - , 
    1) все происходит без правки системных файлов
    2) пока нет колонок и других особых изысков.
    На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже
    UPD.
    ссылки на репозитории ниже
     
  11. Like
    qz5 отреагировална Евгений Корепов в TWebBrowser показывает две клавиатуры в IOS   
    Я в своем сообщении указал способ решения:
    https://quality.embarcadero.com/browse/RSP-25523
    Там Dave Nottage написал причину и способ исправления:

    Прикладываю архив с исправленным FMX.Platform.iOS.pas - положите в папку с проектом и все заработает нормально (я проверил).
    P.S. Несчастный FMX.Platform.iOS.pas изуродовали в Рио бесчеловечно )) Какой то индус прошелся по нему в наркотическом угаре.
    FMX.Platform.iOS.pas.7z
  12. Like
    qz5 получил реакцию от Евгений Корепов в Как можно обновиться в Google Play после 1 августа   
    Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет
    так в ближайшие 7 дней ждем Sugarloaf
  13. Like
    qz5 получил реакцию от Tumaso в Как можно обновиться в Google Play после 1 августа   
    Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет
    так в ближайшие 7 дней ждем Sugarloaf
  14. Like
    qz5 получил реакцию от Ingalime в Как можно обновиться в Google Play после 1 августа   
    Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет
    так в ближайшие 7 дней ждем Sugarloaf
  15. Like
    qz5 отреагировална Евгений Корепов в FMX 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; сделать, но для наглядности я сделал именно так.
  16. Like
    qz5 получил реакцию от Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?   
    Понятно, я пробовал вроде похожий метод взятый отсюда: https://stackoverflow.com/questions/37830470/firedac-freezes-gui
    всё равно не удовлетворило
  17. Like
    qz5 отреагировална Aleks133 в [ListView] получить список элементов у которых Checkmark=true   
    Долго я искал как это сделать в DynamicAppearance. 
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i: integer;
    begin
      Memo1.Lines.Clear;
      for i := 0 to ListView1.ItemCount - 1 do
      begin
        if ListView1.Items.Objects.FindObjectT<TListItemAccessory>('Accessory2')
          .Visible = true then
        begin
          Memo1.Lines.Add('Индекс отмеченного итема= ' + inttostr(i) + ',Значение = ' +
            ListView1.Items.Objects.FindObjectT<TListItemText>('Text3').Text );
        end;
      end;
    end;
  18. Like
    qz5 отреагировална Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?   
    я тоже не разобрался.. т.к. у меня в дизайнере создана custom item, все в Live Binding настроено.. поэтому ( для моего случая подходит - т.к. данных немного , не боле 100).. создал два одинаковых DataSet - один это результат запроса, никуда не приделан, второй ( полученный копированием в дизайнере первого) - прибайденный.  Открываю запрос - заполняется первый датасет ( это в потоке без синхронайза, т.к. на экран ничего не выводится), на экране нет еще данных. Копирую из 1го во второй - и данные на экране появляются( это уже в синхронайзе). Это позволило развязать получение данных с сервера и отображение их на экране. Понятно, что данных в два раза больше, но для меня не критично.
  19. Thanks
    qz5 получил реакцию от Сергей Сергеев в Как можно обновиться в Google Play после 1 августа   
    и вначале дадут Бету тем у кого есть действующая подписка
    "later this month" - переводится как "позже в этом месяце" или "после этого месяца"?
    Насколько я понимаю, всё-таки "позже в этом месяце"
    остался только непонятным вопрос - для "коммуняк" дадут бету или ждать релиза
  20. Like
    qz5 получил реакцию от Ingalime в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?   
    У меня используется только один FDConnection и один FDQuery. В FDQuery идет Select запрос из базы, а от FDQuery уже байндится на ListView
    вот если так оставить, то при запросе - всё тормозится на несколько секунд и может выводиться сообщение, что "приложение не отвечает"
    а если убрать байндинг - всё быстро
    пока сделал так: байндинг убрал, а вместо него в цикле обрабатывают результаты запроса и добавляю ListItem, причем после каждого добавления выполняю application.processmessages
  21. Like
    qz5 отреагировална Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?   
    вот нашел свой пример, который года три назад тоже подсмотрел гдето..
     
  22. Like
    qz5 отреагировална Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?   
    Synchronize - синхронизирует с основным потоком, я делал так - получал данные в потоке, без синхронизации, перегружал в видимы контролы в потоке с синхронизацией, а основной поток в это время крутил индикатор..
  23. Like
    qz5 отреагировална Евгений Корепов в Андроид 9 и Интернет   
    Вы где то ошиблись. Или в левой кодировке сохранили файл, или еще что.
    На тестовом проекте добавил - все отлично собралось. Вот мой 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) -->  
  24. Like
    qz5 получил реакцию от Ingalime в Андроид 9 и Интернет   
    нет, я только манифест менял
    но возможно Вы манифест меняли обычным блокнотом например, его нао править только программами, которые не добавляют ВОМ
    например с помощью Notepad++
  25. Like
    qz5 получил реакцию от Ingalime в Андроид 9 и Интернет   
    неправильно манифест изменили
×
×
  • Создать...