Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
1-1105609194
Vetal
2005-01-13 12:39
2005.01.23
А как изменить цвет кнопки?


1-1104701792
iskatel
2005-01-03 00:36
2005.01.23
тома для восстановления


4-1102015586
Neiron
2004-12-02 22:26
2005.01.23
Удаление секций из PE файла


4-1102426223
Diaskhan
2004-12-07 16:30
2005.01.23
Как посредством winapi в Delphi создать SysListView32 ?


3-1103521111
КаПиБаРа
2004-12-20 08:38
2005.01.23
Алгоритм реализации расчетов на основе БД