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

Вниз

Оптимизация 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
14-1093712962
Piter
2004-08-28 21:09
2004.09.26
Забавно... учитесь, автовладельцы! :)


4-1092476916
Nomolos
2004-08-14 13:48
2004.09.26
Добавить свой пункт в меню "Найти"


14-1094211909
syte_ser78
2004-09-03 15:45
2004.09.26
Принцип работы бумажной почты


1-1094936271
Uroboros
2004-09-12 00:57
2004.09.26
Мультистрочная палитка компонентов


1-1094571065
Marina
2004-09-07 19:31
2004.09.26
Подключение к проекту файлов с расширением *.inc