Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
1-1094822942
denis24
2004-09-10 17:29
2004.09.26
Скролинг в listview


9-1085478560
nexxiss
2004-05-25 13:49
2004.09.26
D3D fullscreen


4-1092231784
Ivan0001
2004-08-11 17:43
2004.09.26
Как изменить рабочий каталог другого приложения?


4-1090559942
Delphi5.01
2004-07-23 09:19
2004.09.26
Poluchenie sistemnogo vremeni v 24 rejime!


4-1092711543
FastByte
2004-08-17 06:59
2004.09.26
Переключение рус./лат.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский