krapotkin
-
Постов
2 185 -
Зарегистрирован
-
Посещение
-
Победитель дней
209
Активность репутации
-
krapotkin получил реакцию от Barbanel в Фреймворк для стандартного ListView
Обновил репозиторий.
Добавил метод AfterLayout для условного форматирования элементов после раскладки по итему LV
https://bitbucket.org/vkrapotkin/vklistview/src/master/
-
krapotkin получил реакцию от Ingalime в Автомасштабирование компонент
погуглить слово Align
поиграться с Margins и Paddings
прочитать статью
http://docwiki.embarcadero.com/RADStudio/Rio/en/FireMonkey_Layouts_Strategies
http://docwiki.embarcadero.com/RADStudio/Rio/en/Tutorial:_Using_FireMonkey_Layouts
-
krapotkin получил реакцию от Ingalime в [ListView] получить список элементов у которых Checkmark=true
Все что есть на экране - это отображение чего-то в памяти. например (я в С не очень, но по смыслу поймете)
var ListAll, ListSelected: TObjectList<TFoodMenuItem>; ListAll := TObjectList<TFoodMenuItem>.Create(True); // все меню ListSelected := TObjectList<TFoodMenuItem>.Create(False); // отобранные в заказ пункты //в OnClick нам дается Item. по индексу этого item мы берем объект из ListAll и заносим в ListSelected; listSelected.add( ListAll[index] ); этот пример корявый и не учитывает количества и т.д. но общий смысл именно такой. По индексу в листе работаем с объектом в памяти
P.S.
если честно, то имеющийся чек какой-то совсем никакой. я бы его поменял на простой собственный image
-
krapotkin получил реакцию от Tumaso в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?
processmessages на андроид зачем???
почему нельзя в потоке открыть и зафетчить записи, а уже потом добавить binding
-
krapotkin отреагировална Сергей Сергеев в Личный кабинет пациента поликлиники
сделано на Datasnap - 3х звенка
MsSql- Сервис Https - Клиент ( Андроид, Ios, Win, Mac)
Личный кабинет пациента клиники (www.familydoctor.ru) открывает зарегистрированным пользователям доступ
к медицинской карте (результаты лабораторных исследований и функциональной диагностики,
описание приемов врачей, направления и рекомендации,
истории посещений клиники (дата, время, специалист),
программам медицинского наблюдения (перечень, период прикрепления),
информации о движении средств по депозитам.
Для пересылки выписок (файлов) из медицинской карты используется электронная почта (в системе должен быть настроенный Майл Агент на отправку почты).
Полной версией приложения могут воспользоваться только пациенты, подключившие услугу "Личный кабинет" в регистратуре любого корпуса клиники "Семейный доктор".
В новой версии изменен дизайн, появились новые функции и разделы:
вход по номеру медкарты или ФИО;
запрос нового пароля;
заявка на онлайн запись;
отмена приема;
прейскурант услуг клиники;
справочник адресов клиники.
сервис оплаты услуг клиники через приложение.
В ближайшем будущем функционал личного кабинета будет дополнен онлайн расписанием специалистов, возможностью электронной записи на приём.
в гугл плее
https://play.google.com/store/apps/details?id=com.familydoctor.FD
Есть тестовый вход, обращайтесь.
-
krapotkin получил реакцию от Ingalime в Не могу изменить размеры и формы компонентов
отверстано хоть с использованием ALIGN ?
-
krapotkin получил реакцию от qz5 в ListBoxItem.Data - под Windows все работает под Android выдает ошибку.
Добавлю. Убить - это в данном случае именно Free. Для Windows это нужно, для ARC - не помешает. Кроме того, идет большая работа по отказу от ARC, чем кончится - неизвестно
Нужно добиваться, чтобы работали встроенные механизмы. Если вы разрушите объект явно через DisposeOf, то в конце концов и система тоже пойдет его удалять, и вы схватите AV
-
krapotkin получил реакцию от Anatoliy в Фреймворк для стандартного ListView
Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые....
Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок
Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд
Крутится плавно...
ListViewTest.apk.rar
-
krapotkin получил реакцию от qz5 в Фреймворк для стандартного ListView
запрос он всегда один, большой или малый. просто записи с сервера фетчатся по кускам. но для локальной SQL это как-то вообще не актуально )
кроме того, не понял, что вам мешает в адаптере брать данные с датасета?
вообще ничего менять не надо
-
krapotkin получил реакцию от qz5 в Фреймворк для стандартного 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.
ссылки на репозитории ниже
-
krapotkin получил реакцию от Alex7wrt в Фреймворк для стандартного 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.
ссылки на репозитории ниже
-
krapotkin получил реакцию от aleksandrguru в Фреймворк для стандартного ListView
Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые....
Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок
Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд
Крутится плавно...
ListViewTest.apk.rar
-
krapotkin отреагировална Dmitry_4501 в [РЕШЕНО]: Как отловить кнопки пульта ДУ
В общем удалось решить проблему с кнопками пульта. Теперь приложение распознает все кнопки с пульта. Если кому-то нужно, прикрепил архив. (Delphi 10.3.1 Rio)
fmx_androidkey_fix.zip
-
krapotkin отреагировална Шамсуддин в Как убить кнопку кликнув на нее саму
Перепроверил 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 приложений.
-
krapotkin получил реакцию от Шамсуддин в Как убить кнопку кликнув на нее саму
нет никакой подстраховки)). не надо чудесизировать исполнение программы
обработчик работает в главном потоке, и наша задача - дать ему с гарантией завершиться! исключительно для этого мы вызываем Synchronize() из другого потока
программа придет туда не абы когда а только после выполнения всех текущих работ основного потока. То же самое можно достигнуть в windows сделав postMessage()
Ну и создание объекта подчиняется тем же условиям. Если он РЕАЛЬНО не удалился, то самостоятельно убив его через DisposeOf, мы получим с большой вероятностью AV из-за того, что где-то ссылка на него еще есть!
-
krapotkin получил реакцию от Шамсуддин в Как убить кнопку кликнув на нее саму
Если правильно все было сделано, то арк работает ровно так же как и ранее. Создал объект - удали ссылки на него и сделай free. Ровно как и всегда
-
krapotkin получил реакцию от hippocamus в Размеры TPanel
во время FormCreate еще не определены размеры
лучше в OnShow, или OnResize
-
krapotkin получил реакцию от Ingalime в Подключение к БД Firebird из Android
примеров полно, но нужно бы ТЗ иметь.
обращение из программы к серверу - через THttpClient
сервер - в зависимости от умений и знаний, на любом языке. традиционно у нас в ходу PHP
-
krapotkin получил реакцию от Barbanel в Подключение к БД Firebird из Android
wordpress думаю не совсем та платформа))
тут на сайте полно примеров THttpClient
а по поводу сервера вам нужно читать что-то типа PHP REST API tutorial, например
https://klisl.com/php-api-rest.html
-
krapotkin получил реакцию от Dmitry Stolyarov в Разбор JSON с мультизапросом
arr:=SA(JSON); for i:=0 to arr.length-1 do arr2:=arr.a[i];
-
krapotkin получил реакцию от Barbanel в Разбор JSON с мультизапросом
вы просто без разделителей склеиваете три разных JSON-массива
вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
function GetValuesAsJson($query) { ..... } тогда будет например
'{"Arr1":'. GetValuesAsJson($query1). ', "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
-
krapotkin получил реакцию от Ingalime в Разбор JSON с мультизапросом
вы просто без разделителей склеиваете три разных JSON-массива
вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
function GetValuesAsJson($query) { ..... } тогда будет например
'{"Arr1":'. GetValuesAsJson($query1). ', "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
-
krapotkin получил реакцию от Dmitry Stolyarov в Разбор JSON с мультизапросом
вы просто без разделителей склеиваете три разных JSON-массива
вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
function GetValuesAsJson($query) { ..... } тогда будет например
'{"Arr1":'. GetValuesAsJson($query1). ', "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
-
krapotkin получил реакцию от dnekrasov в Получение времени от серверов времени
TIdTime is a client implementation of the Time Protocol as described in the Internet Standards document:
RFC 868 - Time Protocol (http://www.rfc-editor.org/rfc/rfc868.txt)
Time is a simple protocol for synchronizing time on a local network. For a time protocol with higher accuracy over several networks, use TIdSNTP. To retrieve the current date and time in human-readable form, use TIdDayTime.
Please note that the Time Protocol in its current form cannot handle most dates after the year 2035. This limitation is stated in RFC 868.
-
krapotkin получил реакцию от FAN в Фреймворк для стандартного ListView
Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые....
Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок
Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд
Крутится плавно...
ListViewTest.apk.rar