Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Про отображение BLOB типа jpeg в DBImage [D6, Win2k]


Курдль ©   (2005-07-12 12:16:00) 

Напрасно закрыли обсуждение - я нашел решение и мне не жалко поделиться:

     stm := TMemoryStream.Create;
     jpg := TJPEGImage.Create;
     sdqDataIMG_BODY.SaveToStream(stm);
     stm.Seek(0, soFromBeginning);
     jpg.LoadFromStream(stm);
     Image1.Picture.Graphic := jpg;


Ega23   (2005-07-14 19:33:00) [1]

Но вариант 2 лучше - он не маскирует внешних ошибок.

А... Ну да... Я невнимательно первый раз посмотрел.
Действительно, наиболее красиво получается.
Спасибо.


Юрий Зотов   (2005-07-14 19:27:00) [2]

> Ega23 ©   (14.07.05 19:20) [13]

См. [6].
Вариант 1 - оно самое и есть.
Но вариант 2 лучше - он не маскирует внешних ошибок.


Ega23   (2005-07-14 19:20:00) [3]

2 Юрий Зотов ©   (14.07.05 19:17) [12]
В таком случае вопрос: как правильно написать такую функцию? Которая по каким-то входным параметрам создаёт внутри себя объект, корректно с ним работает и возвращает его в качестве результата?
А при возникновении ошибки возвращает nil?


Юрий Зотов   (2005-07-14 19:17:00) [4]

> Ega23 ©   (14.07.05 18:55) [11]

> Ошибка в констукторе также должна дать исключение на P.Free,

Именно. Вот как раз поэтому вызов конструктора и должен стоять непосредственно ПЕРЕД защищенным блоком, а не ВНУТРИ него.

> Лечится явной инициализацией Result:=nil; в начале функции.

Лечится, но зачем производить операции, без которых вполне можно и обойтись?


Ega23   (2005-07-14 18:55:00) [5]

2 Юрий Зотов ©   (14.07.05 18:08) [10]

Причина №2 принимается. Действительно "лечится" простым raise, если таковой по логике программы нужен.

Причина №1:

procedure FreeAndNil(var Obj);
var
 P: TObject;
begin
 P := TObject(Obj);
 TObject(Obj) := nil;  // clear the reference before destroying the object
 P.Free;
end;

Ошибка в констукторе также должна дать исключение на P.Free, разве нет?
Насколько я понимаю, лечится явной инициализацией Result:=nil; в начале функции.


Юрий Зотов   (2005-07-14 18:08:00) [6]

> Ega23

Причина № 1.

function JPEGToBitmap(jpg:TJPEGImage; BmpSize:TRect):TBitmap;
begin
// Здесь Result содержит любое случайное значение.
 try
   Result:=TBitmap.Create; // Допустим, здесь возникла ошибка.
   Result.Canvas.StretchDraw(BmpSize, jpg);
 except
   if Result<>nil then // Условие выполнилось.
   begin
     Result.Free; // Получили второе исключение и вылетели.
     Result:=nil;
   end;  
 end;
end;

Причина № 2.

function JPEGToBitmap(jpg:TJPEGImage; BmpSize:TRect):TBitmap;
begin
// Допустим, Jpg по каким-то внешним причинам неверно.
 try
   Result:=TBitmap.Create;
   Result.Canvas.StretchDraw(BmpSize, jpg); // Возникла ошибка.
 except
   if Result<>nil then // Условие выполнилось.
   begin
     Result.Free; // Уничтожили Result, погасили исключение.
     Result:=nil; // Программа не работает, почему - непонятно.
   end;  
 end;
end;


begin...end   (2005-07-14 17:36:00) [7]

> evvcom ©   (14.07.05 17:34) [8]
> Проблема не в if Result<>nil

Это, конечно, не проблема, но эта проверка не нужна.


evvcom   (2005-07-14 17:34:00) [8]


> Ega23 ©   (14.07.05 16:22) [7]

Проблема не в if Result<>nil then а в выносе Create перед try


Ega23   (2005-07-14 16:22:00) [9]

2 Юрий Зотов ©   (14.07.05 16:18) [6]
А чем
 if Result<>nil then
 begin
  Result.Free;
  Result:=nil;
 end;  

уже FreeAndNil(Result)  ?


Юрий Зотов   (2005-07-14 16:18:00) [10]

> Ega23 ©   (12.07.05 12:36) [2]

Срочно исправьте код:

function JPEGToBitmap(Jpg: TJPEGImage; BmpSize: TRect): TBitmap;
begin
 Result := TBitmap.Create;
 try
   Result.Canvas.StretchDraw(BmpSize, Jpg)
 except
   FreeAndNil(Result)
 end
end;

А еще лучше - не маскировать ошибки и честно возбуждать исключение. Легче отлаживаться будет, ежели что.

function JPEGToBitmap(Jpg: TJPEGImage; BmpSize: TRect): TBitmap;
begin
 Result := TBitmap.Create;
 try
   Result.Canvas.StretchDraw(BmpSize, Jpg)
 except
   Result.Free;
   raise
 end
end;


  (2005-07-14 16:01:00) [11]

Удалено модератором


Ega23   (2005-07-12 13:48:00) [12]

Ну заведи в запросе ещё одно image-поле, на клиента возвращай его как NULL. На клиенте пеоеопредели событие TDataSet.AfterOpen, где и пробеги по всему НД и заполни это поле.

Это как один из вариантов.


Курдль   (2005-07-12 13:45:00) [13]


Надо будет calculate-поле делать для отображения картинок на гриде.


Ага! BLOB, Graphics и т.п. calculate-ными не назначаются..  :(

Что делать?


Ega23   (2005-07-12 12:36:00) [14]

Ну в bmp конвертить - проще простого:

function JPEGToBitmap(jpg:TJPEGImage; BmpSize:TRect):TBitmap;
begin
try
 Result:=TBitmap.Create;
 Result.Canvas.StretchDraw(BmpSize, jpg);
except
 if Result<>nil then
  begin
   Result.Free;
   Result:=nil;
  end;  
end;

end;


Курдль   (2005-07-12 12:28:00) [15]


Ega23 ©   (12.07.05 10:46) [12]

Другой вариант - конвертить в bmp и рисовать уже bmp прямо на Canvas.


Вот это мне тоже интересно. Надо будет calculate-поле делать для отображения картинок на гриде. Т.е. сконвертить в bmp и уменьшить.

Не натолкнете на мысль?


Наверх

Титульная страница Поиск, карта сайта Написать письмо