-
Постов
37 -
Зарегистрирован
-
Посещение
-
Победитель дней
6
Активность репутации
-
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
-
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
-
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
-
Alexey Lovchikov получил реакцию от Brovin Yaroslav в Доработка компонента для чтения штрих-кодов под RAD XE7
Написал небольшой класс по работе с сканером
Проверял на XE7 Update 1 под Android 4.1.2
Пример
Barcode.zip
-
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, программа в начале не была установлена и симптомы были как у тебя, после установки все стало нормально, на многих устройствах эта программа уже предустановлена
-
Alexey Lovchikov получил реакцию от ophion в Доработка компонента для чтения штрих-кодов под RAD XE7
Написал небольшой класс по работе с сканером
Проверял на XE7 Update 1 под Android 4.1.2
Пример
Barcode.zip
-
Alexey Lovchikov получил реакцию от Kitty в Доработка компонента для чтения штрих-кодов под RAD XE7
Написал небольшой класс по работе с сканером
Проверял на XE7 Update 1 под Android 4.1.2
Пример
Barcode.zip
-
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
-
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
-
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
-
Alexey Lovchikov получил реакцию от Kitty в Delphi XE7: Программно проверить root права. [Android]
А почему бы просто не пробовать изменять эти некоторые файлы в try except. В случае вылета ексепшена обрабатывать его и выдавать сообщение вроде "Отсутствуют права доступа на запись в файл так как нет Root прав"
-
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
-
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
-
Alexey Lovchikov получил реакцию от Brovin Yaroslav в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным?
На самом деле все просто, при Edit Default Style, на форме создается StyleBook с стилем EditStyle, который перекрывает стандартный стиль всех TEdit.
Если ты его переименуешь (Свойство StyleName) например в MyStyleEdit, то этот стиль будет только на тех TEdit, где ты его сам установишь. Если ты хочешь поменять стиль конкретно одного элемента, то используй Edit Custom Style, при этом будет создан стиль с именем отличном от имени стиля по умолчанию
Для удаления элемента стиля в StyleBook используй кнопку удаления как показано на скиншоте
-
Alexey Lovchikov получил реакцию от Kitty в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным?
Используй свой стиль TEdit, во вложении пример
Primer.zip
-
Alexey Lovchikov получил реакцию от Brovin Yaroslav в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным?
Используй свой стиль TEdit, во вложении пример
Primer.zip
-
Alexey Lovchikov получил реакцию от UFatueks в [TWebBrowser] Как отловить событие выполнения JavaScript?
Как отловить событие выполнения JavaScript, например событие console.log, чтоб инициировать выполнение delphi логики
Задача заключается в организации взаимодействия delphi кода с TWebBrowser и обратно. Необходимо при нажатии кнопки html страницы выполнять код delphi
-
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-строку в файл -
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 -
Alexey Lovchikov получил реакцию от rareMax в Архитектура приложения под Андроид на основе TFrame
Здравствуйте,
Прочитав тему http://fire-monkey.ru/topic/432-sovety-po-sozdaniiu-mobilnogo-prilozheniia-master-detail/?p=1638 решил переделать свое приложение с использованием Frame, подскажите правильно ли я его делаю
Primer.zip
-
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; -
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
-
Alexey Lovchikov получил реакцию от UFatueks в TWebBrowser теряет Parent при переключении вкладки у TTabControl
Всем привет,
Появилась проблема при работе с TWebBrowser и TTabControl.
Мое приложение состоит из TTabControl с несколькими TTabItem. На одном из табов размещен TWebBrowser который в дальнейшем должен будет отображать html станицу. Переключение между табами делаю через класс TChangeTabAction. Проблема появляется при переключении с любого таб на таб с TWebBrowser и обратно, браузер начинает перекрывать все контролы. Если телефон перевернуть то браузер исчезает. Если кто знает как можно обойти данную проблему подскажите. Может каким нибудь способом заставить перерисовываться окно
Среда: Embarcadero® Delphi XE7 Version 21.0.17707.5020
Во вложении пример программы
Primer.zip
-
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 добавлен хелпер получения ориентации экрана Значительное улучшение читабельности кода и удобства в использовании. -
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); Думаю, что корректно описал - как. Но было бы более точно и правильно, если бы на ваш вопрос ответил непосредственно Ярослав Бровин. Он все-таки более компетентен.