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

Brovin Yaroslav

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

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

  • Посещение

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

    390

Весь контент Brovin Yaroslav

  1. "Подгонять" - это Fit, или по высоте или ширине в зависимости от пропорции изображения и пропорции TImage?
  2. Правильно ли я понимаю задачу: Мы делаем типа шапки приложения. И нам важно, чтобы шапка имела фиксированную высоту, а по ширине растягивалась по ширине экрана. При этом изображение шапки по ширине подгонялось по ширине экрана, а высота вычислялась автоматически с сохранением пропорции? При этом мы загружаем в шапку заведомо большее изображение, чтобы покрыть все возможные варианты ширины экрана устройства?
  3. Шрифт - это не просто набор картинок, это набор правил по отображению букв, цифр. В большинстве случае векторный. Поэтому просто так волшебным дуновением ваши картинки не превратятся в файл векторного шрифта. Поэтому, если вы хотите решение именно через шрифт, то вам стоит поискать по интернету статьи на тему созданию своих шрифтов.
  4. По официальному свежему RAD Studio, Delphi and C++Builder Roadmap - March 2014 такая поддержка возможно появится в этом году:
  5. Попробуйте воспользоваться рекомендациями из этой статьи: Как ускорить эмулятор Android на 400% (Habrahabr)
  6. У объекта приложения iOS есть опция, которая отвечает за отключение таймера блокировки экрана idleTimerDisabled uses FMX.Helpers.iOS; // Отключаем таймер автоблокировки SharedApplication.setIdleTimerDisabled(True);
  7. Чтобы добавить любое изображение в системную галерею изображений Андроида нужно: Получить универсальный URI к вашей картинке GetImageUri. Для этого сохраняем изображение (если изображение находится в памяти устройства, а не в файловой системе) в кэш приложения. Формируем намерение JIntent, что хотим добавить изображение. Задаем URI к картинке и делаем широковещательный запрос на все приложения, которые могут обработать наш запрос. // Сохранение изображения в кэш приложения и извлечение Url к этому файлу function GetImageUri(ABitmap: TBitmap): Jnet_Uri; var ImageFile: JFile; ImageUri: Jnet_Uri; FileNameTemp: JString; FileNameExt: JString; begin FileNameTemp := StringToJString('temp'); FileNameExt := StringToJString('.jpg'); try ImageFile := TJFile.JavaClass.createTempFile(FileNameTemp, FileNameExt); ImageUri := TJnet_Uri.JavaClass.fromFile(ImageFile); ABitmap.SaveToFile(JStringToString(ImageFile.getAbsolutePath)); finally Result := ImageUri; end; end; procedure AddPhotoToGallery(const APhoto: TBitmap); var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_MEDIA_SCANNER_SCAN_FILE); Intent.setData(GetImageUri(APhoto)); SharedActivity.sendBroadcast(Intent); end;
  8. Читаем пост Андрея Ефимова (Infocean): Добавляем Splash Screen в приложение для Android Видео, демонстрирующее результат:
  9. Чтобы ответить самостоятельно на этот вопрос, нужно понимать следующие факты: 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 и затем переписывать весь проект на него.
  10. Например так для 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;
  11. Чтобы код упростить и не писать свою рекурсию. Можете использовать метод TControl.EnumControls. Он позволяет пробежаться по всем узлам дерева и выполнить код для каждого контрола.
  12. Код подправил. Строчка с Instance := Button1; лишняя. Да, по коду ищутся дочерние контролы. В коде не видно, но это дочерние узлы формы. В вашем случае нужно код исправить на рекурсию, чтобы пробежаться не только по контролам первого уровня, но и по всем узлам дерева контролов до листьев.
  13. Добрый день, В 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;
  14. Добрый день, В событии 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"); } } }
  15. Добрый день, Теперь он в качестве параметра принимает объект другого класса, а именно интерфейса 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)
  16. OXML - это новая библиотека по работе с XML для Delphi и Lazarus, разработанная в конце 2013 года. Целью OXML является быть универсальной и быстрейшей XML библиотекой для языка Паскаль. Основные особенности OXML являются: Парсер SAX Реализация DOM Прямое чтение /запись XML файлов Полная совместимость при работе с TXMLDocument (XmlIntf.TXMLDocument) Автор: Software Solution Ondřej Pokorný Тип лицензии: Open Source Ссылка: http://www.kluug.net/oxml.php Скачать: SourceForge
  17. Компонент проигрывания всех современных форматов Видео/Аудио/потоков для Андроида. Автор: Flash AV Software Corp. Тип лицензии: коммерческая Ссылка: http://www.flashavconverter.com/content/vlc-player-android-10 Скачать Trial: ZIP
  18. Если такое поведение наблюдается, то его можно обойти, вручную определив момент нажатия на картинку. Создаем 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. Описанное вами поведение мне воспроизвести не удалось. Однако, если у вас по каким-либо причинам оно воспроизводится, используйте мои рекомендации выше.
  19. Мне кажется лучшим вариантом решения будет такой вариант: Используем обычный ЛистБокс с картинкой. Можно использовать обычный тип TListBoxItem со стилем 'listboxitembottomdetail', который содержит и текст описания и картинку. Далее вставляем в итем картинку через TListBoxItem.ItemData.Bitmap. В событии OnMouseDown у итема определяем положение пальца и если положение совпадает с положением картинки, то открываем отдельную страницу с браузером растянутым на весь экран. Об этом решении написано тут: Как определить положение картинки в TListBoxItem? Не имеет смысла встраивать маленький браузер, потому что на нем все равно путного ничего не увидишь. Поэтому обычно, при нажатии на видео открывается полноэкранный вариант проигрывателя. В вашем случае, основанного на TWebBrowser.
  20. Если TImage не должен принимать никакие события мыши, то выставить ему: HitTest = False
  21. Продукт менеджер Сарина Дю Понт опубликовала в своем блоге реализацию такого эффекта: http://blogs.embarcadero.com/sarinadupont/2014/02/10/pull-to-refresh-on-ios/
  22. В таком случае у вас точно будет тормозить скроллинг и все приложение. Так как создание и удержание даже 30 экземпляров браузера это тяжелая задача для телефона. Вначале изучите, как работает стандартное приложение YouTube или Вконтакте. И обратите свое внимание на то, когда и в какой момент воспроизводится видео. Отчетливо видно, что браузер имеет смысл создавать только в одном экземпляре и только в тот момент времени, когда пользователь непосредственно выявил свое желание просмотреть видео. Это является примером грамотного подхода к разработке. P.S. Я сделал новый раздел на форуме "Советы по разработке -> Мобильная разработка", в котором вы можете задавать свои вопросы для получения советов о том, как лучше спроектировать свое приложение, чтобы в дальнейшем не было проблем со скоростью и сопровождением.
  23. Использую такой же код по нажатию на кнопку: 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.
×
×
  • Создать...