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

Brovin Yaroslav

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

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

  • Посещение

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

    390

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

  1. Пост Brovin Yaroslav - сообщение в Почему у меня не работают триггеры, если я использую эффекты? был отмечен как ответ   
    Решение следующее. Все эффекты по умолчанию кэшируются. Так как они дорогостоящие. Поэтому в вашем случае не происходит обновления эффекта. 
    Решение простое, нужно выполнить ручное обновление эффекта в те моменты времени, когда вам это нужно. В вашем случае я сделал это на OnPaint у вашего фрейма:
    procedure TfremAdres.FramePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin NormalBlendEffect1.UpdateParentEffects; // Это в случае обновления конкретного эффекта // IEffectContainer(vrtScrolBox).NeedUpdateEffects; // Этот код в случае обновлении всех эффектов у родительского контрола end;  Но имейте в виду, что эффекты тяжеловесны и могут давать низкую скорость работы на мобильных платформах.
  2. Пост Brovin Yaroslav - сообщение в [TLabel] Какое назначение у Font, TextSettings и ResultingTextSettings.Font? был отмечен как ответ   
    Добрый день,
     
    Есть четыре типа настроек текста:
    DefaultTextSettings. Это настройки текста по умолчанию. TextSettings - Это настройки текста, которые задает пользователь. StyledSettings - какие настройки текста брать из стиля, а какие из TextSettings. ResultTextSettings - это результирующие настройки текста с учетом значения StyledSettings. Поэтому, если вы хотите получить итоговые настройки, то используйте ResultTextSettings. Они вычисляются автоматически на основании DefaultTextSettings, TextSettings и StyledSettings.
     
    P.S. Название шрифта по умолчанию присваивается в DefaultTextSettings.
  3. Пост Brovin Yaroslav - сообщение в [TButton] Как изменить размер шрифта в рантайме? был отмечен как ответ   
    Добрый день
     
    Нет, не баг. Ответ для кнопки и аналогичных компонентов с текстом аналогичен:
    Почему не изменяется Font.Style и Font.Size? Изменение размера шрифта в RunTime
  4. Пост Brovin Yaroslav - сообщение в Получаю AV при установке обработчика у THumb был отмечен как ответ   
    Все, я понял, в чем у вас ошибка.
    Thumb берется из стиля. У вас панель находится за пределами экрана iPhone По умолчанию, контролы, не попадающие в область видимости сцены или с нулевым размером по одной из осей, освобождают свой стиль. Поэтому у TrackBar нету стиля и Thumb. Вы к нему обращаетесь и получаете AV.
  5. Пост Brovin Yaroslav - сообщение в [XE7] [Отклонение] Не удается запустить приложение на Android 5.0 был отмечен как ответ   
    Hot Fix исправляющий проблему запуска приложений на Android 5.0 (Lollipop)
  6. Пост Brovin Yaroslav - сообщение в [Андроид] Можно ли эмулировать координаты GPS на эмуляторе? был отмечен как ответ   
    Добрый день,
     
    Стандартный эмулятор поддерживает указание гео координат. Но для этого нужно подключиться к симулятору через telnet и прописать ему ручками местоположение. 
     
    1. Включаем поддержку клиента Telnet для Windows 7-8
    Пуск - Панель управления - Программы и компоненты - Включение или отключение компонентов windows - Клиент Telnet (ставим галочку)

     
    2. Подключаем к эмулятору через telnet
    Запускаем командную строку cmd:

     
    3. Задаем координаты эмулятора
    задаем координаты и смотрим, как в сенсоре срабатывает событие смены геопозиции:

     
    Подробности тут:
    Using the Emulator Console Geo Location Provider Emulation
  7. Пост Brovin Yaroslav - сообщение в Рисование средствами iOSapi.CoreGraphics был отмечен как ответ   
    Рисовать средствами iOSapiVoreGraphics можно только на нативном UIView. Поэтому для начала нужно создать на форме нативный UIView. Рисование возможно только в перекрытом методу UIView.drawRect. Поэтому создаем отдельный класс UIView и перекрываем метод DrawRect. 
     
    Ниже приведен код, оболочки UIView, который выполняет отрисовку, через событие OnPaint.
    unit FMX.DrawableView; interface uses System.Types, System.TypInfo, iOSapi.CoreGraphics, iOSapi.UIKit, Macapi.ObjectiveC; type IMyView = interface(UIVIew) ['{A7145466-B0FA-42C1-A588-E73D03FFEBF1}'] procedure drawRect(rect: CGRect); cdecl; end; TOnPaint = procedure (Sender: UIView; Context: CGContextRef; const Rect: CGRect) of object; TDrawableView = class(TOCLocal) private FOnPaint: TOnPaint; function GetView: UIView; protected function GetObjectiveCClass: PTypeInfo; override; public constructor Create(const AFrame: TRectF); procedure drawRect(rect: CGRect); cdecl; public property View: UIView read GetView; property OnPaint: TOnPaint read FOnPaint write FOnPaint; end; implementation { TMyView } constructor TDrawableView.Create(const AFrame: TRectF); var V: Pointer; begin inherited Create; V := View.initWithFrame(CGRectMake(AFrame.Left, AFrame.Top, AFrame.Width, AFrame.Height)); if GetObjectID <> V then UpdateObjectID(V); end; procedure TDrawableView.drawRect(rect: CGRect); var context: CGContextRef; begin context := UIGraphicsGetCurrentContext(); try if Assigned(FOnPaint) then FOnPaint(View, context, rect); finally CGContextClearRect(context, rect); end; end; function TDrawableView.GetObjectiveCClass: PTypeInfo; begin Result := TypeInfo(IMyView); end; function TDrawableView.GetView: UIView; begin Result := UIView(Super); end; end. После того, как у нас есть нативное UIView, мы должны его создать и повесить на наше введенное событие OnPaint обработчик отрисовки:
    private FView: TDrawableView; protected // Декларация обработчика рисования procedure DoPaint(Sender: UIView; Context: CGContextRef; const Rect: CGRect); uses FMX.Platform.iOS; constructor TForm1.Create(AOwner: TComponent); var iOSHandle: TiOSWindowHandle; begin inherited; FView := TDrawableView.Create(TRectF.Create(0, 0, 200, 200)); FView.OnPaint := DoPaint; iOSHandle := WindowHandleToPlatform(Handle); iOSHandle.View.addSubview(FView.View); end; // Пример отрисовки красного прямоугольника procedure TForm1.DoPaint(Sender: UIView; Context: CGContextRef; const Rect: CGRect); begin CGContextSetRGBFillColor(context, 255, 0, 0, 1); CGContextFillRect(context, CGRectMake(20, 20, 100, 100)); end; В итоге получаем встроенное представление в форму, с отрисованным красным квадратом:

     
    Демо проект: iOS_Draw_Rect.zip
    Подробности отрисовки: Введение в Core Graphics на iOS
  8. Пост Brovin Yaroslav - сообщение в [TEdit] [Android] Как сделать TEdit в Android полностью прозрачным? был отмечен как ответ   
    Отредактировать стиль по умолчанию для эдита и из стиля удалить стилевой объект "Background"
     
    1. В контекстном меню эдита выбирает Edit Default Style или Edit Custom Style для создания отдельного стиля без замены стандартного:

    2. Удаляем в стиле editstyle объект background (Для удаления нужно нажать кнопку в тулбаре окна Structure):

    3. Получаем результат:

  9. Пост Brovin Yaroslav - сообщение в [Spring4D] Освобождение памяти объектов интерфейсного типа был отмечен как ответ   
    Ваша ошибка в том, что вы используете не тот список. Вы используете TList, который не удаляет свои элементы в момент разрушения списка. Поэтому ваша утечка - это не распущенные экземпляры TSurvey. Вместо этого нужно использовать TObjectList, который при установке ownsObjects = True, удаляем свои элементы.
     
    Итого, код создания списка должен быть таким:
    function GetList: IList<TSurvey>; var list : IList<TSurvey>; i : Integer; item : TSurvey; begin list := TCollections.CreateObjectList<TSurvey>(True); // <-- !!! for i := 0 to 10 do begin item := TSurvey.Create (); item.Id := Random(100); item.Name := I.ToString; list.Add ( item ); end; Result := list; end; Можно поиграться с проектом в Windows MemoryLeak.zip
  10. Пост Brovin Yaroslav - сообщение в [iOS] Как сохранить Bitmap в Фотоальбом? был отмечен как ответ   
    Первый способ
     
    Сохранить можно через библиотеку AssetsLibrary
    uses iOSapi.AssetsLibrary, FMX.Helpers.iOS; procedure SaveToAlbum(const ASourceBitmap: TBitmap); var AssetsLibrary: ALAssetsLibrary; Image: UIImage; begin Image := BitmapToUIImage(ASourceBitmap); AssetsLibrary := TALAssetsLibrary.Create; try AssetsLibrary.writeImageToSavedPhotosAlbum(Image.CGImage, Image.imageOrientation, PerformResultOfSavingPhoto); finally AssetsLibrary.release; end; end; Второй способ
     
    Через UIImageWriteToSavedPhotosAlbum:
     
    В декларации этой функции в делфи допущена ошибка, поэтому ниже привожу исправленную декларацию:
    uses iOSapi.UIKit, MacApi.ObjectiveC, Macapi.ObjCRuntime; // ===== External functions ===== const libUIKit = '/System/Library/Frameworks/UIKit.framework/UIKit'; procedure UIImageWriteToSavedPhotosAlbum(image: Pointer; completionTarget: Pointer; completionSelector: SEL; contextInfo: Pointer); cdecl; external libUIKit name _PU + 'UIImageWriteToSavedPhotosAlbum'; procedure SavePhotoToAlbum(const ABitmap: TBitmap); var AssetsLibrary: ALAssetsLibrary; Image: UIImage; begin Image := BitmapToUIImage(ABitmap); UIImageWriteToSavedPhotosAlbum((Image as ILocalObject).GetObjectID, nil, nil, nil); end;
  11. Пост Brovin Yaroslav - сообщение в [TTabItem] [XE7] [Android] Как создать и удалить вкладки в run-time? был отмечен как ответ   
    Добрый день,
    Пустая вкладка удаляется через:
    TabControl1.Delete(TabIndex); Попробовал уничтожить пустую вкладку и вкладку с кнопкой. Все отработало на андроиде без ошибок. 
    Проверьте, нету ли у вас ссылок на внутренние компоненты вкладки. 
    На всякий случай стоит ознакомиться с ARC (Как правильно удалять контролы в RunTime?), так как он на 99% является причиной не возможности удалить вкладку на мобильных платформах.
  12. Пост Brovin Yaroslav - сообщение в [XE7] Проблемы с встроенным поиском был отмечен как ответ   
    Вот эту тему читали?
    [Отклонение] Фильтрация текста не корректно работает с регистром Решение должно помочь.
  13. Пост Brovin Yaroslav - сообщение в Кнопки публикации ссылки на сайт в социальных сетях FaceBook и др. на главной странице был отмечен как ответ   
    Добавил кнопки публикации ссылки на сайт внизу на главной страницу форума.

  14. Пост Brovin Yaroslav - сообщение в Освобождение динамического массива. Delphi XE7 был отмечен как ответ   
    Добрый день,
     
    Нужно прочитать:
    Как правильно удалять контролы в RunTime? Пользоваться Free или DisposeOf?
  15. Пост Brovin Yaroslav - сообщение в [TPopupMenu] Как создать в runtime элемент меню TPopupMenu? был отмечен как ответ   
    Например так:
    var RootMenuItem: TMenuItem; MenuItem: TMenuItem; begin RootMenuItem := TMenuItem.Create(nil); RootMenuItem.Text := 'Item level 1'; PopupMenu1.AddObject(RootMenuItem); MenuItem := TMenuItem.Create(nil); MenuItem.Text := 'Item level 2'; RootMenuItem.AddObject(MenuItem); end;
  16. Пост Brovin Yaroslav - сообщение в Пример смены изображения Image через эффекты TransictionEffect был отмечен как ответ   
    Добрый день, MetropolisUIFlipViewDemo.zip
  17. Пост Brovin Yaroslav - сообщение в Плз, помогите найти программу из примеров был отмечен как ответ   
    Если я правильно вас понял вас интересовал слайдер картинок. Этот пример удалили из поставки XE7.
    Пример: MetropolisUIFlipViewDemo.zip
     
  18. Пост Brovin Yaroslav - сообщение в [TComboBox] Как сохранять ID в Combobox? был отмечен как ответ   
    Описанная проблема зависит от платформы, а именно от ARC. Подобная тема была тут: У меня возникает ошибка при попытке добавить пустой TObject в TStringList
     
    Какие есть варианты решения:
    Использовать объектную оболочку вашего ID. Смотрите предложение от haword Использовать свойство Tag у итема TListBoxItem. 
  19. Пост Brovin Yaroslav - сообщение в [TStringGrid] Как подсветить задний фон ячейки в зависимости от данных? был отмечен как ответ   
    Нужно:
    Повесить обработчик события на ручную отрисовку ячеек: TGrid.OnDrawColumnCell: В обработчике в зависимости от требуемой строки или данных, нарисовать задний фон ячейки Затем поверх выполнить обычное отображение содержимого ячейки  type TOpenColumn = class (TColumn); procedure TForm8.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); begin if Row mod 2 = 0 then begin // Выполняем закраску заднего фона Canvas.Fill.Color := TAlphaColorRec.Aliceblue; Canvas.FillRect(Bounds, 0, 0, AllCorners, 1); // Рисуем поверх обычное отображение содержимого ячейки TOpenColumn(Column).DefaultDrawCell(Canvas, Bounds, Row, Value, State); end; end; Для этого примера, у меня получилось так:

  20. Пост Brovin Yaroslav - сообщение в Как присвоить изображение свойству объекта стиля TImage, используя StylesData? был отмечен как ответ   
    Добрый день,
     
    Например так:
    Item.StylesData['userimage.bitmap'] := TValue.From<TBitmap>(MyBitmap);
  21. Пост Brovin Yaroslav - сообщение в [TWebBrowser] Как отловить Redirect? был отмечен как ответ   
    На каждый новый редирект по идеи должен быть вызван TWebBrowser.OnDidStartLoad.
  22. Пост Brovin Yaroslav - сообщение в [XE7] [TEdit] [Отклонение] Не срабатывает событие OnClick у TEdit был отмечен как ответ   
    Хорошо, что задали этот вопрос. Потому, что я вспомнил о более лаконичном и удобном решении. Чем тот, что я вам предложил.
    В XE7 был переведен на MVC модель. В итоге, TEdit позволяет не создавая наследников менять и дополнять работу TEdit. Идея простая, у TEdit есть несколько представлений, которые полностью осуществляют работу TEdit. Чтобы исправить это отклонение, нужно создать новое представление и заменить текущей TStyledEdit на новое, исправленное:
    unit FMX.Edit.MyStyle; interface uses FMX.Edit.Style, FMX.Controls.Presentation, System.UITypes, System.Classes; type // Новое представление - расширение текущего TMyStyledEdit = class(TStyledEdit) protected procedure MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override; end; // Промежуточный класс TMyStyledEditProxy = class(TPresentationProxy) protected function CreateReceiver: TObject; override; end; implementation uses System.SysUtils, FMX.Presentation.Factory, FMX.Types; { TMyStyledEditProxy } function TMyStyledEditProxy.CreateReceiver: TObject; begin Result := TMyStyledEdit.Create(nil); end; { TMyStyledEdit } procedure TMyStyledEdit.MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single); var Control: IControl; begin inherited; if Supports(PresentedControl, IControl, Control) then Control.MouseClick(Button, Shift, X, Y); end; initialization // Для всех TEdit удаляем базовое представление TPresentationProxyFactory.Current.Unregister('Edit-Style'); // Для всех TEdit регистрируем наше представление TPresentationProxyFactory.Current.Register('Edit-Style', TMyStyledEditProxy); finalization // Восстанавливаем старое представление Edit TPresentationProxyFactory.Current.Unregister('Edit-Style'); TPresentationProxyFactory.Current.Register('Edit-Style', TStyledEditProxy); end. Где немного упоминается о новом подходе:
    Нативные элементы управления Куда пропали методы DoChangeTracking и Change? Для исправления, достаточно добавить этот файл в проект. Этого будет достаточно.
     
    Проект: NewEditPresentation.zip
  23. Пост Brovin Yaroslav - сообщение в [TidHTTP] Не удается скачать изображение в другом потоке. Работает в Windows, OSX, но не работает на Android и iOS был отмечен как ответ   
    Все очень просто, ваш тред убивается быстрее, чем успевает запуститься.
    Потому что на всех мобильных платформах работает ARC, вы объявили переменную треда в локальном скопе. В итоге, при выходе из процедуры, счетчик ссылок вышей переменной сбрасывается на 0 и ваш тред распускается.
     
    Ваш код:
    procedure TForm3.Button1Click(Sender: TObject); var MyHTTP1:ThreadHTTP1; begin MyHTTP1 := ThreadHTTP1.Create(False); end; Будет дополнен после компиляции дополнительными служебными командами:
    procedure TForm8.Button1Click(Sender: TObject); begin MyHTTP1 := ThreadHTTP1.Create(True); { MyHTTP1.__ObjAddRef; } <-- В момент присваивания потока в MyHTTP1. RefCount = 1. MyHTTP1.Start; { MyHTTP1.__ObjRelease; } <-- В момент выхода из метода. RefCount = 0 -> Вызов Деструктора end; Частично ответ есть тут (Первые параграфы ответа): Как правильно удалять контролы в RunTime?
     
    Соответственно, нужно обеспечить время жизни переменной такой же, как и у потока. Для этого можно просто оформить переменную, как поле класса.
  24. Пост Brovin Yaroslav - сообщение в [TBluetooth] Как изменить режим сканирования? был отмечен как ответ   
    Чтобы TBluetooth сменил режим на Discoverable, нужно вызвать метод:
    TBluetooth.StartDiscoverable(Timeout: Integer);
  25. Пост Brovin Yaroslav - сообщение в Как вырезать часть картинки TBitmap? был отмечен как ответ   
    Часть исходного TBitmap вырезается при помощи отрисовки этой части в другой TBitmap.
    Допустим есть такой проект:

    Тогда алгоритм по вырезанию будет следующий:
    Определяем регион вырезаемой области:
    var BitmapSource: TBitmap; BitmapDest: TBitmap; DestWidth: Integer; DestHeight: Integer; BitmapSourceRect: TRectF; BitmapDestRect: TRectF; begin BitmapSource := ImageSrc.Bitmap; BitmapSourceRect := TRectF.Create(TPointF.Create(nbX.Value, nbY.Value), nbWidth.Value, nbHeight.Value);  Создаем TBitmap для вырезанной части:
    DestWidth := Max(0, Round(nbWidth.Value)); DestHeight := Max(0, Round(nbHeight.Value)); BitmapDest := TBitmap.Create(DestWidth, DestHeight); BitmapDestRect := TRectF.Create(0, 0, BitmapDest.Width, BitmapDest.Height); Выполняем отрисовку области исходного битмапа в конечный:
    if BitmapDest.Canvas.BeginScene then try BitmapDest.Canvas.DrawBitmap(BitmapSource, BitmapSourceRect, BitmapDestRect, 1); finally BitmapDest.Canvas.EndScene; end; Выводим полученное изображение на форму:
    ImageDest.Bitmap.Assign(BitmapDest); Результат:

×
×
  • Создать...