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

Brovin Yaroslav

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

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

  • Посещение

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

    390

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

  1. Добрый день, Например так, если использовать кроссплатформенный сервис FM: uses FMX.Platform; {$R *.fmx} procedure TForm2.Button1Click(Sender: TObject); var LocaleService: IFMXLocaleService; LangID: string; begin if TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, IInterface(LocaleService)) then LangID := LocaleService.GetCurrentLangID; end; Либо, как вы заметили, можно этого добиться используя на прямую iOS API: var CurrentLocale: NSLocale; LanguageISO: NSString; begin CurrentLocale := TNSLocale.Wrap(TNSLocale.OCClass.currentLocale); LanguageISO := TNSString.Wrap(CurrentLocale.objectForKey((NSLocaleLanguageCode as ILocalObject).GetObjectID)); // <-- Здесь берем то, что нужно от локали Result := UTF8ToString(LanguageISO.UTF8String); end;
  2. Как вы заметили есть два способа: Использовать директиву условной компиляции Использовать аналоги функции SubString Каждая функция в C++ Builder имеет три аналога. Например, для вашей функции SubString, есть три варианта: SubString0 - работает со строкой, как с 0-основной SubString1 - работает со строкой, как с 1-основной SubString - Вариант работы со строкой зависит от платформы (мобильные - 0, настольные - 1) Вы используете третий и поэтому на разных платформах получаете разные варианты работы. Другого варианта я думаю нет. TStringHelper - это чисто Делфовая особенность. В билдере она не будет работать. Так как строки в Delphi - это базовый тип, а в Builder C++ - нет.
  3. А куда выложили фотки? Видео с семинаров не будет. Но зато я на следующей неделе выложу используемые презентации и демки.
  4. При сборке (Build Shift + F9) среда не генерирует пакет. Сборка не требует подключенного устройства, но требует настроенного профиля Android SDK в RAD Studio Инструкция по получению пакета андроид приложения Если вам нужен пакет. То его можно получить двумя способами: Получаем содержимое (контент) пакета. На этом шаге полностью получается содержимое пакета вашего будущего приложения. Либо через меню Project -> Deploy lib<название проекта>.so, либо открываем Deployment Manager и там нажимаем на кнопку Deploy. Оба способы изображены на рисунке ниже: Контент помещается в поддиректорию: ./<Конфигурация>/<Название проекта> Любым zip архиватором архивируем содержимое пакета и меняем расширение с "zip" на "apk". Это и будет готовый пакет приложения. Так же пакет автоматически получится при запуске вашего приложения из среды на целевом устройстве на базе Андроид.
  5. Как сказал, Андрей, вы все правильно поняли. Я дополню ответ. Все известные пути можно получить через System.IOUtils.TPath. Подробно о путях описано тут: Standard RTL Path Functions across the Supported Target Platforms Не во все места на устройстве разрешается осуществлять запись. Это нужно иметь в виду, если файл не сможет сохраниться из-за недостатка прав на запись.
  6. Подчеркивание текста - это результат работы проверки текста. Ее можно отключить через: TEdit.CheckSpelling = False Кнопка 'Вставить" системная и появляется по системным правилам. Управлять ее поведением увы не удастся.
  7. Видимо вы меня не поняли. Обратите внимание на пункт 2.2.5 правил. Потому что на текущий момент вы мне рассказываете, что у вас якобы не работает какой-то функционал. А я проверяю на чистом проекте и все работает. Отсюда должна напрашиваться только две мысли, что вы видимо что-то не правильно делаете, либо не полностью рассказываете. Поэтому нужно прикрепить полностью проект, чтобы я мог быстро посмотреть и сразу вам ответить (если вы конечно сами заинтересованы в решении вашей задачи). Так же опять же, судя по коду, не может быть ситуации, когда ваше изображение повторяется и отображается, как Tile. Хотя вы даже прикрепили скриншот, что якобы у вас на вашем коде это воспроизводится. (опять же выкладывайте проект с минимальным кодом) Я не знаю, как вы делаете "слоеный торт". Эта метафора может содержать тысячу и один способ достижения этого. И опять же я не умею читать мысли и не смогу по такому описания помочь вам решить задачу. Выкладывание проекта с кодом, где показано, как вы это делаете, снимает все ненужные и лишние вопросы, И снижает затраты на долгое выяснение деталей.
  8. Нужен код вашего компонента и проекта, на котором это воспроизводится. Потому что: BringToFront и SendToBack отлично работают на TImage, брошенных на форму (только что проверил) У TImage по умолчанию установлено HitTest = True, а это значит, что контрол перехватывает события мыши по умолчанию. У TImage по умолчанию WrapMode установлен в Fit, а в этом случае картинка подгоняется с сохранением пропорций под размер контрола. Поэтому ситуация с дублирование картинки не возможна в таком режиме.
  9. 6 глава. Аниматоры и триггеры

  10. Я пока не достал XE5. В ХЕ6 такой проблемы уже нет. Поэтому нужно смотреть исходники ХЕ5.
  11. Добрый вечер, Нет, в него не заложена работа с аудио дорожками. Поэтому он не умеет определять количество дорожек. Если нужен такой функционал, то следует использовать Системное API. Спасибо
  12. Добрый вечер, Я вижу вариант создания трех отдельных аниматоров TPathAnimation по пути для каждой оси (X, Y, Z).
  13. В общем ничего кроме стандартных знаний линейной алгебры здесь не требуется. Согласно линейной алгебры нужно построить матрицу трансформации задать ее для канвы и рисовать все что угодно. Если вспомнить, то выполнить нужно следующее: Сместить Систему Координат (СК) на вектор центра поворота. Повернуть СК на угол поворота Сместить СК на обратные вектор центра поворота. В коде это будет выглядеть так: uses System.Math.Vectors; {$R *.fmx} procedure TForm1.ButtonDrawRotatedTextClick(Sender: TObject); var RotationMatrix: TMatrix; TranslationMatrix: TMatrix; ReverseTranslationMatrix: TMatrix; begin Image1.Bitmap.SetSize(200, 200); Image1.Bitmap.Clear(TAlphaColorRec.Null); with Image1.Bitmap.Canvas do begin BeginScene; try TranslationMatrix := TMatrix.CreateTranslation(100, 100); RotationMatrix := TMatrix.CreateRotation(-Pi / 180 * nbAngle.Value); ReverseTranslationMatrix := TMatrix.CreateTranslation(-100, -100); SetMatrix(ReverseTranslationMatrix * RotationMatrix * TranslationMatrix); Fill.Color := TAlphaColorRec.Red; Fill.Kind := TBrushKind.Solid; Font.Size := 20; FillText(TRectF.Create(50, 50, 150, 150), 'Текст', False, 1, [], TTextAlign.Center, TTextAlign.Center); finally EndScene; end; Image1.Repaint; end; end; Результат: Проект: DrawRotatedTextDemo.zip
  14. Либо руками править тексты файла стиля "*.style" Либо иметь исходник стиля в "*.vsf" Других вариантов нет. Поскольку тип vsf имеет другую структуру и по нему конвертер генерирует код для формата style. Этот процесс не обратим.
  15. Добрый вечер В RAD Studio XE6 поиск в TListBox регистронезависим:
  16. Для покадровой анимации в FireMonkey существует специальный вид анимации TBitmapListAnimation. Подробнее тут: FMX.Ani.TBitmapListAnimation
  17. Такого режима нету в FireMonkey. Однако, если очень хочется и нужно, то есть такой вариант: http://www.youtube.com/watch?v=-yKsyKOSyh4 Правда нужно понимать, что скрытие 3D объекта через Opacity не является правильным способом, так как фактически все вычисления производятся все равно. Чтобы избежать этого, можно для требуемых 3D объектов переопределить метод рендеринга объекта: TCopntrol3D.Render И вместо вывода объекта рисовать только ребра, способом описанным человеком на видео. TMyCube = class (TCube) public FColorMaterial: TColorMaterialSource; protected procedure Render; override; public property ColorMaterial: TColorMaterialSource read FColorMaterial write FColorMaterial; end; // ..... procedure TMyCube.Render; begin if FColorMaterial <> nil then Context.DrawLines(Data.VertexBuffer, Data.IndexBuffer, TMaterialSource.ValidMaterial(ColorMaterial), Opacity) else Context.DrawLines(Data.VertexBuffer, Data.IndexBuffer, nil, Opacity); end; Демо проект: 3DWireFrame.zip
  18. С какой ошибкой вываливается из памяти? Ошибку можно посмотреть в LogCat Вызов MediaPlayer1.Clear не особо должен чем-то помочь: procedure TMediaPlayer.Clear; begin FreeAndNil(FMedia); FFileName := ''; end; Он просто удаляет связанный объект TMedia с вашим файлом. А задание нового имени файла, как вы можете заметить, тоже чистит объект TMedia: procedure TMediaPlayer.SetFileName(const Value: string); begin if csDesigning in ComponentState then begin if FFileName <> Value then FFileName := Value; end else begin // We shall recreate media object as the file content could change. // For example if we make recording in the same file if Assigned(FMedia) then begin FMedia.DisposeOf; // <--- Очистка объекта TMedia FMedia := nil; // <--- Уменьшение счетчика ссылок end; FFileName := Value; if FileExists(FFileName) then begin FMedia := TMediaCodecManager.CreateFromFile(FFileName); if Assigned(FMedia) then FMedia.Control := FControl; end else raise ECaptureDeviceException.Create(SFileNotFound); end; end; Итог: Нужно узнать почему программа вывалилась из памяти.
  19. Вся отрисовка выполняется в отдельном потоке (известный как UI Thread), из других потоков рисовать в нем запрещено. При попытке это сделать, вы получите исключение. На андроиде оно несет название "ALOOPER_POLL_ERROR". На других платформах будет немного другой текст ошибки. Чтобы отрисовка происходила в главном потоке (UI Thread) нужно добавить синхронизацию потоков через TThread.Synchronize или TThread.Queen Однако, в этом случае ваш поток будет ожидать момент отрисовки в главном потоке и в момент отрисовки простаивать. В итоге вы получите то, от чего пытаетесь убежать. В вашем случае, медленная скорость анимации может зависеть от больших картинок в TTabControl. Так же она может зависеть от сложной иерархии объектов на форме.
  20. Используйте лучше другой вариант определения окончания видео. Такой вариант работает: if MediaPlayer1.State = TMediaState.Stopped then begin MediaPlayer1.CurrentTime := 0; MediaPlayer1.Play; end;
  21. За физику и динамику прокручивания TScrollBox отвечает объект TAniCalculations. TScrollBox.AniCalculation Прокрутка работает по закону сухого трения, вы можете попробовать изменить параметры трения и скроллинга в AniCalculation, чтобы добиться прокрутки на ваш вкус: DecelerationRate StorageTime Elasticity BoundsAnimation Averaging
  22. Без анимации можно любым из этих способов: // Установка координат окна просмотра (Левый верхний угол) ScrollBox.ViewportPosition := TPointF.Create(0,0); ScrollBox1.ScrollTo(0, 0); // Аналог ViewportPosition // Сдвиг на вектор ScrollBox.ScrollBy(-10, -10); С анимацией так: procedure TForm3.FormCreate(Sender: TObject); begin ScrollBox1.AniCalculations.Animation := True; ScrollBox1.AniCalculations.BoundsAnimation := True; ScrollBox1.AniCalculations.TouchTracking := [ttVertical, ttHorizontal]; end; // Сам сдвиг ScrollBox1.AniCalculations.MouseWheel(5, 10);
×
×
  • Создать...