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

Евгений Корепов

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

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

  • Посещение

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

    100

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

  1. Like
    Евгений Корепов отреагировална Adm123 в Плавная прокрутка   
    Интересная вышла штука... На том самом пустом проекте если сделать несколько итемов Selectable= false, то начинаются тормоза и скачки, если пытаться проматывать список, "ухватив" его за неSelectable-итем. Если мотать, ухватив за итем с Selectable= true, то все в порядке...
    В рабочем же проекте у меня все итемы не отмечаемые...
     
    Собственно, сделать их отмечаемыми мне ничто не мешает, НО... некрасиво, когда при промотке или нечаянном клике итем выделяется. 
     
    Отсюда следующий вопрос. Можно ли как то подавить визуальный эффнкт выделения итема?
  2. Like
    Евгений Корепов отреагировална Alexey Lovchikov в Универсальный способ хранения настроек   
    Пример по использованию JSON
    uses  System.IOUtils, System.JSON; procedure TForm1.btLoadClick(Sender: TObject); var AOptions: TJSONObject; AGroup: TJSONObject; AParam: TJSONValue; begin if FileExists(FFileName) then begin AOptions := TJSONObject(TJSONObject.ParseJSONValue(TFile.ReadAllText(FFileName))); AGroup := TJSONObject(AOptions.GetValue('group1')); if AGroup <> nil then begin AParam := AGroup.GetValue('edit1'); if AParam <> nil then Edit1.Text := TJSONString(AParam).Value; AParam := AGroup.GetValue('edit2'); if AParam <> nil then Edit2.Text := TJSONNumber(AParam).Value; end; AGroup := TJSONObject(AOptions.GetValue('group2')); if AGroup <> nil then begin AParam := AGroup.GetValue('checkbox1'); if AParam <> nil then CheckBox1.IsChecked := AParam is TJSONTrue; end; end; end; procedure TForm1.btSaveClick(Sender: TObject); var AOptions: TJSONObject; AGroup: TJSONObject; AParam: TJSONValue; APair: TJSONPair; begin AOptions := TJSONObject.Create; AGroup := TJSONObject.Create; AGroup.AddPair('edit1', Edit1.Text); if Edit2.Text.Trim <> '' then AGroup.AddPair('edit2', TJSONNumber.Create(Edit2.Text)); AOptions.AddPair('group1', AGroup); AGroup := TJSONObject.Create; if CheckBox1.IsChecked then AGroup.AddPair('checkbox1', TJSONTrue.Create) else AGroup.AddPair('checkbox1', TJSONFalse.Create); AOptions.AddPair('group2', AGroup); TFile.WriteAllText(FFileName, AOptions.ToString); end; procedure TForm1.FormCreate(Sender: TObject); begin {$IFDEF ANDROID} //Если файл во внутреннем накопителе то GetDocumentsPath //Если файл на внешнем накопителе то GetSharedDocumentsPath FFileName := TPath.Combine(TPath.GetSharedDocumentsPath, 'Options.json'); {$ENDIF} {$IFDEF MSWINDOWS} FFileName := ExtractFilePath(ParamStr(0)) + 'Options.json'; {$ENDIF} end; Также почитай http://www.webdelphi.ru/2011/10/rabota-s-json-v-delphi-2010-xe2/
    Primer.zip
  3. Like
    Евгений Корепов отреагировална ruslan в Универсальный способ хранения настроек   
    юзай Rest.Json.
     
    пишешь свой класс настроек, например:
    TSettings = class   private      fname: string;     fpass : string;   public     property name: string read fname write fname;     property pass: string read fass write fpass; end; // вытягиваешь json-строку из файла Settings:= TJson.JsonToObject<TSettings >( 'строка с json, которая из файла' ); // что-то поменял s:= TJson.ObjectToJsonString( Settings ); // сохранил json-строку в файл
  4. Like
    Евгений Корепов отреагировална brunnengi в [Android] Как убрать "Вставить" и подчеркивание при фокусе?   
    Дело в том что во всей системе "Вставить" появляется только после некоторого удержания пальцем в области ввода. И только в приложении на FMX он выскакивает сразу.
    CheckSpelling не исправил ситуацию (((
     
    Update 1:
    После перезагрузки телефона (я его просто очень редко перезагружаю его  ибо пашет отлично) подчеркивание вернулось во всех остальных приложениях. Значит оно так и должно быть.
    Но вот что касается "Вставить", а оно все равно выскакивает слишком быстро. Так то что бы оно появилось в других приложениях надо поддержать малость. А тут в приложении на FMX он практически моментально выскакивает.
     
    У меня Андроид 4.4.2 
    Телефон Samsung Note 3
  5. Like
    Евгений Корепов отреагировална estra в Цифровая клавиатура при нажатии кнопки.   
    А как вы скрываете TEdit? Если Edit1.Visible = False, то в данном случае такой вариант не годится (для текстового поля с Visible = False клавиатура появляться не будет). В вашем случае надо делать так: Edit1.Visible = True, Edit1.Opacity = 0. Тогда для кнопки пишем такой код:
    procedure TForm1.Button1Click(Sender: TObject); begin Edit1.SetFocus; end; и получаем желаемый эффект.
  6. Like
    Евгений Корепов отреагировална Nix0N в [Windows] Запуск программы с запросом прав администратора   
    1. Создаем текстовый файл и меняем расширение на manifest (название_файла.manifest), примерно с таким содержанием:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly> 2. В IDE идем по пути Project -> Options -> Application -> RunTime Themes -> Use custom manifest и указываем путь до нашего файла манифеста.
     
    Все готово ! 
     
    P.S. Делайте это в последнюю очередь при завершении проекта, иначе не удобно отлаживать программу: приходится собирать программу в IDE, а запускать отдельно из файлового менеджера. Когда попробуете - сами узнаете почему ) Или же временно, на момент разработки, установить использование стандартного манифеста.
     
    P.S.S. в файле-манифесте так же указывается разрядность приложения win32 или win64 и т.д. Не составит проблемы почитать об этом в сети.
  7. Like
    Евгений Корепов отреагировална Kitty в Нужна книга   
    Добрый день.
    Можно и курсы, но опыт показывает, что это все же не так эффективно. Вон Эмбаркадеро сколько видео курсов проводит, а стоны со всех сторон – дайте манул, дайте справку…
    Думаю работа в фоновом режиме над мануалом будет также хорошим решением.
    А чтобы хотелось иметь первым делом:

    Очень бы хотелось иметь мощный мануал страниц минимум на 300 по созданию приложений для платформы Андроид с помощью библиотеки FMX. iOS тоже важен, но начать логичнее все же с платформы, которая распространена гораздо шире.
    Хотелось бы освещение таких вопросов:
    1. Особенности использования FMX исходя из особенностей и требований ОС Андроид.
    2. Правильная разработка интерфейсов исходя из платформы Андроид. Детальное рассмотрение компонентов TListView, TListBox, TMultiView при создании интерфейса программы. Работа с этими компонентами в десигн и рантайм. Правильный подход при создании многооконного приложения в Андроид, использование фреймов. Обработка ошибок.
    3. Взаимодействие с Java и API (Androidapi::Jni…).
    4. Работа со стилями.
    5. Андроид  и локальная база данных. Андроид и удаленная база данных (DataSnap).
    6. Примеры решения типовых задач (работа с видео и т.д.).
    7. Наметки использования FMX для решения реальных корпоративных задач. Показать первые шаги и правильный подход для решения таких, например, реальных задач как:
    а) кладовщик на складе через планшет вводит данные в центральную базу данных и имеет доступ  к актуальным данным компании.
    б) таксист, сидя в машине на своем планшете с Андроид имеет полную информацию о заказах и очереди.
    в) отслеживание на карте Google перемещения дальнобойных машин. Координаты присылает Андроид устройство из кабины водителя или по таймеру или по запросу из офиса.
    Все это большие и объемные задачи – просто показать скелет правильного подхода решения реальных задач на платформе Андроид с помощью FMX. Или придумать свои корпоративные задачи для мануала.
    Считаю FMX отличным выборам для решения именно корпоративных задач компании.
    8. Обязательно дублировать код с Паскаля на С++.
    По поводу пункта номер 8. Вот мой реальный опыт с FMX:
    В С++ Builder XE6 создала приложение для корпоративного использования. Вопрос уперся в воспроизведение и остановке видео. Стандартный fmx плеер не работает на некоторых из Андроид устройств. Помогли на этом форуме рекомендацией использовать этот pas файл и МХ плеер: http://blog.csdn.net/flcop/article/details/17190009
    Однако после подключения этого файла в С++ Builder сыпались AV. Никто уже не мог помочь, ни один форум ни одна справка, даже автор японец pas файла не знал в чем дело. И вот когда я уже была близка к присоединению к армии тех, кто ненавидит FMX, на одном из форумов промелькнул тайваньский товарищ, который сказал добавить в pas файл такой код:
    procedure RegisterTypes;
    begin
    TRegTypes.RegisterType('Androidapi.JNI.ActivityManager.JDebug_MemoryInfo', TypeInfo(Androidapi.JNI.ActivityManager.JDebug_MemoryInfo));
    end;
    и все сразу заработало. Сейчас у японца полностью правильный pas файл и для С++.
    Этот простой пример говорит о том, что если есть проверенный рабочий код для Дельфи, то это не факт, что все будет работать и в С++.
    Дублирование правильного кода [паскаль-с++] сделает манул всесторонним и всеобъемлющим. Армия С++ наконец-то безболезненно присоединится к паскалистам и это хорошо для Эмбаркадеро.
    Понятно, что у меня большой аппетит для такого мануала, но наличие такого манула это огромный шаг вперед для FMX. И не смотря на то, что он будет ориентирован на Андроид, он во много закроет многие другие вопросы, связанные с FMX для других платформ. Выпуск такого мануала (или бумажной книги) важен и жизненно необходим.

     
  8. Like
    Евгений Корепов получил реакцию от Равиль Зарипов (ZuBy) в [Android] Как отключить программную кнопку Меню?   
    Ура! "screenSize" в сочетании с android:minSdkVersion="9" android:targetSdkVersion="14" помогло! Все работает отлично. Всем огромное спасибо. Привожу измененных темплейт манифеста, вдруг кому пригодится.
    <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14" /> <%uses-permission%> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:installLocation="%installLocation%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" /> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  9. Like
    Евгений Корепов получил реакцию от Kitty в [Android] Как отключить программную кнопку Меню?   
    Ура! "screenSize" в сочетании с android:minSdkVersion="9" android:targetSdkVersion="14" помогло! Все работает отлично. Всем огромное спасибо. Привожу измененных темплейт манифеста, вдруг кому пригодится.
    <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14" /> <%uses-permission%> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:installLocation="%installLocation%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" /> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  10. Like
    Евгений Корепов отреагировална Yarpda в [Android] Как отключить программную кнопку Меню?   
    Вот решение из StackOverflow:
    Сам не пробовал, но судя по тексту должно помочь.
  11. Like
    Евгений Корепов отреагировална Brovin Yaroslav в [Android] Как отключить программную кнопку Меню?   
    Добрый день,
     
    Эта кнопка считается устаревшей в версиях андроида начиная с 14 (Ice Cream). Система читает ваш манифест и смотрит на MinSdkLevel. Если он меньше 14, то она пытается сэмулировать (Lolipop) и добавить эту кнопку. 
     
    Чтобы ее убрать, нужно поднять нижнюю границу или таргет версию до 14 в манифесте:

    <android xmlns:android="http://schemas.android.com/apk/res/android"> <tool-api-level>14</tool-api-level> <manifest> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/> </manifest> </android> В вашем приложении:Открываете файл AndroidManifest.template.xml. Он лежит в папке с вашим проектным файлом (появляется при первой попытке компиляции на Андроид) Меняем значения в теге uses-sdkБыло:

    <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> Стало:
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" /> Собираем приложение. Теперь кнопка меню пропадет на новых версиях Андроида.Чтобы при повороте приложение не вылетало на версиях среды до XE8 включительно дополнительно нужно добавить в манифест.
    Начиная с XE10 правок вносить не надо.
    Было:

    <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden" android:launchMode="singleTask"> Стало:
    <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask">
  12. Like
    Евгений Корепов отреагировална Andrey Efimov в Как узнать версию приложения под Android?   
    Например, вот так:
    {for Delphi XE6/XE7: Add to "uses" module "Androidapi.Helpers"} uses   Androidapi.JNI.JavaTypes, FMX.Helpers.Android,   Androidapi.JNI.GraphicsContentViewText; var   PackageManager: JPackageManager;   VersionPackage,PackageName: JString; begin   PackageManager := SharedActivity.getPackageManager;   PackageName := SharedActivityContext.getPackageName;       VersionPackage := PackageManager.getPackageInfo(PackageName, 0).versionName;   Label1.Text := JStringToString(VersionPackage); p.s. Для подобных вопросов, у меня в блоге есть страничка "JNI Code Snippet"
  13. Like
    Евгений Корепов отреагировална Nix0N в [Windows] TnTRayIcon не визуальный компонент обеспечивающий управление значком в области System Tray   
    Рад что Вы разобрались =)
     
    P.S. если Вы модифицировали исходник, то можете добавить процедуры для Show и Hide:
    ShowWindow(ApplicationHWND, SW_HIDE); // cкрыть из таскбар ShowWindow(ApplicationHWND, SW_SHOW); // показать в таскбар
  14. Like
    Евгений Корепов отреагировална Brovin Yaroslav в [Android] Преобразование HEX строки в String   
    Чтобы всегда работать со строками, как с 0-основными на всех платформах, достаточно использовать TStringHelper.
    Для этого нужно:
    Подключить юнит: System.SysUtils. Использовать хелпер: Chars function TForm1.HexToStr2(const Source: string): string; var i, idx: Cardinal; StrAsBytes: TBytes; begin SetLength(StrAsBytes, Length(source) div 2); i := 0; idx := 0; while i <= length(source) - 1 do begin StrAsBytes[idx] := StrToInt('$' + Source.Chars[i] + Source.Chars[i + 1]); i := i + 2; idx := idx + 1; end; result := TEncoding.ANSI.GetString(StrAsBytes); end;
  15. Like
    Евгений Корепов отреагировална Brovin Yaroslav в При попытке сохранить фотографию на устройство у меня возникает ошибка.   
    Как сказал, Андрей, вы все правильно поняли. Я дополню ответ.
    Все известные пути можно получить через System.IOUtils.TPath. Подробно о путях описано тут: Standard RTL Path Functions across the Supported Target Platforms Не во все места на устройстве разрешается осуществлять запись. Это нужно иметь в виду, если файл не сможет сохраниться из-за недостатка прав на запись.
  16. Like
    Евгений Корепов отреагировална Brovin Yaroslav в AppFactory и AppProducts. Конструирование приложений на телефоне   
    Автор: Павел Литвинко
    Обзорная статья: http://blogs.embarcadero.com/vsevolodleonov/2014/01/31/appfactory1/ Видео обзор (Rus):  http://www.youtube.com/watch?v=6Tahytk_QUM Видео обзор (En):  http://www.youtube.com/watch?v=xVUhMAJquw8 Ссылки на приложения: AppFactory, AppProducts    
  17. Like
    Евгений Корепов отреагировална Brovin Yaroslav в Как скопировать текст в буфер обмена?   
    Запрашиваете сервис IFMXClipBoardService. У него есть два метода для копирования данных любого типа в буфер и обратно.
    uses FMX.Platform, System.Rtti; {$R *.fmx} procedure TForm13.Button1Click(Sender: TObject); var Service: IFMXClipBoardService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXClipBoardService, Service) then begin Service.SetClipboard(TValue.From<string>('My Text')); // Service.GetClipboard.AsString // Получения строкового значения обратно. end; end;
  18. Like
    Евгений Корепов отреагировална Brovin Yaroslav в Сообщения чата в виде сообщений в iphone.   
    Добрый день,
    Я бы взял TScrollBox для контейнера сообщений. Каждое сообщени представил в виде TLabel с вашим стилем в виде облаков TLabel поместил в TLayout и внутри него выравнивал бы по правому или левому краю. А сами TLayout выравнивал бы по верху.
×
×
  • Создать...