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

Brovin Yaroslav

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

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

  • Посещение

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

    390

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

  1. Ответ прост. Потому что в событии OnCreate и OnShow еще не загружен стиль. Поэтому FindStyleResource ничего вам не найдет. Стиль загружается обычно в момент первой прорисовки. Два решения: Принудительно загрузить стиль для требуемого компонента Button1.NeedStyleLookup; Button1.ApplyStyleLookup; Выполнять код по поиску элементов стиля в специально отведенном событии TStyledControl.OnApplyStyleLookup.
  2. Добрый день, Могу предложить в качестве базового способ получения скриншота всего рабочего стола. 1. Делаем скриншота рабочего стола по хендлу: function MakeWindowScreenShot(const AWindowHandle: HWND): TBitmap; var VCLBitmap: TBitmap; WindowRect: TRect; begin VCLBitmap := TBitmap.Create; try WindowRect := Rect(0, 0, Screen.DesktopWidth, Screen.DesktopHeight); VCLBitmap.Width := WindowRect.Width; VCLBitmap.Height := WindowRect.Height; BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, AWindowHandle, 0, 0, SRCCOPY); except VCLBitmap := nil; end; Result := VCLBitmap; end; 2. Далее получаем хендл рабочего стола, делаем скриншот и сохраняем скриншот в файл: procedure MakeScreenShotOfDesktop(const AFileName: string); var DCDesk: HDC; VCLBitmap: TBitmap; DesktopWindow: HWND; begin DesktopWindow := GetDesktopWindow; DCDesk := GetWindowDC(DesktopWindow); try VCLBitmap := MakeWindowScreenShot(DCDesk); try if VCLBitmap <> nil then VCLBitmap.SaveToFile(AFileName); finally VCLBitmap.Free; end; finally ReleaseDC(DesktopWindow, DCDesk); end; end; Соответственно далее, можно от этого отталкиваться и делать копирование только требуемой части рабочего стола (регион, окно). Для этого нужно в строке: BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, AWindowHandle, 0, 0, SRCCOPY); указывать нужную область копирования. Либо, продвинутый вариант. Это для конкретного окна находить хендл и делает скриншот только одного окна.
  3. Ошибка в неправильной трансляции методов протокола. В вашем случае: – webView:decidePolicyForNavigationAction:request:frame:decisionListener: Должен перейти в (Правильно): procedure webView(webView1: WebView; decidePolicyForNavigationAction: NSDictionary; request: NSURLRequest; frame: WebFrame; decisionListener: WebPolicyDecisionListener); cdecl; А не в (Неправильно), потеряли параметр webView : procedure decidePolicyForNavigationAction(actionInformation: NSDictionary; request: NSURLRequest; frame: WebFrame; listener: WebPolicyDecisionListener); cdecl; В качестве примера, посмотрите для сравнения, как транслируется CLLocationManagerDelegate: – locationManager:didFailWithError: – locationManager:didUpdateToLocation:fromLocation: В Delphi: CLLocationManagerDelegate = interface(IObjectiveC) ['{C1794A16-F4FB-46E1-839E-2AFBA43B420C}'] procedure locationManager(manager: CLLocationManager; didFailWithError: NSError); cdecl; overload; procedure locationManager(manager: CLLocationManager; didUpdateToLocation: CLLocation; fromLocation: CLLocation); cdecl; overload; end;
  4. Я могу только в понедельник проверить. Но есть предположение. Добавьте конструктор по умолчанию в TWebViewDelegate и внутри вызовите базовый конструктор TOCLocal. Методы протокола делегата должен быть в интерфейсе WebViewDelegate
  5. Посмотрите "Почему на мобильных платформах у меня не рисуется окружность?". Я думаю в вашем случае ответ будет такой же.
  6. Если речь идет о работе с камерой, то использование TBitmapSurface будет быстрее. И он уже имеет специальные методы трансформации изображения, в том числе отражения относительно вертикальной оси: TBitmapSurface.Mirror TBitmapSurface.Flip TBitmapSurface.Rotate90
  7. На счет планов вам не могу ничего рассказать. На счет того, что значит "нативный" элемент управления. Практически все контролы FireMonkey - это самодельные контролы, которые сделаны с нуля. За исключением пары: TWebBrowser, TMediaPlayerControl и TBannerAd. "Нативные" - это значит использование родного элемента управления, предоставляемого операционной системой. Каждая ОС имеет свой набор элементов управления, которые можно использовать в своих программах. Поэтому, в XE6 появился механизм поддержки нескольких реализаций контрола в рамках одной системы. Или другими словами появился некий аналог MVP (Model, View, Presenter), который позволяет в режиме выполнения менять на лету способы отображения контрола и его работу. XE7 имеет несколько контролов, которые поддерживают такой механизм: TEdit, TCalendar, TEditBox, TSpinBox, TNumberBox, TCalendarEdit, TClearingEdit, TComboEdit и TComboTrackBar. Это значит, что для этих контролов пользователь может использовать новый подход для создания своих независимых представлений. Из этих контролов, пока только 2 имеют нативное представление (то есть используют контролы ОС) - это TCalendar и TEdit. Выбор представления осуществляет через свойство ControlType. Platform - означает, что будет пытаться взяться нативное представление, Styled - самостоятельная реализация FM с использованием стилей. Если текущая платформа не имеет нативного представления, то контрол автоматически будет использовать Styled представление. Нативное представление обычно не может покрыть всю функциональность FMX. Так как у нас она расширенная. Но список ограничений для нативных представлений есть на сайте DocWiki.
  8. Это ошибка 3D контрола в FMX. В коде TControl3D пропущена проверка на не пустой Context. Context сбрасывается в момент Parent := nil. Поэтому Release для 3D объектов не подойдет до исправления. Для 2D объектов Release работает корректно. В итоге, удалить можно: Либо в OnMoseUp Либо использовать TTimer для этого. Или вспомогательную обертку, для более удобного удаления объектов подобным способом. P.S. Ошибку уже исправил.
  9. Hotfix для развертывания iOS приложений на симуляторе iOS 7.1, собранных с Delphi XE7. Скачать: http://cc.embarcadero.com/item/30008
  10. Тогда, отключение: ScrollBox.AniCalculations.TouchTracking := []; Включение: ScrollBox.AniCalculations.TouchTracking := [ttVertical];
  11. Метод Release является аналогом метода Free, но он вместо Free использует DisposeOf. Это означает, что при любом текущем раскладе с количеством ссылок на этот объект форсируется вызов деструктора. Асинхронных сообщений нету. Поэтому используйте метод Release с предварительным удалением объекта из всех временных списков.
  12. Используем специальные методы: TBimap.FlipHorizontal TBimap.FlipVertical TBimap.Rotate TBitmapSurface.Mirror TBitmapSurface.Flip TBitmapSurface.Rotate90 Или получаем доступ к точкам изображения и меняем их расположение. procedure FlipHorizontal(var ABitmap: TBitmap); var Data: TBitmapData; X, Y: Integer; Pixel: TAlphaColor; begin Assert(ABitmap <> nil); if ABitmap.Map(TMapAccess.ReadWrite, Data) then try for X := 0 to (Data.Width div 2) - 1 do for Y := 0 to Data.Height - 1 do begin Pixel := Data.GetPixel(X, Y); Data.SetPixel(X, Y, Data.GetPixel(Data.Width - X, Y)); Data.SetPixel(Data.Width - X, Y, Pixel); end; finally ABitmap.Unmap(Data); end; end; Аналогично делается отражение относительно горизонтальной оси.
  13. Стиль для андроида растровый. А он не поддерживает скругление. Поэтому свойства "XRadius" и "YRadius" игнорируются. Если требуется добавить такую поддержку, то нужно сделать векторный стиль для этой кнопки. Только нужно помнить, что стиль должен состоять из прямоугольников TRectangle с названиями: "Background" и "SecondBackground"
  14. Нужно посмотреть содержимое лога устройства. Если XCode >= 6.0.0 Открываем XCode -> Window -> Devices Выделяем ваше устройство На нижней панели нажимаем на кнопку разворачивания лога. Полностью очищаем лог непосредственно перед запуском вашего приложения Если XCode < 6.0.0 Открываем XCode -> Window -> Organizer Выбираем вкладку Devices Выбираем <ваше устройство> -> Console Полностью очищаем лог непосредственно перед запуском вашего приложения После этого пытаетесь запустить приложение и смотрите почему произошел сбой в системном логе. P.S. Скорее всего вы допустили где-то ошибку в заполнении VersionInfo.
  15. Потому что лучше очищать пользовательские объекты, так как это потенциально снижает варианты использования списков. Так как в качестве такого объекта может выступать все что угодно. Начиная от простых объектов, как у вас, и заканчивая "тяжелыми" объектами коннектами, источниками данных и тд. В этом случае вам придется делать дубликаты ваших данных или использовать более умные варианты прокси объектов для доступа к единому источнику данных. Используемый для хранения итемов TStringList не подразумевает очистку хранимых в нем объектов. Для этого есть другой список TObjectList, но он не используется по причине первого пункта. Если вы хотите отследить момент удаления объекта, для исключения его из списка. Вы можете воспользоваться интерфейсом IFreeNotification.
  16. Отключить нет. Форма сама определяет при помощи контролов, какие области формы нужно перерисовать. Поэтому, если нужно добиться такого эффекта, то лучше использовать опять же временный буфер. И в нем делать наложение своей картинки на старую.
  17. На счет примера на DocWiki. Обратите внимание, что там идет отрисовка на канве TBitmap, а не на канве формы. На канве TBItmap можно рисовать из любого места. Главное помнить, что процесс рисования на канве в FireMonkey имеет три фазы: BeginScene - начало отрисовки Любая отрисовка на TCanvas EndScene - окончание рисования. На счет формы, вместо Repaint у формы есть метод Invalidate. Чтобы выполнить отрисовку в любом другом месте, можно сделать дополнительный буфер в виде TBitmap. И выполнять в любом месте отрисовку там. А в OnPaint у формы просто выводить сформированное изображение из TBitmap.
  18. Как узнать поддерживаемый максимально допустимы размер изображения в TBitmap? Смысл переписывать имеет, если вам нужно загружать очень большие изображения, где-то более 2-3 Mb. P.S. На Windows с DirectX 10, размер вообще 64 Mb
  19. В FireMonkey TBitmap имеет верхнее ограничение на размеры хранимого изображения, ограниченные максимально допустимым размером текстур в текущей платформе. Узнать максимальную ширину и высоту можно так: var MaxWidthHeight: Integer; begin MaxWidthHeight := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize); end;
  20. Как узнать поддерживаемый максимально допустимы размер изображения в TBitmap? Поскольку не любое большое изображение можно загрузить в TBitmap.
  21. В FireMonkey в отличии от VCL нельзя рисовать на канве формы в произвольном месте. Рисование должно выполняться в отведенных местах: OnPaint, Paint, Painting. Всю отрисовку на канве формы нужно выполнять в событии OnPaint. В вашем случае, вам нужно рисовать в TForm.OnPaint. А в событии таймера выполнять вызов Repaint.
×
×
  • Создать...