Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];

Вниз

Как сделать снимок(скриншот) формы во время исполнения?   Найти похожие ветки 

 
Starkom   (2002-08-26 14:02) [0]

Есть хранилище форм в БД, и надо сделать функцию превью, которая бы просто отображала внешний вид формы.
Как это сделать лучше?
Форма сама сконструированная есть. По идее, взять канвас и как-нибудь этот канвас отобразить в превью-панели. А вот как?


 
Skier   (2002-08-26 14:05) [1]

>Starkom
TForm.GetFormImage ?


 
Starkom   (2002-08-26 14:18) [2]

2 Skier:
спасибо, НО результат не совсем ожидаемый. На полученном отображении формы не отрисованы самописные компоненты. Это очень плохо, и непонятно почему так происходит.


 
Skier   (2002-08-26 14:49) [3]

>Starkom

Не поможет ?


function GetFormExImage(const AForm : TForm) : TBitmap;
begin
Result := nil;
if AForm = nil then Exit;
Result := TBitmap.Create;
Result.Height := AForm.ClientHeight;
Result.Width := AForm.ClientWidth;
Result.Canvas.Brush := AForm.Brush;
Result.Canvas.FillRect(AForm.ClientRect);
Result.Canvas.Lock;
try
Result.Canvas.CopyRect(Rect(0,
0,
Result.Width,
Result.Height),
AForm.Canvas,
AForm.ClientRect);
finally
Result.Canvas.UnLock;
end; //try
end; //GetFormExImage


//......................



procedure TForm1.Button2Click(Sender: TObject);
var
ABitmap : TBitmap;
begin
//......................
ABitmap := GetFormExImage(Self);
if ABitmap <> nil then begin
ABitmap.SaveToFile("C:\###\FormImage.bmp");
ABitmap.Free;
end; //if
//......................
end;


 
Starkom   (2002-08-27 07:55) [4]

2 skier: :)) спасибо за пример, но дело в том, что формы то самой не видно на экране. Она сконструирована в памяти, но отображать ее не надо, и даже нельзя. Для того то и делается превью.


 
Alx2   (2002-08-27 08:08) [5]

посмотри метод PaintTo


 
Starkom   (2002-08-27 08:18) [6]

2 alx2:
Не совсем разобрался с методом. Делаю так:
bmp:=TBitmap.Create();
tempForm.PaintTo(bmp.Handle,10,10);
DepositPreviewForm.Image1.Picture.Bitmap:=bmp;
DepositPreviewForm.Show;

Ничего не происходит. tempForm как раз нужная невидимая форма, снимок которой надо получить.


 
Starkom   (2002-08-27 08:21) [7]

посмотрел исходники GetFormImage:
PaintTo там и используется. А результат несовсем верен.



 
Alx2   (2002-08-27 08:23) [8]

Form2 еще не видна, но в Image, находящимся, например, на Form1, можно получить ее изображение, повесив на какую-нибудь кнопку из Form1 следущее:
Form2.PaintTo(Image1.Canvas,0,0);


 
Alx2   (2002-08-27 08:26) [9]

>Starkom (27.08.02 08:21)
Действительно :) Кое-что прорисовывается только при наличии видимой формы.


 
Starkom   (2002-08-27 08:53) [10]

в procedure TWinControl.PaintTo(DC: HDC; X, Y: Integer);
есть такой код -
if FWinControls <> nil then
for I := 0 to FWinControls.Count - 1 do
with TWinControl(FWinControls[I]) do
if Visible then PaintTo(DC, Left, Top);

Проблема в том, что в FWinControls не добавляются компоненты, потому то они и не отрисовываются. Почему в FWinControls их нет, непонятно. Как правильно добавлять компоненты?
У меня это делается так:
Grd:=TMyGrid.Create(Form); // TMyGrid-наследник TGrid. Form:TMyForm-наследник TForm.
ну и потом парентом выставляется TabSheet.
При таком коде вызывается TControl.Insert(), а в FWinControls компоненты вставляются при вызове TWinControl.Insert()!




 
Alx2   (2002-08-27 10:13) [11]

>Starkom (27.08.02 08:53)
Нужно обязательно чтобы у формы visible=true. Либо писать наследника формы.
Так получается, потому-что wincontrolы дохнут для Windows при visible=false и возрождаются при visible=true.

PS Детально не въезжал. Но истина где-то рядом :)


 
Starkom   (2002-08-27 11:18) [12]

:))
сделал
tempForm.Left:=-10000;
tempForm.Show;
bmp:=tempForm.GetFormImage;
и все заработало!
2 skier & Alx2: спасибо огромное.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
3-13949
minva
2002-08-15 22:49
2002.09.05
И снова приходится делать Insert


14-14263
MBo
2002-08-09 09:55
2002.09.05
Еще задачки ;)


1-14024
Анд
2002-08-26 14:35
2002.09.05
Как использовать анимированный курсор в программе?


3-13928
dimushkin
2002-08-14 17:15
2002.09.05
Проблема с LangDriver ом :-(


6-14199
Avallon
2002-06-30 00:06
2002.09.05
Как настроить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский