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

Вниз

Про отображение BLOB типа jpeg в DBImage   Найти похожие ветки 

 
Курдль   (2005-07-12 12:16) [0]

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

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


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


Ega23 ©   (12.07.05 10:46) [12]

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


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

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


 
Ega23 ©   (2005-07-12 12:36) [2]

Ну в 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 13:45) [3]


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


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

Что делать?


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

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

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


 
имя   (2005-07-14 16:01) [5]

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


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

> 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;


 
Ega23 ©   (2005-07-14 16:22) [7]

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

уже FreeAndNil(Result)  ?


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


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

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


 
begin...end ©   (2005-07-14 17:36) [9]

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

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


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

> 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;


 
Ega23 ©   (2005-07-14 18:55) [11]

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 19:17) [12]

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

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

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

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

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


 
Ega23 ©   (2005-07-14 19:20) [13]

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


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

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

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


 
Ega23 ©   (2005-07-14 19:33) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
14-1121147519
Керк
2005-07-12 09:51
2005.07.31
Посоветуйте две ссылки. Электронные. Можно больше.


1-1121248786
Kray
2005-07-13 13:59
2005.07.31
Менеджер проектов


3-1119383683
Alex Romanskiy
2005-06-21 23:54
2005.07.31
Объявление UDF


9-1113654004
Fords
2005-04-16 16:20
2005.07.31
Кому надо


1-1121390392
qwerte
2005-07-15 05:19
2005.07.31
Почему поиск не раболтает?