• 0
Вячеслав

Как сделать скриншот формы?

Вопрос

Господа, озадачился вопросом получения скриншота формы. Статью Ярослава прочитал, разобрался, но в ней описан метод получения скриншота произвольного контрола с помощью метода PainTo. У формы же этот метод иной, поэтому возникли затруднения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2 ответа на этот вопрос

  • 0

Все, вопрос снят. Всего-навсего нужно было отрисовать форму через PaintTo в Canvas. Единственное отличие от отрисовки контрола-у метода PaintTo формы входной параметр только один-TCanvas.

Brovin Yaroslav понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

На всякий случай, продублирую:

function MakeScreenshotOfForm(const AForm: TForm): TBitmap;
begin
  Assert(AForm <> nil);

  Result := TBitmap.Create(AForm.Width, AForm.Height);
  AForm.PaintTo(Result.Canvas);
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
begin
  Bitmap := MakeScreenshotOfForm(Self);
  try
    Image1.Bitmap.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;

Еще есть статья [XE7] Создание PrintScreen'ов полных и части экранов, в ней рассказывается, как сделать скриншоты в том числе и чужих окон, правда только под Windows

Евгений Корепов и Alex7wrt понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

  • Похожие публикации

    • Автор: notricky
      На Android код, который работает исправно на Win  вызывает ошибку "CalledFromWrongThreadException: Only the original thread that created a view hierarcy can touch its views" 
      Смысл таков, что я пытаюсь показать форму из треда, у которой BorderStyle=none (роли это не играет).
      Решение в Андроиде заключается в том, чтобы пускать через  runOnUiThread  (то есть выполнять интерфейсные штуки в главном потоке). Как я понимаю, в firemonkey эту фичу должен выполнять Synchronize().
      Тем не менее, ошибка возникает.
      А при запуске в режиме дебага на андроид девайсе событие кнопки вообще не срабатывает иногда. А если срабатывает, то возникает описанное выше исключение.
      Я собрал тестовый пример и в нем не сразу видна ошибка, тогда как получил я ее на рабочем проекте.
      Цель: показать бизибокс на время бекграундных действий. Этот бизибокс у меня сначала был просто на каждой форме и я интерфейсно его вызывал, но теперь решил сделать отедльной формой (как и тоаст), но почему так происходит я не понял. Вы что скажете?
       
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TWorkThread = class(TThread) public procedure Execute; override; end; var Form1: TForm1; implementation {$R *.fmx} uses unit2; procedure TForm1.Button1Click(Sender: TObject); var t: TWorkThread; begin t := TWorkThread.Create(True); t.FreeOnTerminate := true; t.Start; end; { TWorkThread } procedure TWorkThread.Execute; begin inherited; Self.Synchronize(procedure begin Form2.Show; Form2.Top := Form1.Top; Form2.Left := Form1.Left; Form2.BringToFront; end); Terminate; end; end.  
    • Автор: SergeyIT
      Пожалуйста, развейте мои сомнения, люди добрые!
      Не верю глазам своим. Сомневаюсь.
      Неужели это правда, что работая в дизайнере в иерархии элементов формы Structure нельзя не только ничего переместить, но и уничтожить?
       

    • Автор: AndreyS
      Обнаружилась очень неприятная и неожиданная проблема.
      Постараюсь кратко описать суть. Есть приложение (пробовал пока только на Windows) для работы с базой данных. Допустим мы создаем новый объект этой базы. Открывается форма этого объекта. При заполнении значений определенного реквизита (допустим это цвет) открывается форма выбора из списка цветов, введенных в эту базу данных. Форма выбора открывается в модальном режиме. В этой форме выбора есть возможность добавить новый или изменить уже существующий цвет. Соответственно поверх модальной формы открывается еще одна модальная форма редактирования цвета. Пока все хорошо. Но при закрытии формы цвета форма выбора заполняется черным цветом (сначала только частично, т. к. перерисовывается не вся форма, а только часть объектов, которые были перекрыты второй модальной формой, но, например, при ресайзе формы выбора чернеет уже вся клиентская часть). Все формы в приложении стилизованные, включая бордюр.
      Частично эта проблема решается если у форм устанавливать Fill.Kind в Solid или что-то другое (главное, чтобы не None). Но при этом начинают странным образом пропадать элементы формы (без логики). Пробовал мудрить, типа в OnActivate формы выбора сбрасывать StyleBook формы, далее Application.ProcessMessages, и снова устанавливать в StyleBook новое значение. После пары перемигиваний форма отрисовывается правильно, но при этом появляется другой глюк (при наведении на кнопки в заголовке главной формы, заголовок тоже чернеет). Вот такая дребедень...
       
      В общем, как я понимаю, глюк появляется, когда открыто несколько модальных форм.
       
      Может кто-то знает какой-нибудь приличный workaround?
    • Автор: Andrew
      Для проведения опытов на Delphi XE8 использовал два планшета Android:
      - Lenovo TAB S8-50LC на базе процессора Intel Atom Z3745: http://www.ixbt.com/portopc/lenovo-tab-s8-50lc.shtml. На нем установлен Android версии 4.4.2. Подключил к USB и, как не странно, тестовая программка "Hello World!" успешно запустилась, хотя думал, что с процессором Intel вообще ничего не получится;

      - Prestigio Multipad PMT5777_3G с процессором ARM MediaTek MT8382. На нем установлен Android 4.2.2.

      Затем на форму красного цвета бросил зеленый TRectangle, присвоил Align значение Client, а также добавил желтую рамку с помощью свойства Stroke (Thinkness=10). Запустил на Prestigio - выглядит нормально, если не считать не дорисованных уголков (см. красные квадраты). Кстати, на Windows уголки рамки отображаются нормально.
       
      MainForm.Top = 25 - видимо, смещение от статус-бара.
       

       
       
      Затем запустил на Lenovo и результат получился не такой красивый. Как видим, верх формы почему-то "уехал" за статус-бар, а ее свойство Top равно 0:
       

       
      ------------------------------------------------------------------------------------------------------------------------------------
       
      Поворачиваем планшеты на 90 градусов. На Prestigio все выглядит нормально:
       

       
       
      На Lenovo произошло какое-то расстройство:
       

       
       
      Как я понял, на Lenovo возникают проблемы с получением высоты статус-бара и размеров экрана при повороте планшета, но с чем это связано - непонятно. Возможно решение где-то в FMX.Platform.Android или глубже. По крайней мере там переменная FStatusBarHeight равна нулю.

      На моем примере ниже можно получить правильные размеры и позицию для формы (в т.ч. с учетом статус-бара):
      NativeWin := SharedActivity.getWindow;
      if NativeWin <> nil then
      begin
      ContentRect := TJRect.Create;
      DecorView := NativeWin.getDecorView;
      DecorView.getWindowVisibleDisplayFrame(ContentRect);
      end;
    • Автор: DirtyBorov
      Подскажите как можно изменить иконку окна в runtime? 
      Суть проблемы в том, что мне надо поддерживать приложение для разных заказчиков. Каждый из них хочет иметь собственную иконку в приложении. Очевидное решение - создать несколько проектов и каждому задать требуемую иконку. Однако на практике это весьма утомительное занятие. Хотелось бы сделать одно приложение, а иконки подгружать динамически на основании настроек приложения.
      Вспоминая практику VCL и WinAPI, подменить иконку Application оказалось задачей тривиальной:
      NewAppIcon := TIcon.Create; NewAppIcon.LoadFromFile(AIconFile); SendMessage(ApplicationHWND, WM_SETICON, 1, NewAppIcon.Handle); А вот дальше начались проблемы. Окна уже прогрузили иконку по умолчанию и добраться до них у меня не получается. 
      Добраться через стиль не получается, потому что TForm не является наследником TStyledObject и не имеет StylesData. Через FindStyleResource тоже не получается добраться.
       
      Может кто знает как?
       
    • Автор: Brovin Yaroslav
      По мотивам темы: [Windows] Как поменять иконку формы?
       
      Как поменять иконку у формы со стилизованной рамкой под Windows?
    • Автор: alewka006
      Подскажите, как на форме сделать фоновое изображение. Вставляю картинку (TImage) на весь экран, изображение в пропорции выводится не на весь экран
    • Автор: estra
      Ярослав,

      По каким соображениям у форм отсутствуют события OnClick и OnDblClick?
      Они бы очень даже не помешали, введите их со следующим апдейтом или в крайнем случае в XE7.
    • Автор: Brovin Yaroslav
      Как закрыть созданную форму?
      Close и free не закрывают, а только прячут.
    • Автор: Brovin Yaroslav
      FireMonkey позволяет гибко управлять видимостью статус бара под iOS. Причем управление видимостью происходит на уровне каждой формы по отдельности.
       
      Видимость системного статус бара в рамках одной формы управляется через свойство формы TForm.BorderStyle.
      Значение TBorderStyle.bsNone скрывает системный тулбар для формы  растягивает форму на весь экран. Все остальные значения отличные от TBorderStyle.bsNone отображают статус бар  
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу