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

krapotkin

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

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

  • Посещение

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

    209

Активность репутации

  1. Like
    krapotkin получил реакцию от Barbanel в Фреймворк для стандартного ListView   
    Обновил репозиторий.
    Добавил метод AfterLayout для условного форматирования элементов после раскладки по итему LV
    https://bitbucket.org/vkrapotkin/vklistview/src/master/
  2. Like
    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
  3. Like
    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
  4. Like
    krapotkin получил реакцию от Tumaso в LiveBinding на ListView и FireDAC в отдельном потоке без "заморозки" интерфейса на Андроид?   
    processmessages на андроид зачем???
    почему нельзя в потоке открыть и зафетчить записи, а уже потом добавить binding
  5. Like
    krapotkin отреагировална Сергей Сергеев в Личный кабинет пациента поликлиники   
    сделано на Datasnap - 3х звенка
    MsSql- Сервис Https - Клиент ( Андроид, Ios, Win, Mac)
     
    Личный кабинет пациента клиники (www.familydoctor.ru) открывает зарегистрированным пользователям доступ
    к медицинской карте (результаты лабораторных исследований и функциональной диагностики,
    описание приемов врачей, направления и рекомендации,
    истории посещений клиники (дата, время, специалист),
    программам медицинского наблюдения (перечень, период прикрепления),
    информации о движении средств по депозитам.

    Для пересылки выписок (файлов) из медицинской карты используется электронная почта (в системе должен быть настроенный Майл Агент на отправку почты).
    Полной версией приложения могут воспользоваться только пациенты, подключившие услугу "Личный кабинет" в регистратуре любого корпуса клиники "Семейный доктор".
    В новой версии изменен дизайн, появились новые функции и разделы:
    вход по номеру медкарты или ФИО;
    запрос нового пароля;
    заявка на онлайн запись;
    отмена приема;
    прейскурант услуг клиники;
    справочник адресов клиники.
    сервис оплаты услуг клиники через приложение.
    В ближайшем будущем функционал личного кабинета будет дополнен онлайн расписанием специалистов, возможностью электронной записи на приём. 

     
    в гугл плее
     https://play.google.com/store/apps/details?id=com.familydoctor.FD
    Есть тестовый вход, обращайтесь. 
     
  6. Like
    krapotkin получил реакцию от Ingalime в Не могу изменить размеры и формы компонентов   
    отверстано хоть с использованием ALIGN ?
  7. Like
    krapotkin получил реакцию от qz5 в ListBoxItem.Data - под Windows все работает под Android выдает ошибку.   
    Добавлю. Убить - это в данном случае именно Free. Для Windows это нужно, для ARC - не помешает. Кроме того, идет большая работа по отказу от ARC, чем кончится - неизвестно
    Нужно добиваться, чтобы работали встроенные механизмы. Если вы разрушите объект явно через DisposeOf, то в конце концов и система тоже пойдет его удалять, и вы схватите AV
  8. Like
    krapotkin получил реакцию от Anatoliy в Фреймворк для стандартного ListView   
    Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые....
    Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок
    Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд
    Крутится плавно...

    ListViewTest.apk.rar
  9. Like
    krapotkin получил реакцию от qz5 в Фреймворк для стандартного ListView   
    запрос он всегда один, большой или малый. просто записи с сервера фетчатся по кускам. но для локальной SQL это как-то вообще не актуально )
    кроме того, не понял, что вам мешает в адаптере брать данные с датасета?
    вообще ничего менять не надо
  10. Like
    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.
    ссылки на репозитории ниже
     
  11. Like
    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.
    ссылки на репозитории ниже
     
  12. Thanks
    krapotkin получил реакцию от aleksandrguru в Фреймворк для стандартного ListView   
    Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые....
    Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок
    Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд
    Крутится плавно...

    ListViewTest.apk.rar
  13. Like
    krapotkin отреагировална Dmitry_4501 в [РЕШЕНО]: Как отловить кнопки пульта ДУ   
    В общем удалось решить проблему с кнопками пульта. Теперь приложение распознает все кнопки с пульта. Если кому-то нужно, прикрепил архив. (Delphi 10.3.1 Rio)
     
    fmx_androidkey_fix.zip
  14. Like
    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 приложений.
  15. Thanks
    krapotkin получил реакцию от Шамсуддин в Как убить кнопку кликнув на нее саму   
    нет никакой подстраховки)). не надо чудесизировать исполнение программы
    обработчик работает в главном потоке, и наша задача - дать ему с гарантией завершиться! исключительно для этого мы вызываем Synchronize() из другого потока
    программа придет туда не абы когда а только после выполнения всех текущих работ основного потока. То же самое можно достигнуть в windows сделав postMessage()
    Ну и создание объекта подчиняется тем же условиям. Если он РЕАЛЬНО не удалился, то самостоятельно убив его через DisposeOf, мы получим с большой вероятностью AV из-за того, что где-то ссылка на него еще есть!
     
  16. Thanks
    krapotkin получил реакцию от Шамсуддин в Как убить кнопку кликнув на нее саму   
    Если правильно все было сделано, то арк работает ровно так же как и ранее. Создал объект - удали ссылки на него и сделай free. Ровно как и всегда
  17. Like
    krapotkin получил реакцию от hippocamus в Размеры TPanel   
    во время FormCreate еще не определены размеры
    лучше в OnShow, или OnResize
  18. Like
    krapotkin получил реакцию от Ingalime в Подключение к БД Firebird из Android   
    примеров полно, но нужно бы ТЗ иметь.
    обращение из программы к серверу - через THttpClient
    сервер - в зависимости от умений и знаний, на любом языке. традиционно у нас в ходу PHP
     
  19. Like
    krapotkin получил реакцию от Barbanel в Подключение к БД Firebird из Android   
    wordpress думаю не совсем та платформа))
    тут на сайте полно примеров THttpClient
    а по поводу сервера вам нужно читать что-то типа PHP REST API tutorial, например
    https://klisl.com/php-api-rest.html
  20. Like
    krapotkin получил реакцию от Dmitry Stolyarov в Разбор JSON с мультизапросом   
    arr:=SA(JSON); for i:=0 to arr.length-1 do   arr2:=arr.a[i];  
  21. Like
    krapotkin получил реакцию от Barbanel в Разбор JSON с мультизапросом   
    вы просто без разделителей склеиваете три разных JSON-массива
    вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
    function GetValuesAsJson($query) {   ..... } тогда будет например
    '{"Arr1":'. GetValuesAsJson($query1). ',  "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
  22. Like
    krapotkin получил реакцию от Ingalime в Разбор JSON с мультизапросом   
    вы просто без разделителей склеиваете три разных JSON-массива
    вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
    function GetValuesAsJson($query) {   ..... } тогда будет например
    '{"Arr1":'. GetValuesAsJson($query1). ',  "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
  23. Like
    krapotkin получил реакцию от Dmitry Stolyarov в Разбор JSON с мультизапросом   
    вы просто без разделителей склеиваете три разных JSON-массива
    вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
    function GetValuesAsJson($query) {   ..... } тогда будет например
    '{"Arr1":'. GetValuesAsJson($query1). ',  "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
  24. Like
    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.
  25. Thanks
    krapotkin получил реакцию от FAN в Фреймворк для стандартного ListView   
    Вот и картинки подвезли. Идиотский Deployment отказывается переписывать старые файлы на новые....
    Пока полностью не удалил приложение, файл-описание раскладки был старый, без картинок
    Как видно из заголовка 3000+ итемов с авторасчетом высоты. 6 секунд
    Крутится плавно...

    ListViewTest.apk.rar
×
×
  • Создать...