![](https://fire-monkey.ru/uploads/set_resources_12/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
krapotkin
Пользователи-
Постов
2 187 -
Зарегистрирован
-
Посещение
-
Победитель дней
209
Весь контент krapotkin
-
если вы сами решаетесь печатать, вам нужно самостоятельно производить все расчеты. для этого нужно ознакомиться с документацией http://docwiki.embarcadero.com/RADStudio/Rio/en/Printing_from_a_FireMonkey_Application далее используем Printer.PageWidth и PageHeight вы знаете размер бумаги в мм и знаете размер страницы в точках далее идет тема Пропорции, 4-й класс, чтобы разместить то что вам нужно в правильное место хоть в точках, хоть в мм
-
f:=TForm1.Create(NIL); form1.Show; вы создали объект и ссылку на него положили в переменную F а теперь объекту из другой переменной form1 пытаетесь вызвать метод Show переменная form1 пустая поэтому AV и все равно из потока работать с формами нельзя TTask.Create(procedure () begin sleep(2000); data2:='data2'; tthread.synchronize(nil, procedure begin f:=TForm1.Create(NIL); f.Show; end) end)
-
не нужно делать долгоиграющие потоки пусть у вас есть модель данных. та система объектов, которую вы описали. Она существует вне потоков. И главный поток с ней взаимодействует заполняя и отражая UI если нужно что-то загрузить, запускается поток, скачивается что-то, и с синхронизацией данные обновляются, и дергается UI который по этим данным обновляется тоже нет никакого смысла все время крутить потоки.
-
я ответил) распространяю : 1. работа с формами из потока, в т.ч. создание - только через синхронизацию 2. переменной все равно кто ее создал. она потоку не принадлежит, даже поле TThread - тоже. Например вы можете обращаться к полям одного потока из других на чтение. И если предохраняться, то и на запись 3. КЛасс =class(TThread) это не поток. это просто класс, один из методов которого (Execute) при правильном запуске (Start) будет выполняться в другом потоке ОС. А можно просто взять и вызвать th.Execute. И этот метод выполнится в том потоке откуда и вызван. Так что это просто класс...
-
да. хотя идея создавать форму из потока так себе идея. я стараюсь просто потоку с собой сунуть ссылку на прогресс-бар, фрейм или форму. и уж точно не делать это глобальной переменной !
-
по вопросам. 1) выбор на хостингах невелик - MySQL, Postgres. Я PG выбрал чисто в силу интереса и он вроде поближе к стандартам, и у него ХП и другие всякие штуки.... Сижу на SWEB.RU. Опять же просто потому что давно. Есть и masterhost и любой другой крупный провайдер подойдет. 2) не путаем хостинг с бэкенд-сервером (BAS). Типа Firebase или Amazon или еще туча. на хостинге у вас все свое. что написали то и работает. на BAS есть много приятных плюшек. Довольно платных ессно. Зато и push и email рассылки и админка... 3) MSSQL не вариант. Веб в основном на Linux. 4) обычно просто THttpClient. На нем нормально пишется клиентская часть API 5) обычная схема. просто с нуля некоторые вещи пилить. зато бесплатно. Практика показывает что иногда лучше заплатить и получить богатое приложение сразу. но иногда как написал Евгений, потом можно упереться в ограничения сервисов. Но можно решать проблемы по мере поступления...
-
сколько угодно. только логика будет ох непростой, кто кому когда отвечает ))
-
золотые слова! )
-
научили конечно ))) все придумано до нас вот статья вот так в грубом приближении должно это быть p.s. Забыл удалить из ваших форм эти циклы, которых там быть не должно Форма - это интерфейс взаимодействия с пользователем. Данные должны жить отдельно. test10.3.zip
-
сколько бед принесла уже стрельба в ногу под названием ProcessMessages как хорошо, что в Андроиде наконец всех отучат от этого крайне вредного трюка давайте формально все что там у вас "высоконагруженное" выносите в потоки и пусть они работают. Ваши "потоки" пасутся в главном (Synchronize) и никакого толка нет концепцию надо поменять. запустили поток и занимайтесь своим делом. например покажите Splash а вернется поток - вот по возвращению и сделаете то, что этот Splash закроет. и уж точно потоки не должны ничего общего иметь с формами я писал статью про потоки, там про сплеши тоже есть в блоге и про ProcessMessages отдельная боль... http://www.cyberforum.ru/blogs/469693/blog4875.html
-
origin насколько я помню это точка изображения, которая встанет на указанную координату если у вас стрелочка нарисована, вы же хотите, чтобы конец стрелки указывал на нужную точку, а не пустая точка (0,0) вашей картинки
-
маркерами управляете только вы сами поэтому не выбрасывайте ссылки на созданные маркеры, а самостоятельно добавляйте удаляйте их при смене масштаба карты
-
Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые.... Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд Крутится плавно... ListViewTest.apk.rar
-
В демке картинки под виндой есть под Андроид надо искать, куда делись Lazy loading реализовывать оно отдельно надо. Id вписать в итем легко. Дальше наворачивать буду. Сразу все не взлетает
-
Спасибо всем кто откликнулся! Прочистил все)) производительность вернулась в норму. Счетчики в верхней панели Прокрутка гладкая. в примере 8 итемов раскопированы 200 раз. Средняя затрата времени на один Item - 0.2 мсек ListViewTest3.7z
-
Спасибо за фидбек! Имхо, пока изменение размеров не очень актуально. В целом под windows редко форма меняет размеры. Я ориентировался больше на мобильную платформу. А вот второе замечание немного напрягло. Попробую подержать OFF: Ухты! RYZEN 5
-
вторая версия демо -работа над ошибками -устранил утечки памяти -расширил функционал -добавил картинки -совместимость с Android Приложил EXE и APK Скорее всего, для 100500 записей не потянет, т.к. слишком много арифметики для раскладки каждого элемента на каждом итеме, но для сотни - хватает. ListViewTest2.7z pasFiles.rar
-
ага тоже столкнулся. не профилировал пока, но в целом логично, он там выражения парсит непрерывно, размеры-то динамические, зависят от каждой строки данных надо попробовать установить жесткие, посмотреть, как изменится нагрузка
-
Всем привет! После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный 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. ссылки на репозитории ниже
-
менюшку нет никакого смысла делать на ListView несколько итемов ListBox отлично справится и раскладки можно любые раскладывать
-
я делал апи которое создавало каждый раз все заново и тоже именно из-за подозрений на качество кода, мало ли что там накопится ))) производительности вполне хватало
-
проверялось? или гипотеза?