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

Лидеры

  1. OnePeople

    OnePeople

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


    • Баллы

      18

    • Постов

      328


  2. krapotkin

    krapotkin

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


    • Баллы

      17

    • Постов

      2 185


  3. Martifan

    Martifan

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


    • Баллы

      12

    • Постов

      396


  4. Slym

    Slym

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


    • Баллы

      11

    • Постов

      182


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

Показан контент с высокой репутацией за 18.05.2023 в Сообщения

  1. о... да мы меряемся? на 1000: 250-333fps как тебе такое Sulion 10000... fps3.zip
    3 балла
  2. 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 балла
  3. Или просто сделайте borderstyle формы none. И сами сделайте рамки, кнопки закрыть, свернуть и т.д.
    2 балла
  4. Не по теме, но у оператора от таких цветов в конце дня нет желания кого-нибудь убить?
    2 балла
  5. В 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 балла
  6. Когда вы говорите, что приложения на Андроиде весят 400КБ и используют библиотеки Java размером 2ГБ, вы, по-видимому, имеете в виду разницу между размером исполняемого файла приложения и размером всех библиотек, которые оно может использовать во время выполнения. Современные фреймворки, такие как Java для Android или .NET, часто используют большое количество библиотек, которые содержат общий код, используемый многими приложениями. Эти библиотеки обычно устанавливаются один раз и затем используются множеством приложений, поэтому их размер не влияет на размер каждого отдельного приложения. С другой стороны, приложения, созданные с использованием Delphi, обычно компилируются в нативный код и включают в себя все необходимые библиотеки и зависимости. Это может привести к тому, что исполняемые файлы будут больше, чем если бы они использовали общие библиотеки, но они не зависят от установленных библиотек времени выполнения. С точки зрения конечного пользователя, размер приложения часто не является ключевым фактором, особенно с учетом того, что современные устройства имеют большое количество памяти. Однако для разработчиков может быть важно минимизировать размер приложения, чтобы сократить время загрузки и уменьшить использование ресурсов. В итоге, вопрос "маленькие или большие приложения" зависит от контекста и требований конкретного приложения. В некоторых случаях использование общих библиотек может быть выгодно, в других - предпочтительнее иметь самодостаточное приложение с включенными в него всеми необходимыми библиотеками.
    2 балла
  7. что за детский сад на андроиде приложения весят 400К и при этом используют библиотеки Java на 2G это как - маленькие или большие приложения? то же с .NET Приложение с пустой формой тащит за собой весь функционал, который вы можете использовать, при этом не требуя установки дополнительных run-time библиотек, чем, собсн, всегда и хороша была Делфи mp3 файл весит 8-10 мб. а 5 сек видео "опы - 120. Не видел я чтобы кто-то плакал по этому поводу
    2 балла
  8. OnePeople

    миграция на 11.3

    Все проще Target - Android - Libraries -Revert System Files to Default
    2 балла
  9. нет никакой технологии, есть набор Bitmap и рисование этих битмап напрямую на Canvas объем памяти ровно такой, что требуется для хранения этих битмапов. скорость отрисовки - максимальная, потому что кроме отрисовки вы собсно ничего не делаете вообще)
    1 балл
  10. Удобство и универсальность ВСЕГДА противопоставлены быстродействию Бросьте идею использовать компоненты для рисования анимации. Что вы выиграли по сравнению с простым Canvas.DrawBitmap() на PaintBox ?? Ничего. Зато приобрели просто гигантский оверхед в виде ненужной универсальной начинки компонента TBitmap. Потом будут еще проблемы изза того, что не вы сами управляете масштабированием картинки в компоненте. Так игру не написать
    1 балл
  11. А зачем постоянно bringtofront? одного раза не достаточно? там реально медленно... я полагаю нужна глубина сцены? многие ее делают слоями: дальний фон (горы), ближний фон (лес), сцена (персы), и воздух (падающий снег) кидаем 4 лейаута и на них распределяем спрайты
    1 балл
  12. Загружать картинки не в Stream а в битмап сразу source.zip 1000
    1 балл
  13. krapotkin

    Потоки на андроид

    каждый начинающий разработчик всегда пытается сделать из приложения трекер ОС прибьет его в любом случае https://habr.com/ru/companies/broadcast/articles/734236/ https://habr.com/ru/companies/tinkoff/articles/693094/ https://habr.com/ru/companies/cleverpumpkin/articles/681804/
    1 балл
  14. Slym

    Клонирование объекта

    Result := MemStream.ReadComponent(nil);
    1 балл
  15. Tumaso

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

    Сама суть Synchronize в том, чтобы выполнить код в главном потоке
    1 балл
  16. Так у меня его нет) Себе делал callback для поиска количества спутников. Пишите на java callback (GnssStatusCallback.rar) Через codex генерируете jar файл, добавляете его себе в проект в Libraries Пишите объявления методов (Androidapi.JNI.GnssStatusCallback.rar) Создаем класс type TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate) private class var FConnectivityManager: JConnectivityManager; private FCallback: JGnssStatusCallback; protected public procedure onFirstFix(ttffMillis: Integer); cdecl; procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl; procedure onStarted; cdecl; procedure onStopped; cdecl; public constructor Create(); end; constructor TGnnsStatusCallbackDelegate.Create; begin inherited Create; FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self); end; GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create; Androidapi.JNI.GnssStatusCallback.rar GnssStatusCallback.rar
    1 балл
  17. 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 балл
  18. 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 балл
  19. krapotkin

    ProgressBar и потоки

    не понял вопрос. мы работаем в обработчике одного из событий очереди сообщений в главном потоке. событие отрисовки тоже стоит в очереди в главном потоке. закончим обработчик, запустится следующий, произойдет перерисовка.
    1 балл
  20. OnePeople

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

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

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

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

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

    Написал за 5 минут для примера как можно Новая папка.rar
    1 балл
  23. Подведи мышкой к правому краю, курсор поменяется на изменение размеров, зажми левую кнопку мыши и вытащи правую область (которая и есть предпросмотр) влево
    1 балл
  24. vladimi-r

    Bible Verse Desktop

    Bible Verse Desktop - это программа для Windows, которая украсит рабочий стол вашего компьютера цитатами из Библии. Первоначально программа была написана на vcl, но потом переписал ее на firemonkey, так как firemonkey позволяет удобней играть с прозрачностью окна. Подробности на сайте http://vladimirrybant.org/ru/index.php?page=verse Исходники https://github.com/vrybant/Bible-Verse-Desktop
    1 балл
  25. Dmitry_4501

    Удалить файлы отмеченные

    Попробуйте вот так (не самый идеальный вариант, но он работает и ошибок не выдает). procedure TForm1.Button1Click(Sender: TObject); begin var selectedItems: TArray<TListBoxItem>; // Объявляем массив из объектов TListBoxItem for var item: TFMXObject in ListBox1.Children.Items[1].Children do // Перебираем каждый дочерний компонент в ListBox, который является экземпляром класса TListBoxItem. begin if item is TListBoxItem then // Проверяем, является ли item экземпляром класса TListBoxItem if TListBoxItem(item).IsChecked then // Проверяем, является ли элемент отмеченным галочкой begin System.SetLength(selectedItems, System.Length(selectedItems) + 1); // Увеличиваем длину массива selectedItems[High(selectedItems)] := TListBoxItem(item); // Вставляем элемент в массив end; end; DeleteAllCheckedFiles(selectedItems); end; procedure TForm1.DeleteAllCheckedFiles(items: TArray<TListBoxItem>); begin if System.Length(items) < 1 then Exit; for var i: Integer := 0 to System.Length(items) - 1 do begin var item: TListBoxItem := items[i]; if Assigned(item) then begin // TFile.Delete(item.Text); item.Free(); // Освобождаем память, тем самым объект уничтожится и больше не будет находиться в списке элементов TListBox end; end; end;
    1 балл
  26. Оконные сообщения в FMX можно обрабатывать так же как и в VCL. Достаточно в вашу WindowProc добавить это: var Message: TMessage; Message.Msg := uMsg; Message.WParam := wParam; Message.LParam := lParam; Message.Result := 0; frm.Dispatch(Message); Тогда потом можно будет смело написать что-то вроде procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; И оно будет работать.
    1 балл
  27. Подключусь к теме... Как-то пытался сделать подобное и в принципе получилось, безрамочное окно, которое по-нативному работает, что удалось заставить работать: Если взять окно за заголовок и начать двигать им туда-сюда, то все остальные окна свернутся - нативное поведение Если взять окно за заголовок то в Windows 11 появляется верхнее меню с макетами отображения на экране - нативное поведение Если взять окно за заголовок и перетащить его к одному из краев экрана, то появится макет для отображения окна - нативное поведение Нативным образом реализовано изменение размера за все края формы, включая диагональные. Так же окно имеет нативные анимации появления\исчезания, разворачивания\сворачивания Так же имеется нативная тень А на Windows 11 имеются закруглённые края окна Что не получилось: Не получилось реализовать нативное поведение, когда в Windows 11 наводишь курсор на кнопку "развернуть окно", там появляется небольшое меню с макетами отображения на экране. Нормально реализовать границы для изменения размеров окна, ибо из-коробки они находятся за пределами окна в поле где тень у окна (в Windows 10 и Windows 11 так), у меня же они внутри окна. Как-то делал и получалось, но уже не помню. Код несложно адаптировать и под FireMonkey BorderlessWindowWithAeroSnap.zip
    1 балл
  28. Martifan

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

    Скорее всего, увеличение размера исходного кода произошло из-за следующих причин: 1. Разница в размере типов PChar и PAnsiChar. В Delphi 2009 и более поздних версиях PChar был заменен на PAnsiChar для совместимости с Unicode. Размер PAnsiChar в 2 раза больше чем PChar. 2. Автоматическая конвертация строковых литералов в Unicode. В новых версиях Delphi строковые литералы имеют тип UnicodeString вместо AnsiString. Это также увеличивает размер. 3. Добавление префиксов перед строковыми литералами. Для совместимости с Unicode Delphi автоматически добавляет префиксы перед строками, например 'U', 'L', etc. Это тоже увеличивает размер кода. 4. Выравнивание данных. Компилятор может добавлять выравнивание в памяти для некоторых типов, например для PAnsiChar. 5. Другие изменения в формате объектного кода. Например, более длинные имена классов/методов. Таким образом, переход на новые версии Delphi с Unicode поддержкой может привести к значительному увеличению размера исходного кода из-за несовместимости строк, упаковки данных и других факторов. Это нормальное явление, цена прогресса.
    1 балл
  29. К сожалению, в FireMonkey для Windows нет встроенной поддержки для размещения компонентов или рисования на заголовке окна (title bar). Однако, есть несколько возможных вариантов для достижения похожего эффекта: Создать собственный кастомный компонент на основе TControl, который будет перекрывать заголовок окна и имитировать его. Можно нарисовать свой фон, кнопки и т.д. Использовать Windows API функции для настройки и изменения заголовка окна. Например, SetWindowText, SetWindowLong и другие. Это более сложный подход, но дает больше контроля. Рассмотреть сторонние компоненты и библиотеки. Возможно, кто-то уже реализовал похожую функциональность для FireMonkey. Попробовать поместить TControlAboveTarget на TForm и настроить его позицию/размер чтобы перекрывал заголовок. Не идеальный вариант, но может сработать. Так что в целом это возможно реализовать в FireMonkey, но нет встроенного прямого решения как в VCL. Придется поиграться с кастомными компонентами и низкоуровневым API.
    1 балл
  30. Используй константу sLineBreak вместо #10#13 / #10 и всё будет правильно работать и виндах, и на андроиде
    1 балл
  31. Martifan

    Протестировать приложение

    Для тестирования приложения, написанного на Delphi 10.4 для Android, можно использовать различные инструменты и ресурсы. Реальные устройства: Тестирование на реальных устройствах позволяет вам увидеть, как приложение будет работать в реальных условиях. Используйте устройства с различными характеристиками экрана, версиями ОС и производительностью для более обширного тестирования. Эмуляторы Android: Эмуляторы позволяют вам запускать приложения Android на компьютере. Вы можете настроить эмуляторы с различными размерами экрана, разрешениями и плотностью пикселей. Android Studio: Это официальная среда разработки для Android, и она включает в себя эмулятор Android. Вы можете создать различные виртуальные устройства с разными характеристиками для тестирования вашего приложения. Genymotion: Это еще одна популярная среда для эмуляции Android-устройств. Она предлагает некоторые функции, которые могут быть полезны для разработчиков, такие как встроенные инструменты для тестирования GPS и акселерометра. Сервисы облачного тестирования: Если вы не хотите заниматься настройкой эмуляторов или не имеете доступа к множеству реальных устройств, вы можете воспользоваться сервисами облачного тестирования. Firebase Test Lab: Это услуга от Google, которая позволяет вам тестировать ваше приложение на реальных устройствах, хостед в облаке Google. AWS Device Farm: Это услуга от Amazon, которая позволяет вам тестировать и взаимодействовать с вашим Android-приложением на множестве реальных устройств. При тестировании приложения уделите внимание таким аспектам как адаптивный дизайн, работоспособность на различных версиях ОС и корректность работы функционала.
    1 балл
  32. Я вот давно уже делаю все на фреймах... Одно главное окно и кучка фреймов в рамках этого окна, даже ShowMessage - кастомный фрейм, даже некоторые TabItemы с фреймом. есть моменты где глубина вложенности фреймов доходит 4 (Окно, фрейм, вкладки с фреймами, под вкладки , фрейм с диалогом) Анимированную прозрачность фрейма - легко: там есть Opacity, TAnimator.AnimateFloat(Frame,'Opacity',1,1); Окна чуть сложнее... Масштаб - TScaledLayout
    1 балл
  33. Dmitry_4501

    Удалить файлы отмеченные

    Проходишь циклом по всему списку и у каждого элемента проверяешь свойство IsChecked, если оно true, то тогда при помощи TFile.Delete удаляешь файл. Как-то так: procedure DeleteAllCheckedFiles(); begin if ListBox1.Count < 1 then Exit; // Если количество элементов меньше 1, то выходим из процедуры for var I: Integer := 0 to ListBox1.Count - 1 do if ListBox1.ListItems[I].IsChecked then // Проверяем свойство IsChecked (т.е отмечен ли элемент) TFile.Delete(ListBox1.ListItems[I].Text); // Удаляем файл (только в том случае, если в тексте элемента записан путь до файла, иначе придется переделать эту строчку под свои нужды) end; Для TFile.Delete необходимо подключить юнит System.IOUtils
    1 балл
  34. Ваши проблемы с анимацией могут быть связаны с несколькими вещами. Во-первых, стоит отметить, что метод 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 балл
  35. 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 балл
  36. 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 балл
  37. OnePeople

    Компиляция приложения android

    Ну у вас в настройках sdk API-Level location версии 26, а был наверное 29 и выше вот ошибки и небыло
    1 балл
  38. OnePeople

    Иконка приложения

    procedure loadbit; begin if JStringToString(Drawable.getClass.toString) = TJBitmapDrawable.ClassName then begin if (TJBitmapDrawable.Wrap((Drawable.getCurrent as ILocalObject).GetObjectID).getBitmap<>nil) then begin Bitmap := TJBitmapDrawable.Wrap((Drawable.getCurrent as ILocalObject).GetObjectID).getBitmap end else Bitmap:=nil; end else begin bmp:=TJBitmap.JavaClass.createBitmap(Drawable.getIntrinsicWidth, Drawable.getIntrinsicHeight, TJBitmap_Config.JavaClass.ARGB_8888); Canv:= TJCanvas.JavaClass.init(bmp); drawable.setBounds(0, 0, Canv.getWidth(), Canv.getHeight()); drawable.draw(Canv); Bitmap:=bmp; end; end;
    1 балл
  39. Насколько помню по своей возне четырёхлетней давности с тогдашним Rad Studio. Проблема перезаписи БД из Deployment решалась постоянным увеличением версии программы, т.е. перед запуском на тест уcтройстве, надо заходить в настройки проекта и менять Version. Как сейчас обстоят дела - хз.
    1 балл
  40. Используй TNetHTTPClient вместо инди, проблема с ssl уйдет. При использовании инди и указании https в URL например в виндах требуется две дополнительные dll-ки (libeay32.dll / ssleay32.dll), для андроида libcrypto.so / libssl.so и т.д. Поэтому проще перейти на TNetHTTPClient
    1 балл
  41. dnekrasov

    Помогите начать работу с Oracle

    Для того, чтобы это работало нужна FireDACOracleDriver25(6)0.bpl. Не факт что она идёт вместе с Trial (в Community её точно нет).
    1 балл
  42. В событии OnResize формы проверять width > height и для каждого из двух вариантов переприсваивать позиции и размеры тех контролов, которые должны меняться.
    1 балл
  43. 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 балл
  44. 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 балл
  45. Посмотрел на код и решил еще на пару строк сократить, совместил проверку на "пусто" и минус в одном условии 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 балл
  46. Где-то был материал... У меня в блоге есть вот такие статьи: Как создавать обёртки для JAVA-кода Как подключить и использовать свой JAVA-класс Страничка с готовым кодом: JNI Code Snippet и ещё куча примеров использования Android API в самих статьях Кстати, это не вы случаем задали вопрос "Здравствуйте. А есть ли возможность определить текущее положение ползунка громкости?" в блоге? Примерный код: uses Androidapi.JNI.JavaTypes, Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNIBridge; procedure TForm1.Button1Click(Sender: TObject); var AudioObj: JObject; Audio: JAudioManager; CurrentVolume: Integer; begin AudioObj = SharedActivity.getSystemService(TJActivity.JavaClass.AUDIO_SERVICE); Audio := TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); CurrentVolume = Audio.getStreamVolume(TJAudioManager.JavaClass.STREAM_MUSIC); end;
    1 балл
  47. не знаю актуально ещё или нет, но возможно так: http://stringgrid-delphi.ru/delete-row.php Удаление одной строки: процедура: procedure TForm1.DeleteRow(ARow: Integer); var i, j: Integer; begin with StringGrid1 do begin for i:=ARow+1 to RowCount-1 do for j:=0 to ColumnCount-1 do Cells[j, i-1]:=Cells[j, i]; RowCount:=RowCount-1; end; end; вызов процедуры: DeleteRow(номер строки); Удаление всех строк: StringGrid1.RowCount:=0;
    1 балл
  48. Добрый день О том, как получить доступ к любому свойству через StylesData (в том числе к свойству text) частично описано тут: Как получить значение свойства объекта стиля, используя StylesData? Как получить объект стиля? Назначение обработчиков событий для элементов стиля через StylesData Допустим, что TSpinBox в стиле назван (StyleName), как 'spinbox', тогда Присваивание обработчика для SpinBox: ListBoxItem1.StylesData['spinbox.OnChange'] := TValue.From<TNotifyEvent>(SBCountChange); Доступ к свойству Text у TSpinBox: ListBoxItem1.StylesData['spinbox.Text'].ToString; Таким способом можно получить доступ к любому свойству и событию любого элемента стиля.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...