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

Вниз

О захвате экрана   Найти похожие ветки 

 
schooll   (2005-01-07 09:03) [0]

Как можно захватить (скопировать в файл) экран? Может где исходник валяется? Можно на TP7.


 
Asinus   (2005-01-07 11:38) [1]

На TP7 невозможно написать программу для захвата Windows-экрана.


 
VMcL ©   (2005-01-07 11:57) [2]

function GetScreenshotBitmap: TBitmap;
var
 DC: HDC;
 R: TRect;
 Window: HWND;
begin
 Result := TBitmap.Create;
 with Result do
   try
     PixelFormat := pf24bit;
     Transparent := False;
     Window := GetDesktopWindow;
     DC := GetWindowDC(Window);
     try
       GetWindowRect(Window, R);
       Width := R.Right - R.Left;
       Height := R.Bottom - R.Top;
       BitBlt(Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
     finally
       ReleaseDC(Window, DC);
     end;
   except
     Free;
     raise;
   end;
end;

function GetScreenshotJpeg: TJpegImage;
var
 TempBmp: TBitmap;
begin
 TempBmp := GetScreenshotBitmap;
 try
   Result := TJPEGImage.Create;
   with Result do
     try
       Grayscale := False;
       CompressionQuality := 100;
       Performance := jpBestQuality;
       ProgressiveDisplay := False;
       PixelFormat := jf24Bit;
       Assign(TempBmp);
     except
       Free;
       raise;
     end;
 finally
   FreeAndNil(TempBmp);
 end;
end;


 
begin...end ©   (2005-01-07 12:11) [3]

> [2] VMcL ©   (07.01.05 11:57)

> except
>   Free;
>   raise;
> end;

Если Вас не затруднит, объясните, пожалуйста, для чего так делать? Уже не первый раз такое вижу, но никак не могу понять.


 
VMcL ©   (2005-01-07 12:31) [4]

>>begin...end ©  (07.01.05 12:11) [3]

Так следует делать, если 1) созданный объект является результатом функции/процедуры и 2) функция/процедура не берёт на себя обработку исключений.

Функции в примере [2] работают в качестве конструкторов объектов некоторых классов. Поэтому можно провести аналогию: если объект не может быть создан корректно, то задействованные им ресурсы должны быть освобождены (в том числе занимаемая им память) и должно вызваться исключение.

Думаю, на примере будет понятнее:

procedure TForm1.Button1Click(Sender: TObject);
var
 Bmp: TBitmap;
begin
 Bmp := GetScreenshotBitmap;  // сравните с Bmp := TBitmap.Create;
 try
   Bmp.SaveToFile("C:\123.bmp");
 finally
   Bmp.Free;
 end;
end;


 
Gero ©   (2005-01-07 12:31) [5]


> begin...end ©   (07.01.05 12:11)

Ну как зачем, чтобы генерировать исключение.


 
begin...end ©   (2005-01-07 12:43) [6]

> [4] VMcL ©   (07.01.05 12:31)

Большое спасибо.


 
VMcL ©   (2005-01-07 15:41) [7]

>>Gero ©  (07.01.05 12:31) [5]

Не генерировать, а регенерировать.


 
Александр Иванов ©   (2005-01-07 15:57) [8]

VMcL ©   (07.01.05 15:41) [7]

А почему не подходит просто finally, после него исключение не перехватывается, я использование
> except
>   raise;
> end;
по-моему необходимо, когда нужно видоизменить исключение.


 
Kerk ©   (2005-01-07 16:01) [9]


> На TP7 невозможно написать программу для захвата
> Windows-экрана.

Через DPMI можно попытаться извратиться..


 
begin...end ©   (2005-01-07 16:30) [10]

> [8] Александр Иванов ©   (07.01.05 15:57)

> А почему не подходит просто finally

Потому что в этом случае нормального результата у функции (она возвращает ссылку на объект) не будет по-любому.


 
Александр Иванов ©   (2005-01-07 17:00) [11]

begin...end ©   (07.01.05 16:30) [10]

Разве это не идентично по результату:
except
  Free;
  raise;
end;

и

finally
  Free;
end;


 
begin...end ©   (2005-01-07 17:19) [12]

> [11] Александр Иванов ©   (07.01.05 17:00)

Рассмотрим 2 варианта кода некоторой функции.

1.
begin
 ...
 try
   ...
 except
   Free;
   raise;
 end;
end.

До блока try...except создаётся некий объект. Переменной Result присваивается ссылка на него. В блоке try...except производятся какие-либо манипуляции с созданным объектом. Если во время этих манипуляций возникнет исключительная ситуация, объект уничтожается (про регенерацию исключения пока забудем). Если же ничего страшного не произошло, функция возвращает ссылку на созданный объект.

2.
begin
 ...
 try
   ...
 finally
   Free;
 end;
end.

Независимо от того, возникнет ли исключительная ситуация при работе с объектом в try...finally, объект будет уничтожен. Функция никогда не возвратит ссылку на созданный объект.

Я уже и в справке про это нашёл. :-) См. raising exceptions -> Re-raising exceptions.


 
Александр Иванов ©   (2005-01-07 17:33) [13]

Сории, сглупил. Забыл, что код в finnaly выполнится в любом случае.


 
Schooll   (2005-01-10 07:08) [14]

Что за DPMI? Как его использовать?



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

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

Наверх




Память: 0.48 MB
Время: 0.035 c
3-1102955048
Dmitrich
2004-12-13 19:24
2005.01.23
Большой текст


1-1105006087
Afonya
2005-01-06 13:08
2005.01.23
не могу найти DsgnIntf.dcu


8-1097753412
Black
2004-10-14 15:30
2005.01.23
Частота звука


1-1105539217
NeDum
2005-01-12 17:13
2005.01.23
ProgressBar


14-1104773042
Gero
2005-01-03 20:24
2005.01.23
Стишок





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский