Форум: "Основная";
Текущий архив: 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.042 c