![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация try finally [D6]
Sandman25 © (2004-09-09 15:33:00)Доброе время суток.
Помогите, пожалуйста, сделать код более красивым.
С помощью 2 Bitmap и 1 JpegImage пытаюсь показать обработанную картинку, при этом чтобы не было более 2 объектов в памяти.
uses
JPeg, Graphics;
procedure LoadJpeg(const FileName: string; Picture: TPicture);
var
JpegImage : TJPEGImage;
Bmp1, Bmp2 : TBitmap;
begin
Bmp1 := nil;
Bmp2 := nil;
JpegImage := TJPEGImage.Create;
try
JpegImage.LoadFromFile(FileName);
Bmp1 := TBitmap.Create;
try
Bmp1.Assign(JpegImage);
except
Bmp1.Free;
raise
end
finally
JpegImage.Free;
end;
try
Bmp2 := TBitmap.Create;
try
//RotateBitmap(Bmp1, Bmp2, 180);
except
Bmp2.Free;
raise
end
finally
Bmp1.Free;
end;
try
Picture.Assign(Bmp2);
finally
Bmp2.Free
end
end;
(2004-09-09 17:27:00) [1]Удалено модератором
DiamondShark (2004-09-09 17:23:00) [2]Объявим конкурс на самый красивый код?
Sandman25 (2004-09-09 16:55:00) [3][11] AlexSV (09.09.04 16:40)
Picture.Bitmap - тоже объект.
Bmp1 следует удалять до присвоения Picture.
(2004-09-09 16:45:00) [4]Удалено модератором
AlexSV (2004-09-09 16:40:00) [5]два, поскольку выше
...
finally
// разрушили JpegImage - уже не нужен
JpegImage.Free;
end;
// создали Bmp2
Bmp2 := TBitmap.Create;
...
При этом JpegImage.Free; надо читать FreeAndNil(JpegImage)
чтоб в блоке
...
except
if (JpegImage <> nil) then
JpegImage.Free;
...
все сложилось,
и так же Bmp2.Free надо читать FreeAndNil(Bmp2)
Sandman25 (2004-09-09 16:35:00) [6][9] AlexSV (09.09.04 16:31)
При выполнении Picture.Assign(Bmp2) будет 3 объекта.
AlexSV (2004-09-09 16:31:00) [7]> Sandman25
Прошу прощения, что после спасибо, но рискну предложить свой вариант:
procedure LoadJpeg(const FileName: string; Picture: TPicture);
var
JpegImage : TJPEGImage;
Bmp1, Bmp2 : TBitmap;
begin
Bmp1 := nil;
Bmp2 := nil;
JpegImage := nil;
Bmp1 := TBitmap.Create;
try
try
JpegImage := TJPEGImage.Create;
try
JpegImage.LoadFromFile(FileName);
Bmp1.Assign(JpegImage);
finally
JpegImage.Free;
end;
Bmp2 := TBitmap.Create;
try
RotateBitmap(Bmp1, Bmp2, 180);
Picture.Assign(Bmp2);
finally
Bmp2.Free
end
except
if (JpegImage <> nil) then
JpegImage.Free;
if (Bmp2 <> nil) then
Bmp2.Free;
raise
end
finally
Bmp1.Free;
end;
end;
Sandman25 (2004-09-09 16:13:00) [8]>Так он у тебя закоментирован был :о)
Чтобы у людей не возникала ошибка компиляции :)
Ega23 (2004-09-09 16:06:00) [9]Sandman25 © (09.09.04 15:42) [3]
Так он у тебя закоментирован был :о)
Sandman25 (2004-09-09 15:58:00) [10]Всем огромное спасибо!
DiamondShark (2004-09-09 15:55:00) [11]procedure LoadJpeg(const FileName: string; Picture: TPicture);
var
JpegImage : TJPEGImage;
Bmp1, Bmp2 : TBitmap;
begin
Bmp1 := nil;
Bmp2 := nil;
JPegImage := nil;
try
JpegImage := TJPEGImage.Create;
JpegImage.LoadFromFile(FileName);
Bmp1 := TBitmap.Create;
Bmp1.Assign(JpegImage);
FreeAndNil(JpegImage);
Bmp2 := TBitmap.Create;
RotateBitmap(Bmp1, Bmp2, 180);
FreeAndNil(Bmp1);
Picture.Assign(Bmp2);
finally
Bmp1.Free;
Bmp2.Free;
JPegImage.Free;
end
end;
Юрий Зотов (2004-09-09 15:52:00) [12]В памяти одновременно существуют не более 2-х объектов, причем только на то время, когда они оба реально нужны.
JpegImage := TJPEGImage.Create;
try
JpegImage.LoadFromFile(FileName);
Bmp1 := TBitmap.Create;
try
Bmp1.Assign(JpegImage);
FreeAndNil(JpegImage);
Bmp2 := TBitmap.Create;
try
RotateBitmap(Bmp1, Bmp2, 180);
FreeAndNil(Bmp1)
finally
Bmp2.Free
end
finally
if Bmp1 <> nil then
Bmp1.Free
end
finally
if JpegImage <> nil then
JpegImage.Free
end;
Sandman25 (2004-09-09 15:42:00) [13]RotateBitmap требует 2 параметра типа TBitmap, причем разные
Ega23 (2004-09-09 15:37:00) [14]И вообще, зачем тебе Bmp2?????
Sandman25 (2004-09-09 15:35:00) [15]Первые два присвоения Bmp1 :=nil просьба игнорировать.