Перейти к содержанию
  • Регистрация

Лидеры


Популярный контент

Показан контент с высокой репутацией за 21.06.2019 во всех областях

  1. 5 баллов
    Пока тестировал хелпер в боевом проекте он потихоньку оброс исрпавлениями/улучшениями: Загрузка из потока сделана через TBitmapSurface - это позволяет избежать множества глюков. LoadFromStream вынесен из Synchronize (основного потока) в поток HTTPClient - по результатам бенчмарка операция оказалась самая жручая. После исправления интерфейс перестал залипать совсем. Добавлен overload вариант с передачей в процедуру TListItemImage - для использования в TListView и корректной перерисовки подгруженных картинок через AListItemImage.Invalidate. unit BitmapAsyncLoader; interface uses FMX.Graphics, FMX.Surfaces, System.Net.HttpClient, System.Types, System.Classes, FMX.ListView.Types, FMX.ListView.Appearances; type TBitmapAsyncLoader = class helper for TBitmap procedure LoadFromURLAsync(const AUrl : String); overload; procedure LoadFromURLAsync(const AUrl : String; const AListItemImage : TListItemImage); overload; end; implementation var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then TThread.Synchronize(Nil, procedure begin if Assigned(Self)then Assign(ABitmapSurface); ABitmapSurface.Free; end ) else ABitmapSurface.Free; end; end, AURL ); except end; end; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String; const AListItemImage : TListItemImage); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; ABitmapSurface : TBitmapSurface; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then begin ABitmapSurface:=TBitmapSurface.Create; if TBitmapCodecManager.LoadFromStream(AHTTPResponse.ContentStream, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) then TThread.Synchronize(Nil, procedure begin if Assigned(Self) and Assigned(AListItemImage) then begin AListItemImage.BeginUpdate; Assign(ABitmapSurface); AListItemImage.Invalidate; AListItemImage.EndUpdate; end; ABitmapSurface.Free; end ) else ABitmapSurface.Free; end; end, AURL ); except end; end; initialization AHTTPClient:=THTTPClient.Create; finalization if Assigned(AHTTPClient) then AHTTPClient.DisposeOf; end. Тестовый проект, на этот раз с ListView (по кнопке добавляется 100 итемов) прилагаю. BitmapAsyncLoaderListView.7z
  2. 5 баллов
    Веб.бинар показал, что проделано огромная работа. Очень понравилось.
  3. 5 баллов
    В общем удалось решить проблему с кнопками пульта. Теперь приложение распознает все кнопки с пульта. Если кому-то нужно, прикрепил архив. (Delphi 10.3.1 Rio) fmx_androidkey_fix.zip
  4. 4 балла
  5. 4 балла
    Одной из распространенных проблем, с которыми сталкивается разработчик в ходе разработки мобильных приложений, является построение UI. На вебинаре мы рассмотрим реализацию некоторых типовых шаблонов мобильных приложений в контексте библиотеки FGX Native, сравним подходы, используемые для реализации одинакового функционала в FMX и FGX, а также познакомимся с уникальными ключевыми особенностями FGX Native, которые раскрывают все достоинства нативной разработки. В вебинаре принимает участие создатель FGX – Ярослав Бровин. Дата: 11 июля 2019 12:00 МСК. Ссылка на регистрацию: http://forms.embarcadero.com/FGXNative
  6. 4 балла
    mazayhin

    Как узнать Device Name на Андроиде?

    Это будет имя Bluetooth-адаптера. //uses System.Bluetooth; TBluetoothManager.Current.CurrentAdapter.AdapterName
  7. 3 балла
    qz5

    Версия андроид

    Я разбавлю своим вариантом: Leagoo Power 2. У него цена около 3000 рублей, из коробки идет Андроид 8.1, но можно поставить Андроид 9 и даже... Android 10!!! С одной стороны у меня среди родственников есть смарты от 4ой до 9-ой версии Андроид, да и моя прога сейчас на всех работает (пока она простая). Но с другой стороны решил поискать дешевый смарт, на который можно несколько разных версий Андроид поставить, но: 1. чтобы это было легко, без всяких разблокировок и т.п. (у новых Xiaomi, Huawei как раз проблемы с заблокированным загрузчиком) 2. чтобы был максимально дешевый 3. чтобы можно было поставить Андроид 8.1 и Андроид 9, причем разные сборки 4. чтобы не надо было ставить всякие Flash Tools и т.п. - искал, чтобы прошивка была простой и максимально без лишних программ Оказалось, что Leagoo Power 2 Pro: 1. Поддерживает GSI-прошивки от Project Treble (Андроид 8.1, Андроид 9 и Android 10) 2. стоит около 3000 рублей 3. Для прошивки не нужно никаких лишних программ! Достаточно ADB, а он и так уже идет вместе с Delphi (можно и самому ADB ставить на комп, если Delphi нет например) Взял на будущее, чтобы было дешевое устройство, на котором можно экспериментировать с прошивками Правда сам пока не пробовал - телефон получил, всё работает, но пока закинул его в коробочку, тестирую на смартфоне с Андроид 7 (он всё равно постоянно на столе и там нужные мне программы). Как прошить ТВРП: https://4pda.ru/forum/index.php?showtopic=928803&st=120#entry81458052 Другие версии Андроид брать здесь: https://4pda.ru/forum/index.php?showtopic=892755 Где купить: решайте сами, многие покупают на Пандао, но я почитал отзывы - Пандао какой-то странный магазин, ничего там не покупал и не стал из-за 200 рублей рисковать. Я взял там, где советует официальный производитель: https://vk.com/wall-148943419_19677 Доставила почта Сингапура за 20 дней. p.s. я кучу разных вариантов пересмотрел и остановился именно на нем. Самая легкая перепрошивка из всех, недорогой смарт, есть запчасти, возможность ставить разные кастомы. может кому пригодится
  8. 3 балла
    На вопросы Ярослав отвечал почти час, и судя по количеству и качеству вопросов, я бы не назвал это "междусобойчиком". Вы вроде разработчик, а не абстрактная домохозяйка в вакууме, я не думаю что зарегистрироваться - было для вас большим вызовом. Плюс, формат проведения мероприятия подразумевает именно серьезный вебинар, а не какой-либо стримчик на ютубчике или упаси хосспаде твичике. PS вебинар понравился, библиотека заочно также понравилась. Как только будут доступны обе мобильные платформы - буду склонять руководство к покупке библиотеки.
  9. 3 балла
    Barbanel

    Аналог TDBGrid для FMX

    Вы случайно не в Эппл работаете? "Если у нас чего-либо нет - значит пользователям это не нужно" (С) Шучу-шучу))) Разумеется я отдаю себе отчет о накладных расходах, и о траффике. Миллион записей мы и за год не сгенерируем, а больше пары тысяч отображать и не требуется, а если и потребуется то был бы инструмент - проблема решится. Вопрос был лишь в том, есть ли такой аналог как DBGrid. Пытаюсь написать нечто похожее через хелпер к TGridModel, пока получается. Когда меня все будет устраивать - выложу в общий доступ.
  10. 3 балла
    Yuriy2606

    Приложение вылетает на Android 9

    Решение: Do any of the following: 1- Update the play-services-maps library to the latest version: com.google.android.gms:play-services-maps:16.1.0 2- Or include the following declaration within the <application> element of AndroidManifest.xml. <uses-library android:name="org.apache.http.legacy" android:required="false" /> Закинул сюда, может кому-то пригодится. Ссылки: https://stackoverflow.com/questions/50461881/java-lang-noclassdeffounderrorfailed-resolution-of-lorg-apache-http-protocolve https://www.delphiworlds.com/2019/02/a-fix-for-using-tmapview-on-android-9-devices/
  11. 3 балла
    Нашел еще более изящный способ, без исчезновения/показа клавиатуры: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.SelectAll; Memo1.DeleteSelection; end;
  12. 3 балла
    Vitaldj

    Версия андроид

    Поосторожнее на поворотах. Тут спросили, Евгений ответил. Причём тут реклама?
  13. 2 балла
    Для одного своего проекта сделал, поделюсь, вдруг кому пригодится. Тестировал под Windows и Android. Для использования просто добавьте BitmapAsyncLoader в uses, а дальше все просто: ImageControl.Bitmap.LoadFromURLAsync('https://bipbap.ru/wp-content/uploads/2017/10/0_8eb56_842bba74_XL-640x400.jpg'); Код юнита хелпера: unit BitmapAsyncLoader; interface uses FMX.Graphics, System.Net.HttpClient, System.Types, System.Classes; type TBitmapAsyncLoader = class helper for TBitmap procedure LoadFromUrlAsync(const AUrl : String); end; implementation var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then TThread.Synchronize(Nil, procedure begin try Self.LoadFromStream(AHTTPResponse.ContentStream); except end; end ); end, AURL ); except end; end; initialization AHTTPClient:=THTTPClient.Create; finalization if Assigned(AHTTPClient) then begin AHTTPClient.DisposeOf; end; end. Архив с тестовым проектом прилагаю. BitmapAsyncLoader.7z
  14. 2 балла
    Не зря я высылаю Ярославу витамины!
  15. 2 балла
    Tumaso

    Библиотека компонентов Alcinoe для Delphi

    @aleksandrguru сами то использовали alcinoe? я пробовал использовать. главные минусы - автор библиотеки не утруждает себя ответами на возникающие вопросы, многие вещи буферизации изображения и обновления этого буфера работают непонятно как. версию для Rio я не пробовал, честно говоря уже нет желания дальше чтото делать на этой библиотеке, но вот в Tokyo при добавлении TMapView работа alcinoe ломается, изображения на экране обновляется по непонятным правилам (не спасает например прямой вызов перестроения буфера). В TALImage невозможно вручную занести изображения, только либо из файла, либо из ресурса. И так далее.
  16. 2 балла
    Евгений Корепов

    Подключение Admob к iOS

    Я еще тупее чем думал. После нажатия "Update Local File Cache" все фреймворки подсосались сами с Mac mini ))))))))))))))
  17. 2 балла
    Alex7wrt

    Подключение Admob к iOS

    Получилось, но только с подключением дополнительных фреймворков. Использовал JVEsuite.
  18. 2 балла
    Barbanel

    Настройка Android SDK

    Хех, будет весело Android NDK (native development kit) – это набор инструментов, которые позволяют реализовать часть вашего приложения используя такие языки как С/С++. Для того чтобы среда могла использовать эти утилиты при необходимости. Чуть больше про NDK можно прочитать здесь. Каждый АПИ-левел содержит новые возможности или исправления, отсутствующие в предыдущем АПИ. Какой именно АПИ нужен вам - можете решать сами. Различают минимальный АПИ (грубо говоря, это минимальная версия Андроида на котором программа может запуститься, но не обязательно будет работать в полном объеме) и целевой АПИ (версия Андроида, для которой собсно программа и предназначена). Как правило раньше хватало минимального АПИ 14, а целевой - 22 (если ине не изменяет память, не ручаюсь что цифры точные). Сейчас эти цифры изменились, минимальный если я не ошибаюсь 22 или 24, целевой - от 26 и выше. Связано это с тем, что Гугл закручивает гайки в плане безопасности (или просто загручивает гайки, потому что тупо может), и объявляет старые версии устаревшими и неподдерживаемыми. Может да, а может и нет. Смотря какие фичи из сдк используются. Но вообще, чаще всего да, могут. Добро пожаловать в новый чудный мир! )))))) На самом деле все работает, просто вы кое-что не сделали. Указывать разрешения в настройках проекта более недостаточно. Нужно, да, но теперь этого мало. Нужно запрашивать эти разрешения у пользователя в процессе работы программы, динамически. Более того, программа должна корректно отработать, даже если пользователь не выдал вам эти разрешения. Т.е. если вы хотите доступ к камере чтобы сфоткать что-то, вы спрашиваете пользователя, что программе нужна камера. Пользователь может и отказать, вы проверяете его ответ и в случае отказа делаете вид что вам не нужна камера, а не крашитесь как раньше))) Точно так же с другими разрешениями. Если программе в принципе необходимо разрешение, и без него она теряет свой смысл - то сообщать об этом пользователю. Тем с запросом разрешений на этом форуме - завались, есть даже примеры в самой Студии. Это на самом деле несложно.
  19. 2 балла
    Евгений Корепов

    Версия андроид

    К сожалению нисколько. Тут просто здравый смысл - вы приобретаете телефон хорошего качества, с нормальной гарантией и сервисом. Программа Android One гарантирует вам обновления (ежемесячные обновления и обновления OS) - это значит что устройство сможет помогать вам в разработке не один год. В последствии вы сможете продать устройство за приемлемые деньги, а не за 300 рублей (как раз по такой цене я распродал мусор Dexp купленный изначально, 4 года назад, по неопытности). Вот и все аргументы, никакого скрытого умысла. P.S. Добавлю - один из телефонов Dexp взорвался у меня прямо на столе. Чудом не сгорел рабочий кабинет, но часть рабочих бумаг погорело, слава богу все само потухло. Меня на месте в этот момент не было, телефон был подключен к компу - до этого занимался отладкой одного из приложений. Телефон превратился в оплавленный комок пластмассы. ))
  20. 1 балл
    sinuke

    переход к x64?

    Проверил в маркете статистику по одному своему приложению... В общем десятью процентами и не пахнет (22,6%)
  21. 1 балл
    sinuke

    переход к x64?

    Да вообще не лучше - дома все устройства с 9-м андройдом. Так что лично я вообще не знаю что делать
  22. 1 балл
    qz5

    переход к x64?

    не советовал бы такое делать за это Гугл может не только приложение забанить, но и полностью Вас как разработчика так что даже если новый аккаунт создадите - на него тоже бан прилетит Гугла не любит когда их так обманывают, в подобных случаях порой создают робота, который обходит и всем таким приложениям бан дает так что это рискованно, лучше пока через MaxSDK
  23. 1 балл
    qz5

    переход к x64?

    Вышла версия 10.3.2 - https://community.idera.com/developer-tools/b/blog/posts/announcing-the-release-of-delphi-c-builder-and-rad-studio-10-3-2 Добавили поддержку macOS 64 бит, нотификации и поддержка Линукса новые теперь тоже из коробки поддерживаются но вот Андроид 64 - всё еще нет
  24. 1 балл
    qz5

    переход к x64?

    Нет, не игра, приложение. Просто на Java писать не охота, но желательно кроссплатформенно, чтобы потом на iOS тоже портировать. Лазарус - там Паскаль, его знаю. Unity - там C# и смогу разобраться. Код на Яве на Яблоко не перенесешь. Смотрел еще всякие Kotlin, React Native, но мне больше всего подходит именно Delphi Community Edition.
  25. 1 балл
    mazayhin

    Как узнать Device Name на Андроиде?

    Человек хочет получить то имя, которое на скрине идет первой строкой, на сколько я понял
  26. 1 балл
    qz5

    THTTPClient

    Подробности на английском языке: https://medium.com/@imstudio/android-8-cleartext-http-traffic-not-permitted-73c1c9e3b803 https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6 но достаточно, что я выше написал
  27. 1 балл
    qz5

    THTTPClient

    Сделайте как здесь написано http://fire-monkey.ru/topic/5631-не-открываются-страницы-на-android-9/#comment-36008
  28. 1 балл
    qz5

    Приложение не работает на Spreadtrum SC9863A

    Попробуй спросить на этом форуме, там есть владельцы смартфоном с таким процессором: https://4pda.ru/forum/index.php?showtopic=946744 https://4pda.ru/forum/index.php?showtopic=952959 https://4pda.ru/forum/index.php?showtopic=957113 Я нашел такие телефоны с этим процессором. Попроси владельцев этих смартов установить твою и любую другую программу написанную на Firemonkey. https://play.google.com/store/apps/details?id=kz.rzaripov.PushTest Обязательно напиши результат (работает ли твоя прога и чужие на их девайсах). Если не работает - нам всем это надо знать. Особенно напиши в теме Doogee N10 - там много людей, проще контакт найти.
  29. 1 балл
    Barbanel

    ip адрес устройства Delphi fmx android

    Не скажу как это сделать через Indy, но через системные обертки это можно. Обратите внимание на метод JWifiInfo.getIpAddress Надеюсь вам поможет. NetworkState.zip
  30. 1 балл
    Эти два высказывания, вместе взятые, звучат зловеще
  31. 1 балл
    Vitaldj

    Версия андроид

    Вы само то поняли, что написали? Какой вопрос, такой ответ. Во всех отмеченных выше постах, так же указания на кучу торговых марок. Евгений предпочитает ксаоми. Я тоже не вижу в этом проблем. У жены ксаоми, прекрасно идут все приложения, включая приложения написанные на FGX. Не нравиться ксаоми, выбираете из тех, что предложили другие. Так, что поосторожнее с формулировками. Следите за словами.
  32. 1 балл
    Barbanel

    Data grid на android

    Посмотрел TListView. Все еще проще. Идите в инспекторе в свойство ItemAppearance и там можно настроить высоту хедера и футера. Вот вам скриншот (Ааааа в данном случае - хедер):
  33. 1 балл
    mazayhin

    Как узнать Device Name на Андроиде?

    Ну видимо, не для всех это очевидно. Ну и да, называется оно "имя", а про БТ не слова )
  34. 1 балл
    Спасибо! Посмотрел diff - как и предполагал, Эмбаркадера поленилась скопипастить все коды, видимо в буфер обмена у них влезла только часть Ну как так то? Спасибо вам за проделанную работу!
  35. 1 балл
    Если будите использовать Mapview то нужно добавить в манифест <uses-library android:name="org.apache.http.legacy" android:required="false" />
  36. 1 балл
    Больно сложная регистрация , нельзя просто стрим сделать на ютубе )
  37. 1 балл
    Шамсуддин

    Как убить кнопку кликнув на нее саму

    Перепроверил 3 раза на андроид. Первый раз без Sleep: TTask.Run(procedure begin TThread.Synchronize(nil, procedure begin FBackgroundLayout.Free; //FBackgroundLayout - родительский элемент end); end); Получил Access violation сразу при нажатии на кнопку. Второй раз так: TTask.Run(procedure begin Sleep(100); TThread.Synchronize(nil, procedure begin FBackgroundLayout.Free; end); end); При первом нажатии исключений нет, но FBackgroundLayout не удаляется(визуально) и соответственно на кнопку можно нажать ещё раз после чего сразу получаем AV, оно и понятно. Третий раз, уже основываясь на ваших сообщениях, о том, что нужно везде удалять ссылки, сделал так: TTask.Run(procedure begin Sleep(100); TThread.Synchronize(nil, procedure begin FBackgroundLayout.Parent.RemoveObject(FBackgroundLayout); FBackgroundLayout.Free; FBackgroundLayout:= nil; end); end); И теперь все работает. В моём случае, необходимости удаления подобным образом не было, поскольку ссылки на тот объект я в своём коде не хранил, а потому способ с DisposeOf работал. Но думаю, третий вариант использовать всё же лучше. UPD. Сделал четвертую проверку, перечитав ваше сообщение ещё раз) . Убрал поток: FBackgroundLayout.Parent.RemoveObject(FBackgroundLayout); FBackgroundLayout.Free; FBackgroundLayout:= nil; //Ну или FreeAndNil(FBackgroundLayout) И оно заработало! И без каких-либо ошибок. UPD 2. Теперь точно всё) Я вспомнил зачем создавал поток и ставил Sleep. Дело в том, что в Windows приложении, если при нажатии на кнопку удалить его сразу, то не будет сообщения о том, что произошло "MouseUp" кнопки, в связи с чем, рамки приложения (т.е. кнопки сворачивание, закрыть и т.д.) не реагируют на нажатия мыши до того, пока не нажмете на "нажимаемый" элемент в самом приложении. И потому 4 вариант не подходит для Windows приложений.
  38. 1 балл
    krapotkin

    Как убить кнопку кликнув на нее саму

    Если правильно все было сделано, то арк работает ровно так же как и ранее. Создал объект - удали ссылки на него и сделай free. Ровно как и всегда
  39. 1 балл
    Решение найдено - после добавления TLabel в панель нужно вызывать TLabel.RecalcSize.
  40. 1 балл
  41. 1 балл
    Добрый вечер, Бета тест начнется на следующей неделе. День еще не знаю точно, но точно начнется. Соответственно, всем отобранным я отправлю индивидуально приглашение. Одновременно будет опубликована новость о начале бета теста. Те кто не попадет в первую волну, могут попасть в следующую.
  42. 1 балл
    Tumaso

    TIDTCPClient, TIDTCPServer

    Чтобы приложение оставалось активным в фоновом режиме (я про андроид), приложение должно отображать постоянное уведомление. Сам такое уведомление еще не реализовывал, поэтому технической реализации не подскажу (пока по крайней мере)
  43. 1 балл
    Barbanel

    Версия андроид

    OMG!!! Я на днях обнаружил что наш Huawei P7 Lite, которому уже почти два года (и все эти два года он бездумно лежал на зарядке, от компа) ощутимо вздулся. Mea culpa. Другие ихние модели - норм (правда они чуть помоложе). Отключил от зарядки, на всякий)))
  44. 1 балл
    Martifan

    как очистить память клавиатуры

    Спасибо большое добрый человек действительно работает
  45. 1 балл
    Евгений Корепов

    как очистить память клавиатуры

    Ага, теперь нормально воспроизводится. Самый простой способ избежать этого, вот такой: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text:=EmptyStr; Memo1.ResetFocus; Memo1.SetFocus; end; Правда будет видно что виртуальная клавиатура исчезает, а затем опять появляется.
  46. 1 балл
    krapotkin

    Фреймворк для стандартного ListView

    Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые.... Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд Крутится плавно... ListViewTest.apk.rar
  47. 1 балл
    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) пока нет колонок и других особых изысков. На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже ListViewFramework.7z
  48. 1 балл
    krapotkin

    Размеры TPanel

    во время FormCreate еще не определены размеры лучше в OnShow, или OnResize
  49. 1 балл
    ENERGY

    Неверная ширина текста из .Canvas.TextWidth

    Оттого, что ширина текста определяется для шрифта и размера указанного в Canvas, а не для шрифта из компонента. Например, в TLabel.TextSettings.Font и в его TLabel.Canvas.Font размер шрифта будет разный (в Canvas он дефолтный - 12). В FMX компонентах Canvas, кстати, общий и один и тот же - это Canvas формы. Если в OnResize чего-либо, сделать так: Label.Canvas.Font.Size := Label.Font.Size; или Label.Canvas.Font.Assign(Label.Font); (чуть дольше) lRealWidth := Label.Canvas.TextWidth(Label.Text); То размер будет корректный.
  50. 1 балл
    Andrew

    Расчет высоты объекта на основе высоты TLabel

    При работе с Listbox мне приходится использовать RecalcSize. Вообще, для лучшего понимания проблемы вы лучше нарисуйте что хотели бы видеть и что реально получаете.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...