Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Про отображение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
1-1121163862
ANB
2005-07-12 14:24
2005.07.31
Как достать текстовое значение Enumeration переменной ?


14-1120835121
Piter
2005-07-08 19:05
2005.07.31
Никто не хочет нанять на работу перспективных программистов?


9-1113590175
elf_123
2005-04-15 22:36
2005.07.31
DLL+OpenGL


14-1120484902
GRAND25
2005-07-04 17:48
2005.07.31
Воровство или мудрая политика в национальных интересах?


1-1121085218
paul_k
2005-07-11 16:33
2005.07.31
Как всегда наступил на грабли под названием AV В чем тут ошибка?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский