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

Лидеры

  1. krapotkin

    krapotkin

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


    • Баллы

      21

    • Постов

      2 180


  2. OnePeople

    OnePeople

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


    • Баллы

      17

    • Постов

      322


  3. Hevard

    Hevard

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


    • Баллы

      14

    • Постов

      78


  4. Martifan

    Martifan

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


    • Баллы

      13

    • Постов

      396


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

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

  1. о... да мы меряемся? на 1000: 250-333fps как тебе такое Sulion 10000... fps3.zip
    3 балла
  2. Неужели так сложно не ссылки кидать, а приложить файлы? Среда разработки Delphi 10.3.pdf Delphi. Программирование для Windows, OS X, iOS и Android [2014].pdf Мобильная разработка в delphi.pdf Программирование_на_Delphi_для_школ.pdf
    3 балла
  3. Vladimir Gaivoronsky

    ShoesMaster

    Программа для администрирования обувного цеха. Переписана с VCL на FMX. Проверена и оттестирована на Windows (10) Linux (ubunti 21 - 23, openSuse) MacOS (10, 11 intel) на silicon негде проверять и нет SDK. Работает с Firebird версии 3 и 5. Поддерживает сканеры штрих кодов. Позволяет отследить весь процесс производства: от приемки заказа до отправки в магазин (продажей занимается другая программа) Написана с использованием TMS.FNC. В программе есть несколько тем оформления ( в основном темные, но есть и светлые). Пока еще происходит обкат в нескольких цехах, но скоро можно будет "пощупать" всем желающим. Также чуть позже будет версия на Android. Требует внешний сервер БД (для MacOS и Android). В макинтоше запустить и настроить firebird очень нетривиально, например сортировка по названиям без учета регистра не реализовано в 3 версии.
    2 балла
  4. Или просто сделайте borderstyle формы none. И сами сделайте рамки, кнопки закрыть, свернуть и т.д.
    2 балла
  5. Не по теме, но у оператора от таких цветов в конце дня нет желания кого-нибудь убить?
    2 балла
  6. В Delphi для усиления звука записи можно воспользоваться классом TAudioCaptureDevice и его свойством Volume. Это свойство позволяет установить уровень громкости для записи звука. Чем выше значение Volume, тем громче будет записанный звук. Вот пример, как можно использовать свойство Volume: uses FMX.AudioCapture, System.SysUtils; procedure RecordAudio(const AFileName: string; const AVolume: Single); var AudioCapture: TAudioCaptureDevice; begin AudioCapture := TAudioCaptureDevice.Create(nil); try AudioCapture.FileName := AFileName; AudioCapture.PauseLength := 0; AudioCapture.Volume := AVolume; // Установка уровня громкости AudioCapture.Active := True; Sleep(5000); // Запись в течение 5 секунд AudioCapture.Active := False; finally AudioCapture.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin // Задайте путь и имя файла, в который будет сохранен звук // Укажите значение громкости от 0 до 1 (например, 0.5 для половины максимальной громкости) RecordAudio('/sdcard/MyRecording.wav', 0.8); ShowMessage('Запись завершена.'); end; В этом примере в процедуре RecordAudio добавлен дополнительный параметр AVolume, который позволяет задать уровень громкости записи. Значение AVolume должно быть в диапазоне от 0 до 1, где 0 соответствует минимальной громкости, а 1 - максимальной. Вы можете экспериментировать с различными значениями AVolume, чтобы найти наиболее подходящий уровень усиления звука для вашего приложения и устройства.
    2 балла
  7. Когда вы говорите, что приложения на Андроиде весят 400КБ и используют библиотеки Java размером 2ГБ, вы, по-видимому, имеете в виду разницу между размером исполняемого файла приложения и размером всех библиотек, которые оно может использовать во время выполнения. Современные фреймворки, такие как Java для Android или .NET, часто используют большое количество библиотек, которые содержат общий код, используемый многими приложениями. Эти библиотеки обычно устанавливаются один раз и затем используются множеством приложений, поэтому их размер не влияет на размер каждого отдельного приложения. С другой стороны, приложения, созданные с использованием Delphi, обычно компилируются в нативный код и включают в себя все необходимые библиотеки и зависимости. Это может привести к тому, что исполняемые файлы будут больше, чем если бы они использовали общие библиотеки, но они не зависят от установленных библиотек времени выполнения. С точки зрения конечного пользователя, размер приложения часто не является ключевым фактором, особенно с учетом того, что современные устройства имеют большое количество памяти. Однако для разработчиков может быть важно минимизировать размер приложения, чтобы сократить время загрузки и уменьшить использование ресурсов. В итоге, вопрос "маленькие или большие приложения" зависит от контекста и требований конкретного приложения. В некоторых случаях использование общих библиотек может быть выгодно, в других - предпочтительнее иметь самодостаточное приложение с включенными в него всеми необходимыми библиотеками.
    2 балла
  8. что за детский сад на андроиде приложения весят 400К и при этом используют библиотеки Java на 2G это как - маленькие или большие приложения? то же с .NET Приложение с пустой формой тащит за собой весь функционал, который вы можете использовать, при этом не требуя установки дополнительных run-time библиотек, чем, собсн, всегда и хороша была Делфи mp3 файл весит 8-10 мб. а 5 сек видео "опы - 120. Не видел я чтобы кто-то плакал по этому поводу
    2 балла
  9. Hevard

    Вышла Delphi 11 Community Edition

    Для переноса (компилирования) проектов из более ранней версии необходимо провести действия для Android 32-bit и Android 64-bit. В окне Projects (справа) выбрать Target Platforms -> Правой кнопкой щёлкнуть по Libraries и выбрать Revert System Files to Default. И не забудьте перенести debug.keystore из c:\Users\<USER>\AppData\Roaming\Embarcadero\BDS\21.0\ в папку ...\22.0\ Delphi: Community Edition - Embarcadero
    2 балла
  10. OnePeople

    миграция на 11.3

    Все проще Target - Android - Libraries -Revert System Files to Default
    2 балла
  11. нет никакой технологии, есть набор Bitmap и рисование этих битмап напрямую на Canvas объем памяти ровно такой, что требуется для хранения этих битмапов. скорость отрисовки - максимальная, потому что кроме отрисовки вы собсно ничего не делаете вообще)
    1 балл
  12. Tumaso

    Параллельный отладчик

    Сама суть Synchronize в том, чтобы выполнить код в главном потоке
    1 балл
  13. OnePeople

    bluetooth что не так

    Может их нет, новых, а есть устройства которые уже подключались ранее Bluetooth.GetPairedDevices; FPairedDevices := Bluetooth.GetPairedDevices; if FPairedDevices.Count > 0 then for I:= 0 to FPairedDevices.Count - 1 do ListBox.Items.Add(FPairedDevices[I].DeviceName) Ну и если Android API >= 31 if TJBuild_VERSION.JavaClass.SDK_INT >= 31 then begin FPermissionBTConnectSettings := JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_CONNECT); FPermissionBTScanSettings := JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_SCAN); FPermissionBTAdvertiseSettings := JStringToString(TJManifest_permission.JavaClass.BLUETOOTH_ADVERTISE); PermissionsService.RequestPermissions([FPermissionBTConnectSettings] + [FPermissionBTScanSettings] + [FPermissionBTAdvertiseSettings], nil); end;
    1 балл
  14. krapotkin

    Параллельный отладчик

    https://bitbucket.org/vkrapotkin/commonapi/src/master/UVKCommonLog.pas log.log('TrqdAttributes LoadFromFolder (' + Attributes.Count.ToString + ')'); в логе 14:15:13.463 (000013D8) TrqdAttributes LoadFromFolder (5) или 14:15:12.504 (main) Login successful.
    1 балл
  15. OnePeople

    ProgressBar и потоки

    Вам уже ответили, но можете конечно сделать так в главном потоке procedure Test; const n = 200; var I: Integer; begin pb1.Min := 0; pb1.Max := n - 1; for I := 0 to n - 1 do begin pb1.Value := I; sleep(10); Application.ProcessMessages; end; end;
    1 балл
  16. OnePeople

    Создание Dockable формы

    Ну я судил поэтому Если нет, то тут только как написали вы, делать все самому, хотя я думаю накрутить и в TabControl можно красивостей)
    1 балл
  17. krapotkin

    Создание Dockable формы

    я так понимаю, вопрос упирался в красивый драг, а не способ отсоединить таб от родителя ?
    1 балл
  18. OnePeople

    Создание Dockable формы

    Написал за 5 минут для примера как можно Новая папка.rar
    1 балл
  19. Ищите android:requestLegacyExternalStorage
    1 балл
  20. Подведи мышкой к правому краю, курсор поменяется на изменение размеров, зажми левую кнопку мыши и вытащи правую область (которая и есть предпросмотр) влево
    1 балл
  21. krapotkin

    TLocationSensor - километраж

    тут написано, что проблема сложная и не решается в лоб https://android-developers.googleblog.com/2020/12/improving-urban-gps-accuracy-for-your.html можно попробовать оставить только Manifest.permission.ACCESS_FINE_LOCATION и исключить Manifest.permission.ACCESS_COARSE_LOCATION чтобы попадали только данные со спутников но вот тут написано, что в современных ОС вы должны это запрашивать, и не факт что получите https://developer.android.com/training/location/permissions
    1 балл
  22. Подключусь к теме... Как-то пытался сделать подобное и в принципе получилось, безрамочное окно, которое по-нативному работает, что удалось заставить работать: Если взять окно за заголовок и начать двигать им туда-сюда, то все остальные окна свернутся - нативное поведение Если взять окно за заголовок то в Windows 11 появляется верхнее меню с макетами отображения на экране - нативное поведение Если взять окно за заголовок и перетащить его к одному из краев экрана, то появится макет для отображения окна - нативное поведение Нативным образом реализовано изменение размера за все края формы, включая диагональные. Так же окно имеет нативные анимации появления\исчезания, разворачивания\сворачивания Так же имеется нативная тень А на Windows 11 имеются закруглённые края окна Что не получилось: Не получилось реализовать нативное поведение, когда в Windows 11 наводишь курсор на кнопку "развернуть окно", там появляется небольшое меню с макетами отображения на экране. Нормально реализовать границы для изменения размеров окна, ибо из-коробки они находятся за пределами окна в поле где тень у окна (в Windows 10 и Windows 11 так), у меня же они внутри окна. Как-то делал и получалось, но уже не помню. Код несложно адаптировать и под FireMonkey BorderlessWindowWithAeroSnap.zip
    1 балл
  23. krapotkin

    Размер приложения

    В RTL за годы тоже произошло 100500 изменений и добавлений. Функционал форм поменялся. Добавились стили в VCL. Все это отразилось на размере. Но я по-прежнему не вижу проблем. Вот питонные программы тянут почти 500м самого питона. Сишарп и другие - гигабайты дотнета. И ничего, никто не морщится даже.
    1 балл
  24. Martifan

    splash_image_def rad 11.3

    К сожалению, вы не можете использовать прямые значения цвета в теге android:drawable. Этот атрибут предназначен для ссылок на ресурсы, а не для прямых значений цвета. Однако вы можете определить свой собственный цвет в ресурсах вашего приложения и ссылаться на него. Для этого выполните следующие шаги: 1. Откройте файл res/values/colors.xml в вашем проекте. Если этот файл не существует, создайте его. 2. В файле colors.xml определите свой собственный цвет, как показано ниже: <?xml version="1.0" encoding="utf-8"?> <resources> <color name="my_custom_color">#0066cc</color> </resources> Теперь вы можете использовать свой пользовательский цвет в файле splash_image_def: <item android:drawable="@color/my_custom_color" /> учтите, что названия ресурсов не должны начинаться с цифры и не должны содержать символов, кроме букв (a-z), цифр (0-9) и подчеркивания (_). Ваш код может выглядеть следующим образом: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/my_custom_color" /> <item> <bitmap android:gravity="center" android:src="@mipmap/ic_launcher" /> </item> </layer-list>
    1 балл
  25. Используй константу sLineBreak вместо #10#13 / #10 и всё будет правильно работать и виндах, и на андроиде
    1 балл
  26. не думаю, что это сделано путем установки некоей "громкости" когда у нас есть оцифрованный сигнал, то дальше уже идет цифровая обработка этого сигнала например, нормализация, или компрессия https://habr.com/ru/articles/379395/ операция не очень сложная, но нужно поискать описания хороших алгоритмов и поэкспериментировать с их настройками
    1 балл
  27. https://docwiki.embarcadero.com/CodeExamples/Sydney/en/FMX.AudioRecPlay_Sample
    1 балл
  28. Ваши проблемы с анимацией могут быть связаны с несколькими вещами. Во-первых, стоит отметить, что метод AnimateFloatWait помечен как устаревший, и рекомендуется использовать Ani.TAnimator вместо него. Ani.TAnimator.AnimateFloat создает и запускает объект TFloatAnimation. Он устанавливает свойства анимации и начинает анимацию. Однако стоит заметить, что если объект не видим в момент вызова этого метода, анимация не запускается: анимация создается, но не выполняется. Вторым фактором может быть то, как Android обрабатывает анимацию. Android может иметь разные характеристики производительности и отображения, которые влияют на то, как анимация выполняется на устройстве. Также, есть пример использования анимации в Delphi для Android, который может быть полезен. Get access to over 100 FireMonkey cross platform samples for Android, IOS, OSX, Windows, and Linux! Следовательно, я бы посоветовал начать с применения Ani.TAnimator.AnimateFloat вместо AnimateFloatWait, и убедиться, что объект, который вы пытаетесь анимировать, видим на экране во время начала анимации. Если проблема продолжает сохраняться, вам может потребоваться более детальное исследование спецификаций Android и как он обрабатывает анимацию в Delphi.
    1 балл
  29. В контексте Delphi, вы можете использовать Indy компоненты для этого. TIdStack имеет метод ResolveHost() который может быть использован для разрешения имени хоста. var GStack: TIdStack; begin GStack := TIdStack.Create; try ShowMessage(GStack.ResolveHost('localhost', Id_IPv4).ToString); finally GStack.Free; end; end; Учтите, что разрешение имени хоста в IP-адрес не гарантирует, что хост будет доступен для подключения. Если имя хоста не может быть разрешено, будет вызвано исключение UnknownHostException. Также обратите внимание, что операции с сетью, такие как разрешение имени хоста, могут быть медленными, и рекомендуется выполнять их в фоновом потоке, чтобы не блокировать главный поток приложения. По поводу вашей проблемы с локальной сетью - возможно, имя хоста, которое вы пытаетесь разрешить, не зарегистрировано в локальном DNS. В этом случае, вы можете попробовать использовать полное доменное имя (FQDN) хоста, или использовать прямой IP-адрес, если он известен. Если метод разрешения имен не работает для локальной сети, вероятно, проблема связана с настройками DNS в вашей локальной сети. Имена хостов в локальной сети обычно разрешаются с помощью механизма DNS, поэтому если ваш DNS сервер или файлы hosts не содержат соответствующих записей для имени хоста, который вы пытаетесь разрешить, то метод разрешения имен вернет ошибку. Если вы контролируете настройки DNS в вашей локальной сети, вы можете добавить соответствующие записи для всех хостов, которые вы хотите разрешать. Кроме того, некоторые системы поддерживают механизмы обнаружения служб на локальной сети, такие как mDNS (Multicast DNS), который используется в протоколе Zeroconf/Bonjour. Если ваши устройства и приложения поддерживают mDNS, вы можете использовать имена хостов с суффиксом .local для разрешения имён в локальной сети. Пожалуйста, учтите, что разрешение имён хостов в IP-адреса - это сложная область, которая зависит от многих факторов, включая конфигурацию вашей сети, настройки DNS, поддержку протоколов обнаружения служб и т.д. Если вы столкнулись с проблемами, вам может потребоваться обратиться к системному администратору или к специалисту по сетям для получения помощи.
    1 балл
  30. Intent selectorIntent = new Intent(Intent.ACTION_SENDTO); selectorIntent.setData(Uri.parse("mailto:")); final Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"address@mail.com"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "The subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "The email body"); emailIntent.setSelector( selectorIntent ); activity.startActivity(Intent.createChooser(emailIntent, "Send email..."));
    1 балл
  31. sinuke

    [Android] Прозрачный StatusBar в RAD 10.3 Rio

    Привет Вчера была выпущена финальная версия RAD Studio 10.3 Rio, в которой много нововведений для Андройд. Но вот про статусбар снова "забыли". Хотя не совсем, добавили файлик styles-v21.xml, который превносит новую материальную тему на устройствах под управлением Android 5.0 и выше вместо устаревшей Holo. Но все равно свойство формы SystemStatusBar так и не реализовали. Поэтому при запуске статус бар будет окрашен в унылый серый цвет (см. скриншот). Для того, чтобы сделать статусбар прозрачным и поместить под него содержимое формы, то достаточно сделать несколько несложных шагов: 1. Убираем из деплоймента (Project -> Deployment) файл styles-v21.xml (можно просто снять галочку рядом с именем файла) 2. Добавить в деплоймент проекта новый файл styles-v21.xml (styles-v21.zip) и прописать ему путь res\values-v21\ 3. В результате получится следующий вид P.S. В новом файле по сравнению со стандартным добавилась строчка <item name="android:windowTranslucentStatus">true</item>, которая и отвечает за прозрачный статусбар P.P.S. Чтобы определять размер статус бара, все также можно воспользоваться решеним ZuBy - http://blog.rzaripov.kz/2016/12/android-ios.html P.P.P.S. Тестовый проектик - StatusBar.zip
    1 балл
  32. Hevard

    Вышла Delphi 11 Community Edition

    которые не ставятся вместе, в случае Community Edition. Лицензия даётся на один продукт.
    1 балл
  33. Hevard

    Вышла Delphi 11 Community Edition

    Вы не любитель - профессионал мазохизма! Не забудьте, Win x64 должна быть...
    1 балл
  34. Hevard

    Вышла Delphi 11 Community Edition

    Смех-смехом, но Вы единственный в чате с таким траблом.... Моё скромное... не надо было устанавливать ненужные "продукты", потом прописывать пути с этих продуктов... и т.п. (господин "@Krapotkin" даже устал от безумия, которое Вы творите) 1. удаляем 10.4 через Удаление программ 2. От имени Админа запускаем установку. 3. Выбираем х64, Android 4. В Additional выбираем Andriod (меня даже не спросили - куда) накатываем ADB Пишем, компилируем
    1 балл
  35. Hevard

    Вышла Delphi 11 Community Edition

    Это не платформа встала криво, а Вы ее так установили. Просили "пошаговый букварь", я Вам отправил ссылку. Но, видимо, Вам и прочитать не досуг, и ко второй части перейти самостоятельно. Программирование на Delphi. Часть 2. Разработка Android-приложения - Школа программирования ProgTips Я не знаю, где Вы вычитали про какие-то последовательности установок Явы, СДК, и "что-то" ещё. Отмечаете при установке, всё что нужно и все устанавливается автоматически. А как "она устроена" ломать голову не надо, для этого есть специально обученные люди. Вроде как уже всё разжевали несколько раз...
    1 балл
  36. Hevard

    Вышла Delphi 11 Community Edition

    Программирование на Delphi. Часть 1. Установка Delphi Community Edition (бесплатная версия) - Школа программирования ProgTips
    1 балл
  37. krapotkin

    Вышла Delphi 11 Community Edition

    безотносительно SDK. Надеюсь, вы сможете найти на своих дисках свой SDK и ввести путь к нему в SDK base path. Остальное она и так почти все сама подтягивает. Но. Проблема в заголовке вовсе не в SDK. Закрыть Delphi. Ввести в командной строке ado devices и искать свой телефон там https://learn.microsoft.com/ru-ru/dual-screen/android/emulator/adb еще внимательно почитайте тут: https://fire-monkey.ru/topic/7184-android-sdk-с-чем-едят-и-как-бороться/#comment-42318 https://fire-monkey.ru/topic/6431-не-подключается-huawei/#comment-38150
    1 балл
  38. я предлагаю простую игру вместо всех этих (XXX+YYY*Z/12.4) поставить константы и тогда вся отладка будет простой и красивой 50,50 - 100,120 - вырезать 0,0 - 50,70 - вклеить и посмотреть, соответствует ли вашим ожиданиям картинка на 99% ваша ошибка в расчетах координат. что ваши переменные обозначают и чему равны, кроме вас, никто не ведает писать программу, чтобы отладить ваш код, ну какбы совсем лень а свой проект вы не приложили. вот собсно никто и не отвечает
    1 балл
  39. Hevard

    Вышла Delphi 11 Community Edition

    Я обычно "сверху" ставлю UniversalAdbDriverSetup.zip
    1 балл
  40. gonzales

    Push в Delphi11

    Оставлю здесь информацию, как заставить работать пуши при переходе на delphi11. Если Вы заметили, что после перехода на 11 версию у Вас отвалились пуши, система не показывает firebase token, то проблема решается так. 1. Скачиваем JSON с консоли FireBase 2. Открываем его, видим следующий вид 3. Вписываем в Настройках проекта в секцию Services в следующем соответствии: API key - current_key Application id - mobilesdk_app_id Project id - project_id GSM sender id - project_number 4. И не забываем выставить в секцию Entitlement List галочку Receive push notifications. После этого все опять начинает работать.
    1 балл
  41. Используй TNetHTTPClient вместо инди, проблема с ssl уйдет. При использовании инди и указании https в URL например в виндах требуется две дополнительные dll-ки (libeay32.dll / ssleay32.dll), для андроида libcrypto.so / libssl.so и т.д. Поэтому проще перейти на TNetHTTPClient
    1 балл
  42. Dev

    FMX Form

    dnekrasov Спасибо Вам Большое! работает, то что надо
    1 балл
  43. Dev

    FMX Form

    dnekrasov Гигантское Вам спасибо! в FormShow вставил этот код with Screen.WorkAreaRect do Form2.SetBounds(Left, Top, Right - Left, Bottom - Top); и о чудо! Это то что я так долго искал! dnekrasov Спасибо Вам еще раз!
    1 балл
  44. В событии OnResize формы проверять width > height и для каждого из двух вариантов переприсваивать позиции и размеры тех контролов, которые должны меняться.
    1 балл
  45. Ссылка: http://blog.rzaripov.kz/2016/11/0-modernlistview.html Автор: Равиль Зарипов @ZuBy Описание: Знакомство с ModernListView
    1 балл
  46. uses AndroidApi.JNI.Media; procedure MakeSound(ADuration: Integer); var Volume: Integer; StreamType: Integer; ToneType: Integer; ToneGenerator: JToneGenerator; begin Volume := TJToneGenerator.JavaClass.MAX_VOLUME; // задаем громкость StreamType := TJAudioManager.JavaClass.STREAM_ALARM; ToneType := TJToneGenerator.JavaClass.TONE_DTMF_0; // тип звука ToneGenerator := TJToneGenerator.JavaClass.init(StreamType, Volume); ToneGenerator.startTone(ToneType, ADuration); end; Типы звука можно посмотреть здесь
    1 балл
  47. Axbor

    MaskEdit

    // --------------------------------------------------------------------------- #include <fmx.h> #pragma hdrstop #include "Unit1.h" // --------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; // --------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Mask = "+7(00)000-00-00;0;*"; PhoneNumber = ""; } // --------------------------------------------------------------------------- void __fastcall TForm1::edtPhoneTyping(TObject *Sender) { edtPhone->CaretPosition = GetCaretPos(); } // --------------------------------------------------------------------------- int __fastcall TForm1::GetCaretPos() { int i; int Result = 0; for (i = 0; i < Mask.Length(); i++) { if (!(MaskGetCharType(Mask, i) == mcDirective || MaskGetCharType(Mask, i) == mcMask)) Result += 1; if ((Result + PhoneNumber.Length()) == i) break; } Result = Result + PhoneNumber.Length() - 1; return Result; } int __fastcall TForm1::GetMaxLength() { int Result = 0; for (int i = 0; i < Mask.Length(); i++) if (MaskGetCharType(Mask, i) == mcMask) Result = Result + 1; return Result; } void __fastcall TForm1::edtPhoneKeyDown(TObject *Sender, WORD &Key, System::WideChar &KeyChar, TShiftState Shift) { if ((Key == 8) && (PhoneNumber.Length() > 0)) PhoneNumber = PhoneNumber.SubString(1, PhoneNumber.Length() - 1); else if ((PhoneNumber.Length() < GetMaxLength()) && (Key == 0) && IsDigit(KeyChar)) PhoneNumber = PhoneNumber + KeyChar; else KeyChar = 0; } // --------------------------------------------------------------------------- void __fastcall TForm1::edtPhoneKeyUp(TObject *Sender, WORD &Key, System::WideChar &KeyChar, TShiftState Shift) { edtPhone->CaretPosition = GetCaretPos(); } //--------------------------------------------------------------------------- void __fastcall TForm1::edtPhoneValidating(TObject *Sender, UnicodeString &Text) { Text = FormatMaskText(Mask, PhoneNumber); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { edtPhone->Text = FormatMaskText(Mask, PhoneNumber); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <FMX.Controls.hpp> #include <FMX.Forms.hpp> #include <System.MaskUtils.hpp> #include <FMX.Controls.Presentation.hpp> #include <FMX.Edit.hpp> #include <FMX.StdCtrls.hpp> #include <FMX.Types.hpp> #include <System.Character.hpp> #include <string.h> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TEdit *edtPhone; TButton *Button1; void __fastcall edtPhoneTyping(TObject *Sender); void __fastcall edtPhoneKeyDown(TObject *Sender, WORD &Key, System::WideChar &KeyChar, TShiftState Shift); void __fastcall edtPhoneKeyUp(TObject *Sender, WORD &Key, System::WideChar &KeyChar, TShiftState Shift); void __fastcall edtPhoneValidating(TObject *Sender, UnicodeString &Text); void __fastcall FormCreate(TObject *Sender); private: // User declarations public: String PhoneNumber; String Mask; int __fastcall GetCaretPos(); int __fastcall GetMaxLength(); // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif Для тех кому нужен на C++
    1 балл
  48. Подправил вот так (чтобы работало в Delphi 10 Seattle): procedure TFormMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); var FService : IFMXVirtualKeyboardService; begin if Key = vkHardwareBack then begin TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) and (TVirtualKeyBoardState.Visible in FService.VirtualKeyBoardState) then begin // Back button pressed, keyboard visible, so do nothing... end else begin MessageDlg('Закрыть приложение?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo], 0, procedure(const AResult: TModalResult) begin Case AResult of mrYes: FormMain.Close; mrNo: Exit; end; end); Key:=0; end; end; end; Работает нормально, только в диалоге запроса No стоит впереди. Как бы No и Yes поменять местами? А еще лучше заменить на Да и Нет.
    1 балл
  49. Посмотрел на код и решил еще на пару строк сократить, совместил проверку на "пусто" и минус в одном условии procedure TFormMain.Edit1ChangeTracking(Sender: TObject); Var FEdit : TEdit; FFloat : Single; begin If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя Exit; FEdit:=(Sender as TEdit); // Для удобства... FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы if (FEdit.Text.IsEmpty) or (FEdit.Text.Equals('-')) then // Если пусто (ничего не введено или все удалено) или только минус, ничего не делаем Exit; FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно) begin FEdit.Text:='0,'; FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой end; if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище Else FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища end;
    1 балл
  50. если правильно понял вам нужна это: в FireMonkey и в Android свойстве TEdit добавлена FilterChar и выглядит это так: procedure TForm1.FormCreate(Sender: TObject); begin Edit1.FilterChar:= '0123456789'; end;
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...