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

Brovin Yaroslav

Администраторы
  • Постов

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

  • Посещение

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

    390

Ответы сообщества

  1. Пост Brovin Yaroslav - сообщение в [Android] Как поменять цвет выделенного итема в ListBox для андроид стиля? был отмечен как ответ   
    Стиль для андроида растровый, а это значит, что все элементы листбокса хранятся в растровом изображении. Поэтому для корректировки цвета выделенного итема, нужно править исходное растровое изображение частей элементов контролов.
     
    Рецепт
    1. Открываем Bitmap Style Designer и создаем стиль по умолчанию (темный или светлый) для платформы Андроид.
    2. В дереве разворачиваем узел Images и выполняем экспорт всех графических ресурсов. 

    3. Затем в любом графическом редакторе правим растровые исходники (для всех вариантов скейла экранов) фона TListBoxItem. Я поменял его на светло голубой. На картинке указано его местоположение:

    4. Возвращаемся в Bitmap Style Designer и обновляем каждый исходник (style.png, style20x.png, style15x.png, style30x.png). Для обновления, выделяем картинку в дереве, жмем кнопку Update и указываем новое изображение.

    5. После этого сохраняем полученный стиль: File->Save as...->Выбираем тип файла "FireMonkey Style".
    6. Кидаем на форму стиль бук, подключаем к форме и грузим туда наш кастомный стиль.
     
    Результат
    На скриншоте ниже показан Листбокс с выделенным итемом голубого цвета (Было, Стало):

  2. Пост Brovin Yaroslav - сообщение в У меня не получается собрать приложение с потоками на C++ Builder под Андроид был отмечен как ответ   
    Дело в том, что класс TThread является частью библиотеки RTL и не зависит от VCL никаким способом. Поэтому, это сообщение может появится из-за ошибочного подключения файлов VCL. Так же RTL полностью кроссплатформенна. Поэтому работа с классом TThread одинакова для всех платформ. Резюме
    Нужно проверить все файлы проекта и убедиться, что они не используют файлы VCL.
     
    А именно Unit2.cpp, поскольку речь в сообщение об ошибке идет именно об этом модуле.
     
    Проверил на чистом проекте, описанное вами поведение в RAD Studio XE6 Beta, не обнаружил.
  3. Пост Brovin Yaroslav - сообщение в Правда ли, что на мобильных платформах Delphi работает с 0-основными строками? был отмечен как ответ   
    Прикол в том, что на мобильных платформах строки 0-основные. А вы работает с 1-основной.
     
    0-основная - индексация строки начинается с 0, а не с 1.
     
    Документация
    Страница: UnicodeString
     
    P.S. На будущее, потрудитесь оформить код согласно стандартам. Читать не возможно. 
  4. Пост Brovin Yaroslav - сообщение в Почему не добавляется иконка в TListBoxItem на платформе Windows? был отмечен как ответ   
    По умолчанию картинка доступна только для элементов списка типа TMetropolistUIListBoxItem. Стиль для обычного элемента TListBoxItem для Windows не поддерживает картинки в стиле. Однако, чтобы добавить картинку, нужно просто добавить в стиль итема объект TImage с названием StyleName = 'icon'.
  5. Пост Brovin Yaroslav - сообщение в Почему у меня при создании TListBoxItem в рантайме и включенной опции переноса слов WordWrap, слова не переносятся, а в дизайн тайме - переносятся? был отмечен как ответ   
    Чтобы в рантайме (runtime) работал перенос, нужно просто сбросить настройку:
    ListBoxItem.StyledSettings := ListBoxItem.StyledSettings - [TStyledSetting.ssOther]; В дизайн тайме, при установке свойства WordWrap y TListBoxItem, автоматически сбрасывается опция TStyledSettings.ssOther у StyledSettings, которая означает, что настройки переноса нужно брать из контрола, а не из стиля. В рантайме - нет.    Свойство TListBoxItem.StyledSettings отвечает за то, какие настройки брать из стиля, а какие из самого контрола. Так отсутствие значения ssOther говорит о том, что значение варианта переноса будет браться из контрола, а не из стиля.    Обратите внимание еще на тему: Почему не изменяется Font.Style и Font.Size?
  6. Пост Brovin Yaroslav - сообщение в Как открыть PDF в стандартном приложении просмотра PDF файлов? был отмечен как ответ   
    Открытие любого файла в подходящем приложении в операционной системе Андроид выполняются одинаковым способом.
    Путем посылки намерения (Интент) с указанием файла и типа данных. Далее система ищет по указанному типу файла, какие приложения зарегистрированы на обработку файлов этого типа, Если приложение, которое может обработать этот файл, одно, то запускает активити приложения и передает туда ваш файл/данные. Если приложений несколько - запускает диалоговое окно выбора приложения, которое будет выполнять обработку вашего файла. Резюмируя это, смотрим на код:
    uses System.IOUtils, FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText; procedure TForm7.btnOpenPDFClick(Sender: TObject); const SAMPLE_PDF_FILENAME = 'example.pdf'; var Uri: Jnet_Uri; OpenLinkIntent: JIntent; PDFFileName: string; begin PDFFileName := TPath.Combine(TPath.GetDocumentsPath, SAMPLE_PDF_FILENAME); { Внутренний доступ} Uri := StrToJURI(PDFFileName); // Формируем намерение об открытии файла в стандартном приложении OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); // Устанавливаем тип данных OpenLinkIntent.setType(StringToJString('application/pdf')); OpenLinkIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP); // Запускаем приложение и передаем ему наше намерение try SharedActivity.startActivity(OpenLinkIntent); except on E: Exception do ShowMessage('Не удалось открыть PDF. В системе нет доступных приложения для просмотра pdf'); end; end; В этом код pdf файл берется из самого пакета приложения (я включил pdf файл в пакет приложения).
    Если вам нужно вытащить файл в любом другом месте, просто укажите в PDFFileName полный путь к файлу в файловой системе вашего устройства.
     
    Проект доступен тут: OpenPDF.zip
  7. Пост Brovin Yaroslav - сообщение в Предупреждение об отсутствии dSYM файла при финальной сборке iOS приложения. В чем причина? был отмечен как ответ   
    Это предупреждение и оно не влияет на запуск приложения dSYM - это файл с отладочными символами. Он нужен для выполнения отладки вашего приложения. Чтобы вы могли видеть не просто набор адресов, а понятные названия методов и тд. dSYM файл повышает размер вашего приложения. В Release отладка не нужна, поэтому этот файл не генерируется. Если очень нужно, в настройках проекта можно включить генерацию этого файла: Project -> Options... -> Delphi Compiler -> Linking. Ставим галку напротив Debug Information
  8. Пост Brovin Yaroslav - сообщение в Как указать минимальное поддерживаемое устройство? был отмечен как ответ   
    Такого понятия, как "минимально поддерживаемое устройство" Apple еще не придумало. Но додумалось до указания требуемой минимальной версии iOS.
     
    Вся информация о параметрах запуска пакета есть тут.
  9. Пост Brovin Yaroslav - сообщение в Доступны ли операции Drag and Drop на мобильных платформах? был отмечен как ответ   
    Добрый день,
     
    На мобильных платформах Drag/Drop не реализован.

    За его реализацию отвечает сервис IFMXDragDropService. Если вы его реализуете для мобильных платформ, то Drag and Drop будет работать.
  10. Пост Brovin Yaroslav - сообщение в Как поделиться текстом и изображением в Твиттере и Фейсбуке? был отмечен как ответ   
    Исходный код примера для RAD Studio XE5: ShareSheet
    Описание: Taking and Sharing a Picture (iOS and Android)
     
    В FireMonkey реализованы стандартные действия для выполнения автоматической отправки данных другим приложениям телефона.
    Например, такие как:
    Отправка поста в Twitter или FaceBook Отправка письма Отправка SMS и другие Чтобы воспользоваться этой функцией в FireMonkey создано специальное стандартное действие TShowShareSheetAction, которое открывает стандартное системное окно выбора действия (постинг в Twitter или Facebook и тд). 
     
    1. Кидаем на форму TActionList.
    2. Двойным кликом на компонент TActionList, открываем дизайнер действий.
    3. В левом верхнем углу выбираем создание стандартного действия

    4. Среди стандартных действий выбираем в группе "Media Library" действие TShowShareSheetAction.

    5. Для созданного действия указываем текст сообщения или изображение (можно указывать как по отдельности эти данные, так и по частям). В зависимости от указанных данных (текст и изображение) действие откроет системное окно выбора действий приложений, которые могут обработать ваши данные. На картинке ниже, я указал текст сообщения и картинку через свойства TextMessage и Bitmap:

    6. Подвязываем созданное действие к любой кнопке.

    7. На ios и андроид нажатие на кнопку с действием приведет к отображению окна выбора действия:

     
    Подробный о том, как пользоваться этой функцией продемонстрирован в этом видео:

  11. Пост Brovin Yaroslav - сообщение в Работа с эмулятором BlueStacks из RAD Studio XE5 был отмечен как ответ   
    Подключение
    Скачиваем эмулятор с официального сайта для Windows или OSX Устанавливаем эмулятор Перезагружаем компьютер (сразу после установки, у меня среда не захотела увидеть этот эмулятор) Запускаем эмулятор идем в настройки и разрешаем отладку. Жмем на кнопку All Apps -> Настройки -> Для разработчиков -> Отладка по USB. После запуска RAD Studio XE5, эмулятор появится в списке доступных устройств. У него замысловатое название "emulator-5554 (5554)" или производное от этого. Далее идет обычная работа, как с любым андроид устройством в RAD Studio XE5. Выбираем устройство в списке в Project Manager и запускаем проект (обязательно прочесть Резюме, так как наблюдаются некоторые проблемы с этим эмулятором).
     
    Резюме
    Проект находится на стадии бетта версии, поэтому ожидать от него 100% работоспособности я бы не стал.
    Работает быстрее, чем официальный эмулятор от Google.  Запуск из среды проходит. Но отладка у меня не заработала. Иногда приложение не запускается из среды. Помогает перезагрузка эмулятора. Или старт вашего приложения вручную с эмулятора (так как приложение обычно устанавливается) Работает даже сервис получения фотографий с системной галереи. Контролы работают, и реагируют на нажатия. Текст вводится и тд. Наблюдаются некоторые проблемы с использованием физической клавиатуры в эмуляторе. Но виртуальная работает хорошо. Поэтому в критичных местах, где была нужна английская раскладка пользовался виртуальной клавиатурой самого эмулятора.
  12. Пост Brovin Yaroslav - сообщение в Как использовать нестандартный шрифт? был отмечен как ответ   
    Решение опубликовано здесь для Android.
  13. Пост Brovin Yaroslav - сообщение в Можно ли использовать VCL компоненты в FMX? был отмечен как ответ   
    Визуальные контролы VCL будут работать только на одной платформе - Win32 и Win64. 
    Так же TRadioGroup и TCheckListBox проще написать самостоятельно в FireMonkey, поскольку встраивание VCL компонентов в FMX очень сложная задача, так как архитектура и природа библиотек на столько различная, что соединить их вместе будет очень сложно, но возможно только при очень глубоком понимании архитектуры FMX.
     
    Резюме: Эту затею лучше сразу бросить, и просто реализовать два новых компонента TRadioGroup и TCheckListBox. Это будет и проще, и удобнее, а так же хорошая наработка для других работ.
  14. Пост Brovin Yaroslav - сообщение в Как сделать свой шрифт? был отмечен как ответ   
    Шрифт - это не просто набор картинок, это набор правил по отображению букв, цифр. В большинстве случае векторный. Поэтому просто так волшебным дуновением ваши картинки не превратятся в файл векторного шрифта.
     
    Поэтому, если вы хотите решение именно через шрифт, то вам стоит поискать по интернету статьи на тему созданию своих шрифтов.
  15. Пост Brovin Yaroslav - сообщение в Как увеличить быстродействие эмулятора андроид? был отмечен как ответ   
    Попробуйте воспользоваться рекомендациями из этой статьи: Как ускорить эмулятор Android на 400% (Habrahabr)
  16. Пост Brovin Yaroslav - сообщение в Отключение автоблокировки дисплея был отмечен как ответ   
    У объекта приложения iOS есть опция, которая отвечает за отключение таймера блокировки экрана idleTimerDisabled
    uses FMX.Helpers.iOS; // Отключаем таймер автоблокировки SharedApplication.setIdleTimerDisabled(True);
  17. Пост Brovin Yaroslav - сообщение в Как создать заставку для андроид приложения? был отмечен как ответ   
    Читаем пост Андрея Ефимова (Infocean): Добавляем Splash Screen в приложение для Android
     
    Видео, демонстрирующее результат:

  18. Пост Brovin Yaroslav - сообщение в Можно ли перенести проект из Delphi в XCode? был отмечен как ответ   
    Чтобы ответить самостоятельно на этот вопрос, нужно понимать следующие факты:
    XCode - среда разработки программного обеспечения под OSX и iOS (Wiki). XCode позволяет использовать разные компиляторы в том числе компиляторы известного проекта FreePascal под Delphi.  ARM компилятор Delphi доступен только для Win32/Win64 платформы. Язык Delphi можно использовать в XCode, но только в совокупности с компилятором от FreePascal. Кстати, такой вариант был и успешно работал в RAD Studio XE2, поскольку на тот момент Embarcadero еще не имела собственного компилятора под ARM. FreePascal имеет свой набор библиотек, и не смотря на то, что есть общие интерфейсы с Delphi, ваш код вряд ли будет совместим с библиотеками от FreePascal. Не смотря на то, что можно использовать компилятор от FreePascal, вряд ли удастся за адекватное время перевести FireMonkey на использование библиотек от FreePascal. Так как после появления собственного ARM компилятора из FireMonkey была убрана поддержка FreePascal. Отсюда можно посчитать, что для небольшого проекта, эта затея гиблая и частично бессмысленная. Так как сборка одного и того же кода разными компиляторами вряд ли радикально улучшит качество кода проекта.
     
    Если же речь идет о переписи исходников проекта с Delphi на Objective C, то вам следует вначале изучить язык Objective C и затем переписывать весь проект на него.
  19. Пост Brovin Yaroslav - сообщение в Как указать цвет по RGB? был отмечен как ответ   
    Например так для RGB:
    var Color: TColor; begin TColorRec(Color).R := 123; TColorRec(Color).G := 113; TColorRec(Color).B := 13; Rectangle1.Fill.Color := Color; end; Или так для ARGB:
    var Color: TAlphaColor; begin TAlphaColorRec(Color).R := 123; TAlphaColorRec(Color).G := 113; TAlphaColorRec(Color).B := 13; TAlphaColorRec(Color).A := 126; Rectangle1.Fill.Color := Color; end; Update 1 (2014.06.25): В RAD Studio XE6 появился более удобный способ через использование конструктора типа TAlphaColorF:
    uses System.UITypes; var Color: TAlphaColor begin Color := TAlphaColorF.Create(123 / 255, 113 / 255, 13 / 255, 126 / 255).ToAlphaColor; end;
  20. Пост Brovin Yaroslav - сообщение в Как массово задать размер шрифта у всех контролов? был отмечен как ответ   
    Добрый день,
     
    В RAD Studio XE5 для поддержки возможности массово менять настройки текста для любых контролов был введен специальный интерфейс ITextSettings. Каждый контрол, который поддерживает настройку параметров текста, реализует этот интерфейс. Поэтому, чтобы массово поменять настройки текста можно использовать, например, следующий код (Delphi, он легко переводится на C++). Этот код Для всех наследников, которые не используют размер шрифта из стиля, задает размер шрифта:
    var Settings: ITextSettings; Instance: TComponent; I: Integer; begin for I := 0 to ChildrenCount - 1 do begin Instance := Children[I]; if IInterface(Instance).QueryInterface(ITextSettings, Settings) = S_OK then begin // using ITextSettings methods and properties: // TextSettings: TTextSettings, // DefaultTextSettings, // StyledSettings // to change properties of text objects Settings.TextSettings.BeginUpdate; try Settings.TextSettings.Font.Size := 18; if TStyledSetting.ssSize in Settings.StyledSettings then Settings.StyledSettings := Settings.StyledSettings - [TStyledSetting.ssSize] // show Font.Size := 18 else Settings.StyledSettings := Settings.StyledSettings + [TStyledSetting.ssSize]; // restore showing Font.Size loaded from a style finally Settings.TextSettings.EndUpdate; end; end; end; end;
  21. Пост Brovin Yaroslav - сообщение в Как определить положение картинки в TListBoxItem? был отмечен как ответ   
    Добрый день,
    В событии MouseDown у TListBoxItem ищем в стиле итема объект изображения. Для итема картинка имеет название 'icon'. Определяем координаты мыши в координатах формы (Абсолютные координаты). На случай отступов и произвольного размещения изображения. Конвертируем абсолютные координаты в локальные координаты изображения. Если картинка содержит координаты мыши, значит нажали на картинку. Delphi:
    procedure TForm6.ListBoxItem1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var Item: TListBoxItem; StyleObject: TFmxObject; StyleIcon: TControl; LocalMousePos: TPointF; AbsoluteMousePos: TPointF; begin if Sender is TListBoxItem then begin Item := TListBoxItem(Sender); LocalMousePos := TPointF.Create(X, Y); AbsoluteMousePos := Item.LocalToAbsolute(LocalMousePos); // Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки StyleObject := Item.FindStyleResource('icon'); if (StyleObject <> nil) and (StyleObject is TControl) then begin StyleIcon := TControl(StyleObject); // Координаты в локальной системе координат картинки LocalMousePos := StyleIcon.AbsoluteToLocal(AbsoluteMousePos); if StyleIcon.LocalRect.Contains(LocalMousePos) then ShowMessage('Click on Image'); end; end; end; Builder C++:
    void __fastcall TForm4::ListBoxItem1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { TListBoxItem *item = dynamic_cast<TListBoxItem*>(Sender); if (item != 0){ TPointF localMousePos(X, Y); TPointF absoluteMousePos = item->LocalToAbsolute(localMousePos); // Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки TFmxObject *styleObject; styleObject = item->FindStyleResource("icon"); if (styleObject != NULL) { TControl *styleIcon = dynamic_cast<TControl*>(styleObject); // Координаты в локальной системе координат картинки localMousePos = styleIcon->AbsoluteToLocal(absoluteMousePos); if (styleIcon->LocalRect.Contains(localMousePos)) ShowMessage("Click on Image"); } } }
  22. Пост Brovin Yaroslav - сообщение в Как Получить текст по TCP (Indy) в нужной кодировке? был отмечен как ответ   
    Добрый день,
     
    Теперь он в качестве параметра принимает объект другого класса, а именно интерфейса IIdTextEncoding, который описывает основные методы по работе с потоком.
     
    Естественно, что этот интерфейс вам не нужно реализовывать, а нужно найти его реализацию для UTF8 кодировки. 
     
    Собственно смотрим в IdGlobal.pas и видим там глобальные процедуры по получению нужных реализаций в требуемых кодировках:
    IdTextEncodingType = (encIndyDefault, encOSDefault, enc8Bit, encASCII, encUTF16BE, encUTF16LE, encUTF7, encUTF8); function IndyTextEncoding(AType: IdTextEncodingType): IIdTextEncoding; overload; function IndyTextEncoding(ACodepage: Word): IIdTextEncoding; overload; function IndyTextEncoding(const ACharSet: String): IIdTextEncoding; overload; {$IFDEF DOTNET} function IndyTextEncoding(AEncoding: System.Text.Encoding): IIdTextEncoding; overload; {$ENDIF} {$IFDEF HAS_TEncoding} function IndyTextEncoding(AEncoding: TEncoding): IIdTextEncoding; overload; {$ENDIF} function IndyTextEncoding_Default: IIdTextEncoding; function IndyTextEncoding_OSDefault: IIdTextEncoding; function IndyTextEncoding_8Bit: IIdTextEncoding; function IndyTextEncoding_ASCII: IIdTextEncoding; function IndyTextEncoding_UTF16BE: IIdTextEncoding; function IndyTextEncoding_UTF16LE: IIdTextEncoding; function IndyTextEncoding_UTF7: IIdTextEncoding; function IndyTextEncoding_UTF8: IIdTextEncoding; Тут либо используем конкретный метод  IndyTextEncoding_UTF8, либо же используем вариант через:
    IndyTextEncoding(IdTextEncodingType.encUTF8)
  23. Пост Brovin Yaroslav - сообщение в Срабатывает OnClick у Image на ListBox при скроллинге был отмечен как ответ   
    Если такое поведение наблюдается, то его можно обойти, вручную определив момент нажатия на картинку.
    Создаем TListBoxItem Добавляем в него TImage и выставляем HitTest = False. Переопределяем событие итема OnMouseUp. Внутри метода определяем оторвали палец от экрана на текущей картинке или нет. Если да, то клик был по картинке. procedure TForm6.ListBoxItem2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin if Image1.ParentedRect.Contains(TPointF.Create(X, Y)) then ShowMessage('Click on Image'); end; P.S. Описанное вами поведение мне воспроизвести не удалось. Однако, если у вас по каким-либо причинам оно воспроизводится, используйте мои рекомендации выше.
  24. Пост Brovin Yaroslav - сообщение в Как сделать эффект обновления TListBox, как в UIListView под iOS? был отмечен как ответ   
    Продукт менеджер Сарина Дю Понт опубликовала в своем блоге реализацию такого эффекта: http://blogs.embarcadero.com/sarinadupont/2014/02/10/pull-to-refresh-on-ios/
  25. Пост Brovin Yaroslav - сообщение в У меня не получается создать браузер в Run-time был отмечен как ответ   
    Использую такой же код по нажатию на кнопку:
    procedure TForm5.Button1Click(Sender: TObject); var WebBrowser: TWebBrowser; begin WebBrowser := TWebBrowser.Create(Self); WebBrowser.Parent := Self; WebBrowser.Position.X := 3; WebBrowser.Position.Y := 3; WebBrowser.Width := 314; WebBrowser.Height := 177; WebBrowser.Navigate('http://yandex.ru/'); end; Браузер успешно создается в нужном месте на форме и страница открывается. Проверил на iOS.
×
×
  • Создать...