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

Alexey Lovchikov

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

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

  • Посещение

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

    6

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

  1. Thanks
    Alexey Lovchikov получил реакцию от Мирзали Пирмагомедов в Можно ли программно передать фокус на SearchBox и очистить строку?   
    Используй Helper
    uses   FMX.SearchBox; type   TListViewMyHelper = class helper for TListView   public     function SearshBox: TSearchBox;   end; { TListViewMyHelper } function TListViewMyHelper.SearshBox: TSearchBox; var   AIdx: Integer; begin   for AIdx := 0 to Self.ComponentCount - 1 do     if Self.Components[AIdx] is TSearchBox then     begin       Result := TSearchBox(Self.Components[AIdx]);       Break;     end; end; Или просто функцию 
    function SearshBox(AListView: TListView): TSearchBox; var AIdx: Integer; begin for AIdx := 0 to AListView.ComponentCount - 1 do if AListView.Components[AIdx] is TSearchBox then begin Result := TSearchBox(AListView.Components[AIdx]); Break; end; end;  
    Primer.zip
  2. Like
    Alexey Lovchikov получил реакцию от Pax Beach в Можно ли программно передать фокус на SearchBox и очистить строку?   
    Используй Helper
    uses   FMX.SearchBox; type   TListViewMyHelper = class helper for TListView   public     function SearshBox: TSearchBox;   end; { TListViewMyHelper } function TListViewMyHelper.SearshBox: TSearchBox; var   AIdx: Integer; begin   for AIdx := 0 to Self.ComponentCount - 1 do     if Self.Components[AIdx] is TSearchBox then     begin       Result := TSearchBox(Self.Components[AIdx]);       Break;     end; end; Или просто функцию 
    function SearshBox(AListView: TListView): TSearchBox; var AIdx: Integer; begin for AIdx := 0 to AListView.ComponentCount - 1 do if AListView.Components[AIdx] is TSearchBox then begin Result := TSearchBox(AListView.Components[AIdx]); Break; end; end;  
    Primer.zip
  3. 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
  4. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в Доработка компонента для чтения штрих-кодов под RAD XE7   
    Написал небольшой класс по работе с сканером 
     
    Проверял на XE7 Update 1 под Android 4.1.2
     
    Пример

    Barcode.zip
  5. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в Доработка компонента для чтения штрих-кодов под RAD XE7   
    Решение простое, проверь у себя наличия программы https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=ru
    так как мой пример и предыдущий класс использует эту программу для считывания штрихкода
    intent := TJIntent.Create; intent.setAction(StringToJString('com.google.zxing.client.android.SCAN')); SharedActivity.startActivityForResult(intent, 0); Проверял у себя на Android 4.4.2, программа в начале не была установлена и симптомы были как у тебя, после установки все стало нормально, на многих устройствах эта программа уже предустановлена
  6. Like
    Alexey Lovchikov получил реакцию от ophion в Доработка компонента для чтения штрих-кодов под RAD XE7   
    Написал небольшой класс по работе с сканером 
     
    Проверял на XE7 Update 1 под Android 4.1.2
     
    Пример

    Barcode.zip
  7. Like
    Alexey Lovchikov получил реакцию от Kitty в Доработка компонента для чтения штрих-кодов под RAD XE7   
    Написал небольшой класс по работе с сканером 
     
    Проверял на XE7 Update 1 под Android 4.1.2
     
    Пример

    Barcode.zip
  8. Like
    Alexey Lovchikov получил реакцию от Streletz в Помощь новичку   
    Во вложении пример скрещивания VCL и FMX 
     
    Пример работает без установки каких либо других компонентов 
     
    Источники которыми я пользовался для создания примера 
    http://parnassus.co/tfiremonkeycontainer-a-vcl-control-for-mixing-vcl-and-fmx/
    http://firemonkey-container.googlecode.com/svn/trunk/FMXContainer.pas
    https://code.google.com/p/delphisorcery/source/browse/trunk/Source/Windows/DSharp.Windows.FMXAdapter.pas
     
    Пример

    FMXandVCL.zip
  9. Like
    Alexey Lovchikov отреагировална Alexey Lovchikov в Помощь новичку   
    Во вложении пример скрещивания VCL и FMX 
     
    Пример работает без установки каких либо других компонентов 
     
    Источники которыми я пользовался для создания примера 
    http://parnassus.co/tfiremonkeycontainer-a-vcl-control-for-mixing-vcl-and-fmx/
    http://firemonkey-container.googlecode.com/svn/trunk/FMXContainer.pas
    https://code.google.com/p/delphisorcery/source/browse/trunk/Source/Windows/DSharp.Windows.FMXAdapter.pas
     
    Пример

    FMXandVCL.zip
  10. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в Как задать направление линейного градиента?   
    http://docwiki.embarcadero.com/CodeExamples/XE7/en/FMXGradient_(Delphi)
     
    Используй 
        fill.Gradient.StartPosition.Y     fill.Gradient.StartPosition.X     fill.Gradient.StopPosition.X Gradient.zip
  11. Like
    Alexey Lovchikov получил реакцию от Kitty в Delphi XE7: Программно проверить root права. [Android]   
    А почему бы просто не пробовать изменять эти некоторые файлы в try except. В случае вылета ексепшена обрабатывать его и выдавать сообщение вроде "Отсутствуют права доступа на запись в файл так как нет Root прав"
  12. Like
    Alexey Lovchikov получил реакцию от Вячеслав в Как задать направление линейного градиента?   
    http://docwiki.embarcadero.com/CodeExamples/XE7/en/FMXGradient_(Delphi)
     
    Используй 
        fill.Gradient.StartPosition.Y     fill.Gradient.StartPosition.X     fill.Gradient.StopPosition.X Gradient.zip
  13. Like
    Alexey Lovchikov получил реакцию от Kitty в Как задать направление линейного градиента?   
    http://docwiki.embarcadero.com/CodeExamples/XE7/en/FMXGradient_(Delphi)
     
    Используй 
        fill.Gradient.StartPosition.Y     fill.Gradient.StartPosition.X     fill.Gradient.StopPosition.X Gradient.zip
  14. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным?   
    На самом деле все просто, при Edit Default Style, на форме создается StyleBook с стилем EditStyle, который перекрывает стандартный стиль всех TEdit.
     

     
    Если ты его переименуешь (Свойство StyleName) например в MyStyleEdit, то этот стиль будет только на тех TEdit, где ты его сам установишь. Если ты хочешь поменять стиль конкретно одного элемента, то используй Edit Custom Style, при этом будет создан стиль с именем отличном от имени стиля по умолчанию 
     
    Для удаления элемента стиля в StyleBook используй кнопку удаления как показано на скиншоте
     

  15. Like
    Alexey Lovchikov получил реакцию от Kitty в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным?   
    Используй свой стиль TEdit, во вложении пример 
     
     
    Primer.zip
  16. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным?   
    Используй свой стиль TEdit, во вложении пример 
     
     
    Primer.zip
  17. Like
    Alexey Lovchikov получил реакцию от UFatueks в [TWebBrowser] Как отловить событие выполнения JavaScript?   
    Как отловить событие выполнения JavaScript, например событие console.log, чтоб инициировать выполнение delphi логики
    Задача заключается в организации взаимодействия delphi кода с TWebBrowser и обратно. Необходимо при нажатии кнопки html страницы выполнять код delphi
  18. Like
    Alexey Lovchikov отреагировална 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-строку в файл
  19. Like
    Alexey Lovchikov отреагировална Brovin Yaroslav в Включение своих файлов в приложение   
    Добрый вечер,
     
    Тут есть два способа:
    Работа с Deployment менеджером. Он довольно подробно описан на Embarcadero Doc Wiki: http://docwiki.embarcadero.com/RADStudio/XE5/en/Deployment_Manager Работа через менеджер ресурсов и их получение через ResourceStream. Этот способ описал MyDelphiPw в сообщении выше тут. 1. Deployment Manager
    Специальная настройка проекта, которая позволяет указать, какие файлы нужно включить в состав пакета (Андроид) или бандла (iOS). Суть его работы простая, вы указываете какие файлы с вашего компьютера нужно перенести на устройство (в какое место). А далее работаете с ними из приложения так, как при обычной работе с файлами под Windows.
     
    На мобильных платформах нужно учесть специфику возможных местоположений файла. Пакет/Бандл (приложение) не допускает изменения внутренних файлов, потому что подписывается сертификатом. Поэтому теоретически при изменении файлов приложения, вы нарушаете целостность подписи. Именно по этому файлы внутри пакета/бандла доступны только на ЧТЕНИЕ.
     
    Однако, мобильные платформы предлагают широкий круг специальных мест для хранения (временные папки, песочницы, документы, карточка памяти и тд) изменяемых файлов (например файл локальной базы данных, или настройки в ini файле и тд).
     
    Описание всех вариантов местоположений с описанием путей есть в записе TPath (RTL): http://docwiki.embarcadero.com/RADStudio/XE5/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms. 

    Общие действия для использования менеджера развертывания такие:
    1. Открываем менеджер развертывания: Системное Меню -> Project -> Deployment.

    2. Выбираем в верхнем выпадающем меню платформу и конфигурацию сборки.

    3. Нажимаем кнопку добавить файл и выбираем нужный файл.
     
    4. Указываем местоположение файла, куда он должен поместиться после развертывания приложения на устройстве. Тут есть особенность, если файл нужен только на чтение, то пути менять не надо. Если возможна ситуация, когда файл может быт изменен, то файл нужно поместить под iOS в Startup\Documents\ (регистр важен)

    Под Андроид в assets\internal (регистр важен) - для внутреннего доступа из пакета приложения или assets - для внешнего доступа

    5. Получаем пути к расположению файлов:
    Под iOS:
    TPath.Combine(TPath.GetDocumentsPath, 'filename') Под Андроид:
    TPath.Combine(TPath.GetDocumentsPath, 'filename') { Внутренний доступ} TPath.Combine(TPath.GetSharedDocumentsPath, 'filename') { Внешний доступ } Полезные ссылки
    Подробное руководство по добавлению файлов для iOS: http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_iOS_App#Loading_and_Deploying_Files Подробное руководство по добавлению файлов для Android: http://docwiki.embarcadero.com/RADStudio/XE5/en/Creating_an_Android_App#Loading_and_Deploying_Files
  20. Like
    Alexey Lovchikov получил реакцию от rareMax в Архитектура приложения под Андроид на основе TFrame   
    Здравствуйте,
     
    Прочитав тему http://fire-monkey.ru/topic/432-sovety-po-sozdaniiu-mobilnogo-prilozheniia-master-detail/?p=1638 решил переделать свое приложение с использованием Frame, подскажите правильно ли я его делаю
     
    Primer.zip
  21. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в Как получить доступ к наследнику TListBoxItem при вызове события из стиля   
    Ну вот, отвечаю опять на свой вопрос сам.
    procedure TfrJournalQuestionnaire.ClickQuestionnaireEdit(Sender: TObject); function GetItem(AControl: TControl): TQuestionnaireItem; begin while not (AControl.Parent is TQuestionnaireItem) do AControl := TControl(AControl.Parent); Result := TQuestionnaireItem(AControl.Parent); end; begin ShowMessage( GetItem(TControl(Sender)).QuestionnaireId.ToString ); end;
  22. Like
    Alexey Lovchikov получил реакцию от Brovin Yaroslav в Универсальный способ хранения настроек   
    Пример по использованию 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
  23. Like
    Alexey Lovchikov получил реакцию от UFatueks в TWebBrowser теряет Parent при переключении вкладки у TTabControl   
    Всем привет,
     
    Появилась проблема при работе с TWebBrowser и TTabControl. 
     
    Мое приложение состоит из TTabControl с несколькими TTabItem. На одном из табов размещен TWebBrowser который в дальнейшем должен будет отображать html станицу. Переключение между табами делаю через класс TChangeTabAction. Проблема появляется при переключении с любого таб на таб с TWebBrowser и обратно, браузер начинает перекрывать все контролы. Если телефон перевернуть то браузер исчезает. Если кто знает как можно обойти данную проблему подскажите. Может каким нибудь способом заставить перерисовываться окно  
     
    Среда: Embarcadero® Delphi XE7 Version 21.0.17707.5020 
     
    Во вложении пример программы
    Primer.zip
  24. Like
    Alexey Lovchikov отреагировална Brovin Yaroslav в [XE7] [FGX] Описание версии 0.5.0.41   
    Ссылка на скачивание (Только для RAD Studio XE7): fgx_0.5.0.41.zip
    Инструкция по установке: "Инструкция по установке набора компонентов FGX"
    Описание
    Эта версия включает в себя следующий набор компонентов:
    TfgProgressDialog - Компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения фоновой операции можно оценить. TfgActivityDialog - компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения операции не возможно адекватно оценить. TfgActionSheet - Аналог контекстного меню для мобильных платформ. TfgColorsPanel - Палитра цветов с возможностью выбора цвета. TfgGradientEdit - Компонент выбора градиента. TfgLinkedLabel - Метка поддерживающая открытие Web ссылки в браузере по умолчанию. TfgApplicationEvents (NEW)- компонент с возможностью легко задать обработчики на основные события приложения: Отслеживание смены состояния приложения, простой, обновление и выполнение действий Actions, Изменение ориентации устройства и тд. TfgVirtualKeyboard - компонент облегчающий работу с виртуальной клавиатурой. Позволяет задать пользовательские кнопки над виртуальной клавиатурой под iOS, а так же отлавливать события по отображению и скрытию клавиатуры. Зарегистрированы все стилевые объекты на вкладке "FGX: Style objects" Улучшения
    TfgApplicationEvents: Добавлен новый компонент для отслеживания об основных событиях приложения Добавлен пример использования этого компонента TfgActivityDialog, TfgProgressDialog: ​Добавлены события открытия и закрытия диалогов OnShow, OnHide Исправлены утечки памяти на iOS и Android Исправлена ошибка с некорректным отображением на iOS при повороте устройства Общие улучшения на уровне кода Исправлена ошибка с возможностью закрыть диалог кнопкой Back на Андроиде. TfgActionSheet Исправлено не возможность выполнения стандартных действий в TAсtionList TfgLinkedLabel Исправлена ошибка регистрации сервиса, приводящая к фатальным ошибкам в IDE Добавлен пример LinkedLabelDemo TfgColorsPanel Добавлена возможность выбора цвета пользователем. Событие OnColorSelected Общие улучшения Добавлены дополнительные хелперы для iOS и Android Добавлен модуль ассертов для проверки корректности работы компонентов Для Screen добавлен хелпер получения ориентации экрана Значительное улучшение читабельности кода и удобства в использовании.
  25. Like
    Alexey Lovchikov отреагировална AngryOwl в Как программно добавить анимацию к TListBoxItem   
    TListBoxItem(ваш_item).Animate('Opacity', 0, 0.5); TListBoxItem(ваш_item).AnimateWait('Height', 0, 0.5); и только после этого удаляйте.
    Но здесь может возникнуть ряд проблем.
    Во-первых - оптимально делать синхронизацию. Во-вторых - ввиду "ряда особенностей" FMX все может работать на Windows 8, но не будет работать (или будет, но с ошибками) на Windows 7. А на Windows XP вообще может себя повести в "3-ем варианте"... ) Более стабильно будет работать на Маке и на Android ))) Вот такие чудеса могут быть.
     
    Чтобы всего этого избежать, Вам нужно точно определить ту последовательность, которую Вы хотите воспроизвести и сделать синхронизацию.
     
    Например, как писал выше:
    TListBoxItem(ваш_item).Animate('Opacity', 0, 0.5); TListBoxItem(ваш_item).AnimateWait('Height', 0, 0.5); // тогда Animate для 'Opacity' и 'Height' выполнится параллельно // а вот следующая процедура выполнится только после окончания AnimateWait 'Height' TThread.Synchronize(TThread.CurrentThread, тут_ваша_процера_удаления_item); Думаю, что корректно описал - как. Но было бы более точно и правильно, если бы на ваш вопрос ответил непосредственно Ярослав Бровин. Он все-таки более компетентен.
×
×
  • Создать...