qz5
-
Постов
151 -
Зарегистрирован
-
Посещение
-
Победитель дней
13
Активность репутации
-
qz5 отреагировална Maka в переход к x64?
Отвечают долго, 10-14 дней, а потом еще около 7 дней переписка, проверки и ожидание решения. Наберитесь терпения
-
qz5 отреагировална krapotkin в Загрузка настроек приложения из БД
правильный ответ - не делать так ))
нужно хранить настройки приложения в отдельном классе
тогда кроме самого класса нужны методы, которые
1) читают пишут его из ... файла, БД, интернета и т.д.
2) в нужный момент (обычно чтобы изобразить форму и заполнить св-ва компонентов или еще для чего угодно) использовать эти настройки
3) вытекает из 2) сохранять в нужный момент новые значения в переменную, где лежат настройки
для хранения настроек отлично подходит JSON. Т.к. он может иметь иерархическую структуру, что очень удобно. Его и хранить в БД.
Можно и прямо поля, строки и все такое, но все равно, собирать их нужно в некое хранилище в программе.
Пример разбирал тут http://www.cyberforum.ru/blogs/469693/blog4883.html
-
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" }
-
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; В принципе работает, надо только добавить условия, что все данные показаны и т.п., но наверное не буду я всё равно делать на биндингах.
Хочу всё переделать назад на ручное добавление элементов. Подумаю как лучше будет работать.
-
qz5 отреагировална mab в Не отрисовываются итемы при FetchOptions.Mode:=fmManual у DataSet'a
С ListView - нет. Уже и не помню зачем мне это было нужно) Решил задачу другим способом.
-
qz5 получил реакцию от Anatoliy в Модерация приложения в google play
Сейчас вроде три дня обещают модерировать
-
qz5 отреагировална Anatoliy в Умный дом
В телеграмм канале обсуждалось создание умного дома. Пишу сюда. Телеграмм канал не удобен. Со временем там каша ничего не найти. Он лучше для флуда, а форум самое то. По теме - в студии для управления домом все есть из коробки. Сами биконы стоят копейки.
Видио показывает управление. Ну и дополнительные полезные ссылки на yutube:
-
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. И еще куча вариантов....
Посмотрите как реализовано у меня (по первому варианту)
-
qz5 отреагировална Ingalime в Ping на Android или на iOS
Для платформы Андроид автор библиотеки Indy по имени Remy, приводит свои рассуждения тут:
https://stackoverflow.com/questions/25096126/delphi-xe6-and-android-ping
-
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.
ссылки на репозитории ниже
-
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
-
qz5 получил реакцию от Евгений Корепов в Как можно обновиться в Google Play после 1 августа
Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет
так в ближайшие 7 дней ждем Sugarloaf
-
qz5 получил реакцию от Tumaso в Как можно обновиться в Google Play после 1 августа
Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет
так в ближайшие 7 дней ждем Sugarloaf
-
qz5 получил реакцию от Ingalime в Как можно обновиться в Google Play после 1 августа
Короче уточнил: бета-версия 10.3.3 будет называться Sugarloaf, она выйдет до конца этого месяца, там будет 64-битный компилятор под Андроид, но так и не понял по поводу - дадут ли "коммунякам" или нет
так в ближайшие 7 дней ждем Sugarloaf
-
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; сделать, но для наглядности я сделал именно так.
-
qz5 получил реакцию от Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?
Понятно, я пробовал вроде похожий метод взятый отсюда: https://stackoverflow.com/questions/37830470/firedac-freezes-gui
всё равно не удовлетворило
-
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;
-
qz5 отреагировална Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?
я тоже не разобрался.. т.к. у меня в дизайнере создана custom item, все в Live Binding настроено.. поэтому ( для моего случая подходит - т.к. данных немного , не боле 100).. создал два одинаковых DataSet - один это результат запроса, никуда не приделан, второй ( полученный копированием в дизайнере первого) - прибайденный. Открываю запрос - заполняется первый датасет ( это в потоке без синхронайза, т.к. на экран ничего не выводится), на экране нет еще данных. Копирую из 1го во второй - и данные на экране появляются( это уже в синхронайзе). Это позволило развязать получение данных с сервера и отображение их на экране. Понятно, что данных в два раза больше, но для меня не критично.
-
qz5 получил реакцию от Сергей Сергеев в Как можно обновиться в Google Play после 1 августа
и вначале дадут Бету тем у кого есть действующая подписка
"later this month" - переводится как "позже в этом месяце" или "после этого месяца"?
Насколько я понимаю, всё-таки "позже в этом месяце"
остался только непонятным вопрос - для "коммуняк" дадут бету или ждать релиза
-
qz5 получил реакцию от Ingalime в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?
У меня используется только один FDConnection и один FDQuery. В FDQuery идет Select запрос из базы, а от FDQuery уже байндится на ListView
вот если так оставить, то при запросе - всё тормозится на несколько секунд и может выводиться сообщение, что "приложение не отвечает"
а если убрать байндинг - всё быстро
пока сделал так: байндинг убрал, а вместо него в цикле обрабатывают результаты запроса и добавляю ListItem, причем после каждого добавления выполняю application.processmessages
-
qz5 отреагировална Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?
вот нашел свой пример, который года три назад тоже подсмотрел гдето..
-
qz5 отреагировална Сергей Сергеев в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?
Synchronize - синхронизирует с основным потоком, я делал так - получал данные в потоке, без синхронизации, перегружал в видимы контролы в потоке с синхронизацией, а основной поток в это время крутил индикатор..
-
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) -->
-
qz5 получил реакцию от Ingalime в Андроид 9 и Интернет
нет, я только манифест менял
но возможно Вы манифест меняли обычным блокнотом например, его нао править только программами, которые не добавляют ВОМ
например с помощью Notepad++
-