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

krapotkin

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

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

  • Посещение

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

    209

Весь контент krapotkin

  1. если вы сами решаетесь печатать, вам нужно самостоятельно производить все расчеты. для этого нужно ознакомиться с документацией http://docwiki.embarcadero.com/RADStudio/Rio/en/Printing_from_a_FireMonkey_Application далее используем Printer.PageWidth и PageHeight вы знаете размер бумаги в мм и знаете размер страницы в точках далее идет тема Пропорции, 4-й класс, чтобы разместить то что вам нужно в правильное место хоть в точках, хоть в мм
  2. 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)
  3. не нужно делать долгоиграющие потоки пусть у вас есть модель данных. та система объектов, которую вы описали. Она существует вне потоков. И главный поток с ней взаимодействует заполняя и отражая UI если нужно что-то загрузить, запускается поток, скачивается что-то, и с синхронизацией данные обновляются, и дергается UI который по этим данным обновляется тоже нет никакого смысла все время крутить потоки.
  4. я ответил) распространяю : 1. работа с формами из потока, в т.ч. создание - только через синхронизацию 2. переменной все равно кто ее создал. она потоку не принадлежит, даже поле TThread - тоже. Например вы можете обращаться к полям одного потока из других на чтение. И если предохраняться, то и на запись 3. КЛасс =class(TThread) это не поток. это просто класс, один из методов которого (Execute) при правильном запуске (Start) будет выполняться в другом потоке ОС. А можно просто взять и вызвать th.Execute. И этот метод выполнится в том потоке откуда и вызван. Так что это просто класс...
  5. да. хотя идея создавать форму из потока так себе идея. я стараюсь просто потоку с собой сунуть ссылку на прогресс-бар, фрейм или форму. и уж точно не делать это глобальной переменной !
  6. по вопросам. 1) выбор на хостингах невелик - MySQL, Postgres. Я PG выбрал чисто в силу интереса и он вроде поближе к стандартам, и у него ХП и другие всякие штуки.... Сижу на SWEB.RU. Опять же просто потому что давно. Есть и masterhost и любой другой крупный провайдер подойдет. 2) не путаем хостинг с бэкенд-сервером (BAS). Типа Firebase или Amazon или еще туча. на хостинге у вас все свое. что написали то и работает. на BAS есть много приятных плюшек. Довольно платных ессно. Зато и push и email рассылки и админка... 3) MSSQL не вариант. Веб в основном на Linux. 4) обычно просто THttpClient. На нем нормально пишется клиентская часть API 5) обычная схема. просто с нуля некоторые вещи пилить. зато бесплатно. Практика показывает что иногда лучше заплатить и получить богатое приложение сразу. но иногда как написал Евгений, потом можно упереться в ограничения сервисов. Но можно решать проблемы по мере поступления...
  7. не обольщайтесь у OSM бесплатные только данные!!! сервера для прода использовать запрещено! нужно либо поднимать свои, либо покупать доступ от $10 / мес
  8. сколько угодно. только логика будет ох непростой, кто кому когда отвечает ))
  9. научили конечно ))) все придумано до нас вот статья вот так в грубом приближении должно это быть p.s. Забыл удалить из ваших форм эти циклы, которых там быть не должно Форма - это интерфейс взаимодействия с пользователем. Данные должны жить отдельно. test10.3.zip
  10. сколько бед принесла уже стрельба в ногу под названием ProcessMessages как хорошо, что в Андроиде наконец всех отучат от этого крайне вредного трюка давайте формально все что там у вас "высоконагруженное" выносите в потоки и пусть они работают. Ваши "потоки" пасутся в главном (Synchronize) и никакого толка нет концепцию надо поменять. запустили поток и занимайтесь своим делом. например покажите Splash а вернется поток - вот по возвращению и сделаете то, что этот Splash закроет. и уж точно потоки не должны ничего общего иметь с формами я писал статью про потоки, там про сплеши тоже есть в блоге и про ProcessMessages отдельная боль... http://www.cyberforum.ru/blogs/469693/blog4875.html
  11. origin насколько я помню это точка изображения, которая встанет на указанную координату если у вас стрелочка нарисована, вы же хотите, чтобы конец стрелки указывал на нужную точку, а не пустая точка (0,0) вашей картинки
  12. маркерами управляете только вы сами поэтому не выбрасывайте ссылки на созданные маркеры, а самостоятельно добавляйте удаляйте их при смене масштаба карты
  13. Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые.... Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд Крутится плавно... ListViewTest.apk.rar
  14. В демке картинки под виндой есть под Андроид надо искать, куда делись Lazy loading реализовывать оно отдельно надо. Id вписать в итем легко. Дальше наворачивать буду. Сразу все не взлетает
  15. Спасибо всем кто откликнулся! Прочистил все)) производительность вернулась в норму. Счетчики в верхней панели Прокрутка гладкая. в примере 8 итемов раскопированы 200 раз. Средняя затрата времени на один Item - 0.2 мсек ListViewTest3.7z
  16. Спасибо за фидбек! Имхо, пока изменение размеров не очень актуально. В целом под windows редко форма меняет размеры. Я ориентировался больше на мобильную платформу. А вот второе замечание немного напрягло. Попробую подержать OFF: Ухты! RYZEN 5
  17. вторая версия демо -работа над ошибками -устранил утечки памяти -расширил функционал -добавил картинки -совместимость с Android Приложил EXE и APK Скорее всего, для 100500 записей не потянет, т.к. слишком много арифметики для раскладки каждого элемента на каждом итеме, но для сотни - хватает. ListViewTest2.7z pasFiles.rar
  18. ага тоже столкнулся. не профилировал пока, но в целом логично, он там выражения парсит непрерывно, размеры-то динамические, зависят от каждой строки данных надо попробовать установить жесткие, посмотреть, как изменится нагрузка
  19. Всем привет! После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный 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. ссылки на репозитории ниже
  20. менюшку нет никакого смысла делать на ListView несколько итемов ListBox отлично справится и раскладки можно любые раскладывать
  21. http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.Ani.TAnimation.OnFinish
  22. думаю, речь идет о том, что в конце анимации, она дергает событие - "я всё". "заморозку" программы до наступления этого события нужно сделать самостоятельно я правильно понял?
  23. я делал апи которое создавало каждый раз все заново и тоже именно из-за подозрений на качество кода, мало ли что там накопится ))) производительности вполне хватало
  24. проверялось? или гипотеза?
×
×
  • Создать...