Текущий архив: 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.48 MB
Время: 0.049 c