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

Maximus

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

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

  • Посещение

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

    9

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

  1. Haha
    Maximus отреагировална Android в Текстовый компонент с подсветкой синтеза   
    какого синтеза? ?
  2. Confused
    Maximus отреагировална Letter в Сократить путь   
    Подскажите как сократить путь?
    Например при System.IOUtils.TPath.GetDownloadsPath выдаст такой путь " /storage/emulated/0/Download " и нужно его сократить
    до "/storage/emulated/0 "
  3. Like
    Maximus получил реакцию от Ingalime в Ошибка E2512 Type parameter 'TArgument' must be a non-nullable value type   
    В 10.4.1 починили. Главное чтобы следующим патчем не разломали.
  4. Like
    Maximus получил реакцию от Ingalime в Ошибка E2512 Type parameter 'TArgument' must be a non-nullable value type   
    Сломали они вторым патчем ограничения с записями. Либо откатывать его, либо убирать ограничения https://quality.embarcadero.com/browse/RSP-30073
    Видимо хотели починить это https://quality.embarcadero.com/browse/RSP-28761
     
  5. Like
    Maximus получил реакцию от Ingalime в C++Builder експорт с SQLite в MYSql проблемы с кодировками   
    Попробуйте так
    title = dm->qExpContent->FieldByName("title")->AsWideString; introtext = dm->qExpContent->FieldByName("introtext")->AsWideString; fulltext = dm->qExpContent->FieldByName("fulltext")->AsWideString;  
  6. Like
    Maximus отреагировална 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);  То размер будет корректный.
  7. Like
    Maximus отреагировална Евгений Корепов в Получение времени от серверов времени   
    Протокол SNTP
      Помимо NTP, существует упрощенная версия этого протокола - SNTP (Simple Network Time Protocol). Он реализован для синхронизации времени конечным клиентом, поскольку все преимущества протокола NTP проявляются именно в сети серверов, а для получения показаний конечным пользователем NTP излишне сложен. Поэтому для синхронизации времени конечными компьютерами и серверами был предложен протокол SNTP (SNTPv3: 1992 г., RFC1361 и 1995 г., RFC1769; SNTPv4 включён как подпротокол в NTPv4).
    На самом деле SNTP - это не новый протокол, а способ использования NTP-пакетов и NTP-серверов в приложениях, где не требуется высокоточное время, либо оно недостижимо. В этом случае клиент использует только часть информации UDP-пакета NTP-сервера. SNTP-клиент может работать с любыми версиями NTP-серверов, и кроме них - с особыми SNTP-серверами, которые в откликах заполняют только необходимые данные UDP-пакета.
    Таким образом, "облегченный" SNTP образует не сеть синхронизирующихся серверов, а пары "клиент-сервер". Любой NTP-сервер является одновременно SNTP-сервером. Клиент, который не передаёт полученное время дальше, может работать как NTP- или SNTP-клиент, в зависимости от условий. Для SNTP, как и для NTP, зарезервирован 123-й UDP-порт.
     
    Uses IdSNTP, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient; .... procedure TForm1.Button2Click(Sender: TObject); Var IdSNTP: TIdSNTP; begin IdSNTP:=TIdSNTP.Create(Self); IdSNTP.Host := 'ntp1.stratum2.ru'; ShowMessage(DateTimeToStr(IdSNTP.DateTime)); IdSNTP.Free; end;  
  8. Like
    Maximus отреагировална haword в Типовая задача доступа к данным - Нужен дельный совет   
    бесплатный совет - для СТАРТАПА с количеством пользователей хотя бы от 1000 человек, лучше использовать нативные средства разработки, Xcode и Android Studio, если хотите что-то серьезное написать. если просто поиграться на взлетит не взлетит а если что потом перепишем на натив, то да, можно и на делфи.
    бесплатных хостингов БД нет. 
  9. Like
    Maximus отреагировална krapotkin в Переезд на 10.3 Rio   
    сколько бед принесла уже стрельба в ногу под названием ProcessMessages
    как хорошо, что в Андроиде наконец всех отучат от этого крайне вредного трюка
    давайте формально 
    все что там у вас "высоконагруженное" выносите в потоки и пусть они работают. Ваши "потоки" пасутся в главном (Synchronize) и никакого толка нет
    концепцию надо поменять. запустили поток и занимайтесь своим делом. например покажите Splash
    а вернется поток - вот по возвращению и сделаете то, что этот Splash закроет.
    и уж точно потоки не должны ничего общего иметь с формами
    я писал статью про потоки, там про сплеши тоже есть в блоге и про ProcessMessages отдельная боль...
    http://www.cyberforum.ru/blogs/469693/blog4875.html
     
  10. Like
    Maximus отреагировална Евгений Корепов в обновление визуальных компонентов   
    Вот тут лучше перестраховаться и взять за правило принцип "Любое обращение к адресному пространству другого потока выполнять потокобезопасными способами". Потому как даже чтение может привести к непредсказуемым результатам - читаете вы данные, строку к примеру из другого потока, прочитали половину, а тот поток в это время перезаписал содержимое ячеек памяти, и вы после этого читаете оставшуюся половину. Вместо ожидаемых данных получаете черте что. Это грубый пример конечно.
  11. Like
    Maximus отреагировална Barbanel в Скроллинг на канве   
    Доброго времени.
    Я не могу вам сказать где именно ошибка (я даже не уверен что она есть), вы пишете я С++, а у меня лишь Delphi под руками. Я скачал ваш проект и запустил ехе. К сож. он не запустился на моей матине из-за отсутсвующих библиотек rtl250.bpl
    Соотв. я не вижу как работает приложение, и как выглядят ваши фризы.
    Судя по всему вы пытаетесь сделать игрушку, либо что-то аналогичное. Делать игрушку используя один лишь FMX или VCL имхо нелогично, т.к. эти платформы не предназначены для быстрой и плавной отрисовки графики.
    Если вам реально необходима плавная отрисовка - используйте либо OpenGL либо DirectX. Вот здесь то и будет на все 100% "аппаратный скролл".
    Это и есть тот совет, "как" написать.
    Этот форум как раз для этого предназначен, и количество постов как раз тому подтверждение. Есть только одно НО:
    никто здесь не обязан сразу броситься и настрочить вам готовое решение. Если человек имеет представление где может быть проблема, и что еще более важно - имеет время и желание писать ответ - он вам ответит.
    Далеко не каждый из тех кто прочитал тему может или хочет вам (или мне, или кому-либо еще) отвечать.
    Ярослав же и так имеет чем заняться и совершенно не обязан отвечать в каждой теме. Вы не спрашиваете на форуме MSDN почему вам лично мистер Гейтс не отвечает.
    Ок, это было отступление.
    Если вы хотите примеры как использовать графические библиотеки - вам на немного другие специализированные форумы типа gamedev.ru
    Конкретно для Delphi и OpenGL я могу дать такую ссылку sulaco Здесь множество простейших примеров использования OpenGL, я в свое время именно здесь его и осваивал. 
  12. Like
    Maximus отреагировална 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) пока нет колонок и других особых изысков.
    На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже
    UPD.
    ссылки на репозитории ниже
     
  13. Like
    Maximus отреагировална Brovin Yaroslav в О видах координат в FireMonkey и конвертации между ними   
    Типы координат
    В FIreMonkey различают три вида координат:
    Локальные - это координаты в системе координат контрола.  Абсолютные - это координаты в системе координат клиентской части формы. Экранные - это координаты в системе координат экрана. Соответственно, если речь идет о форме, то позиция формы задается в экранных координатах.
    Если речь идет о контролах, то в локальных координатах своего родительского контрола.
     
    Конвертация
    Локальные -> Абсолютные
    TControl.LocalToAbsolute(TPointF): TPointF Абсолютные -> Локальные
    TControl.AbsoluteToLocal(TPointF): TPointF Абсолютные -> Экранные
    TControl.Scene.LocalToScreen(TPointF): TPointF; Экранные -> Локальные
    TControl.Scene.ScreenToLocal(TPointF): TPointF;
  14. Like
    Maximus отреагировална Евгений Корепов в Отображение картинок в ListView   
    Вот вы же сейчас шутите да? Я просто взял код который не работал совсем (отрисовка после скрола - это совсем), и сделал из него 100% рабочий код. Потратил на это около 10 минут. Упомянул что код и метод подгрузки - для забавы. А вы начинаете мне говорить что для продакшина этот код не годится, что я все сделал не правильно, что на больших списках все загнется.
    Автор топика четко описал проблему:
    Я проблему решил? Показал что проблема была в ошибочной логике приложения, а не в неких глюках ListView? А мы мне начинаете рассказывать о том что вот если этот демо код запустить в космос, то ой-ой-ой случится. ?
    По пунктам:
    1. Отрисовка в OnPaint - событие может вызываться как угодно часто, ничто не запретит системе вызвать его несколько раз в секунду. Цикл перебора всех элементов списка в этом событии с остановкой нормальной отрисовки - очень-очень плохой совет.
    2. Картинки в высоком качестве и (или) их комплект с разным scale - логика приложения должна быть построена так, чтобы определять нужный scale и загружать только подходящие картинки с вашего сервера.
    По поводу потоков и их количества - нужно помнить что кроме ресурсов телефона, используются ресурсы полосы пропускания текущего Интернет соединения на устройстве и ресурсы сервера. Поэтому лучше для загрузки использовать 1 (ну может 2-3) потока - десяток видимых картинок последовательно загрузятся почти мгновенно.
    К сожалению логика асинхронности HTTPClient упускает одну важную вещь - идентификацию полученного результата. Т.е. даем пяток заданий GET, загрузить картинку для Item 1,2,3,4,5 - но при получении результата мы никак не можем определить что полученный результат относится к Item 3, а не какому либо другом. По крайней мере мне это не удалось сделать просто и прозрачно. Посему остается вариант создания экземпляра HTTPClient для каждого запроса - возвращаемся к фактически анонимным процедурам, попутно стреляя себе в ногу, потому как создание/уничтожение экземпляра HTTPClient чуть ли не дороже скачивания 10 килобайтной картинки )
     
    Можете посмотреть пример реализации подобной задачи в моем старинном приложении, там как раз реализован подход о котором говорил - загрузка картинок только видимых элементов (+ несколько про запас), загрузка картинок последовательно одним потоком ну и еще что то:. https://play.google.com/store/apps/details?id=ru.flintnet.Actions5
  15. Like
    Maximus получил реакцию от Ingalime в Размер формы на Android   
    Поиск рулит
     
  16. Like
    Maximus получил реакцию от Котэ в Размер формы на Android   
    Поиск рулит
     
  17. Like
    Maximus отреагировална dnekrasov в [Windows] Запретить окну переход в прозрачный режим   
    Недавно решил одну проблемку, которая долго мучала - решил поделиться, может кому ещё пригодится.
    При работе с двумя мониторами или с монитором и проектором часто возникает необходимость запретить окну "исчезать" при наведении курсора мыши на миниатюру другого приложения в панели задач. Чтобы это сделать надо:
    uses ... Winapi.DwmApi ... TMainForm = class(TForm) ... protected procedure CreateHandle; override; ... end; ... procedure TMainForm.CreateHandle; var Val, Res: Integer; begin inherited CreateHandle; Val := 1; Res := DwmSetWindowAttribute(FormToHWND(Self), DWMWA_EXCLUDED_FROM_PEEK, @Val, SizeOf(Val)); {$IFDEF DEBUG} if Res <> S_OK then ShowMessage(SysErrorMessage(Res)); {$ENDIF} end; Спасибо @Alex7wrt за наводку
  18. Like
    Maximus отреагировална Brovin Yaroslav в [FGX Native] [Вебинар] Сравнение возможностей кроссплатформенных мобильных библиотек нативных приложений FMX и FGX Native   
    Тема: "Сравнение возможностей кроссплатформенных мобильных библиотек нативных приложений FMX и FGX Native" Дата и время: 20 декабря 2018 года в 12:00 (по московскому времени) Участники: @Brovin Yaroslav, Андрей Совцов Регистрация: ссылка Ссылка на официальный телеграмм канал: https://t.me/fgx_native Участие бесплатное Под конец уходящего нового года сравним текущие возможности кроссплатформенной библиотеки мобильной разработки FGX Native и FMX. Поговорим о перспективах развития и ознакомимся с ближайшим планом до выпуска публичной бета версии. Посмотрим в живую на новый функционал библиотеки, разработанный за последнее время. У вас будет возможность задать любые вопросы автору. Не пропусти эту возможность!

  19. Like
    Maximus получил реакцию от Sergionn в Ура! Вышла 10.3 Rio!   
    Сырая как обычно. Вот как они тестировали?
     
  20. Like
    Maximus отреагировална ENERGY в [Apple store]отказ публикации из-за локации   
    Ну и что они сказали конкретно? Не во всех штатах США марихуана легализована, может из за этого.
    Проблему нужно решать с поддержкой Apple, и вам персонально проблему с гомосексуализмом, а не здесь. 
  21. Like
    Maximus отреагировална kami в Telega π - Библиотека для работы с Telegram Bot API в Delphi   
    У меня большая просьба: вместо кучи маленьких сообщений, которые вы пишете буквально одно за другим, составьте одно, в которое напишите всё то, что хотели сказать.
    Это не чат, где "кто в онлайне - прочитали, остальным пофиг". Это форум. И искать зерна истины в этой портянке из мимолетных мыслей как минимум неудобно.
  22. Like
    Maximus отреагировална kami в сборка проекта с библиотеками   
    Вы используете передачу небезопасных параметров между exe и dll?
    Зря.
  23. Haha
    Maximus отреагировална Равиль Зарипов (ZuBy) в Как сделать форму с компонентами под все разрешения?   
    нужно использовать лицензионную винду, иначе Align не будет работать
     
  24. Like
    Maximus отреагировална willi в Простой график для вывода точек и столбцов   
    Написал в XE10.1 простой модуль для вывода кривых на TImage  в виде графика - есть возможность вывода столбцов для диаграмм, меток с надписями и прочей мелочи.
    В виде компонента не оформлял...    Смысл: вводим массив точек - график сам подбирает область вывода чтобы влезли надписи и выводит с указанными параметрами и стилем кривые (имею в виду зависимости Y от X).
    Есть комментарии в коде - есть пример для тестов - см. проект https://github.com/willi-spb/arTrassing
    желательно тестирование, возможно я что-то упустил - сам модуль: https://github.com/willi-spb/arTrassing/blob/master/FMX.arCurveClasses.pas

  25. Like
    Maximus отреагировална Кривяков Виталий в Зависимость от регистра русских символов при использовании LIKE   
    Добрый день!
    В стандартных компонента есть механизм по встраиванию своих функций в SQLite. 
    ... // создаю встроенную функцию ru_lower F1 := TFDSQLiteFunction.Create(nil); F1.DriverLink := WC1; F1.FunctionName := 'ru_lower'; F1.ArgumentsCount := 1; F1.OnCalculate := ru_lower; ... procedure TORMmanager.ru_lower(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); begin AOutput.AsString := AInputs[0].AsString.ToLower; end; SQL:
    select name from users where ru_lower(name) like '%иван%'
    Запрос вернет все имена содержащие иван в любом регистре.
×
×
  • Создать...