Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизОптимизация try finally Найти похожие ветки
← →
Sandman25 © (2004-09-09 15:33) [0]Доброе время суток.
Помогите, пожалуйста, сделать код более красивым.
С помощью 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;
← →
Sandman25 © (2004-09-09 15:35) [1]Первые два присвоения Bmp1 :=nil просьба игнорировать.
← →
Ega23 © (2004-09-09 15:37) [2]И вообще, зачем тебе Bmp2?????
← →
Sandman25 © (2004-09-09 15:42) [3]RotateBitmap требует 2 параметра типа TBitmap, причем разные
← →
Юрий Зотов © (2004-09-09 15:52) [4]В памяти одновременно существуют не более 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;
← →
DiamondShark © (2004-09-09 15:55) [5]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;
← →
Sandman25 © (2004-09-09 15:58) [6]Всем огромное спасибо!
← →
Ega23 © (2004-09-09 16:06) [7]Sandman25 © (09.09.04 15:42) [3]
Так он у тебя закоментирован был :о)
← →
Sandman25 © (2004-09-09 16:13) [8]>Так он у тебя закоментирован был :о)
Чтобы у людей не возникала ошибка компиляции :)
← →
AlexSV (2004-09-09 16:31) [9]> 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:35) [10][9] AlexSV (09.09.04 16:31)
При выполнении Picture.Assign(Bmp2) будет 3 объекта.
← →
AlexSV (2004-09-09 16:40) [11]два, поскольку выше
...
finally
// разрушили JpegImage - уже не нужен
JpegImage.Free;
end;
// создали Bmp2
Bmp2 := TBitmap.Create;
...
При этом JpegImage.Free; надо читать FreeAndNil(JpegImage)
чтоб в блоке
...
except
if (JpegImage <> nil) then
JpegImage.Free;
...
все сложилось,
и так же Bmp2.Free надо читать FreeAndNil(Bmp2)
← →
имя (2004-09-09 16:45) [12]Удалено модератором
← →
Sandman25 © (2004-09-09 16:55) [13][11] AlexSV (09.09.04 16:40)
Picture.Bitmap - тоже объект.
Bmp1 следует удалять до присвоения Picture.
← →
DiamondShark © (2004-09-09 17:23) [14]Объявим конкурс на самый красивый код?
← →
имя (2004-09-09 17:27) [15]Удалено модератором
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c