![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток!
Дали задание автоматизировать библиотеку института. При выполнении задания столкнулся с проблемой. Я создал в MS SQL 2008 таблицу посетителей библиотеки, одному из полей таблицы присвоил тип Image (для хранения фотографии). Подскажите, как теперь туда закидывать изображения? И как (уже при использовании программы), выбирая одну из строк в Grid'e, у меня (например, используя компонент Image) выводилась фотография читателя? Заранее благодрен! ![]() |
|
#2
|
|||
|
|||
|
я использовал тип BLOB для хранения картинок.
Загрузка выполняется путем вызова методов LoadFromFile/LoadFromStream у поля. В TImage потом загружается "руками" опять же через SaveToStream. Почему использовал BLOB - что бы хранить в БД картинки в виде JPEG, т.к. если пользоваться стандартным компонентом TImage, то дельфи норовит хранить их как Bitmap. |
|
#3
|
|||
|
|||
|
Цитата:
lmikle, если Вас не затруднит, не могли бы Вы написать код, как это надо реализовать...так как с потоками не работал! Буду очень признателен! |
|
#4
|
||||
|
||||
|
Ну вот так я писал как-то в блоб на MSSQL:
Код:
TBlobField(AdoQuery1.FieldByName('Photo')).LoadFromFile(OpenDialog1.Files.Strings[i]); |
|
#5
|
|||
|
|||
|
Код:
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('Temp.jpg', fmCreate);
TBlobField(Table.FieldByName('Photo')).SaveToStream(Stream);
Stream.Free;
Image1.Picture.LoadFromFile('Temp.jpg');
DeleteFile('Temp.jpg');
end; |
|
#6
|
|||
|
|||
|
А класс TBlobField в коде необходимо определять (TBlobField = class(TField))?
|
|
#7
|
||||
|
||||
|
Нет, это уже предопределенный класс со своими методами в DB.
|
|
#8
|
|||
|
|||
|
Ни один из предложенных методов решения этой проблемы не помогает!
Если я использую то, что предложил Страдалецъ, то вылетает ошибка "List index out of bounds..." Если использую то, что предложил Kapitoshka438, то ошибка не вылетает, но в то же время записи изображения в таблицу не происходит! Даже не знаю, что и делать... ![]() |
|
#9
|
|||
|
|||
|
дык ты измени то что предложил Страдалецъ, например вот так:
Код:
TBlobField(AdoQuery1.FieldByName('Photo')).LoadFromFile(OpenDialog1.FileName);P.S. в его способе записывается несколько выбранных файлов в цикле i Последний раз редактировалось Assistant, 06.03.2011 в 14:54. |
|
#10
|
|||
|
|||
|
Цитата:
Кстати, попробовал немного иначе сделать: Код:
var MS : TFileStream;
i: Integer;
begin
MS := TFileStream.Create('D:\1\1.bmp',fmOpenReadWrite);
with ADOQuery1 do try
SQL.Text := 'Insert Into temptable (photo) Values (:pmphoto)';
Parameters.ParamByName('pmphoto').LoadFromStream(MS, ftBlob);
ExecSQL;
finally
MS.Free;
end;
end;Проверяю в MS SQL - файл записывается...но почему-то Grid в программе очищается. |
|
#11
|
|||
|
|||
|
а грид привязан к ADOQuery1?
|
|
#12
|
|||
|
|||
|
Цитата:
Я добавляю изображение в таблицу при нажатии кнопки...так что изначально все данные в Grid'e есть..но после нажатия исчезают! |
|
#13
|
|||
|
|||
|
Код:
with ADOQuery1 do try SQL.Text := 'Insert Into temptable (photo) Values (:pmphoto)'; Последний раз редактировалось Assistant, 06.03.2011 в 16:03. |
|
#14
|
|||
|
|||
|
Цитата:
Вот ответ на первый вопрос: Код:
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(Stream);
TBlobField(Table.FieldByName('Photo')).LoadFromStream(Stream);
Stream.Free;
end;Последний раз редактировалось Kapitoshka438, 06.03.2011 в 16:52. |
|
#15
|
|||
|
|||
|
Цитата:
При работе с событием AfterScroll почему-то вообще ничего не происходит! Также попытался вывести изображение (но уже в другой Image) с помощью Код:
Image2.Picture.Graphic.LoadFromStream(Stream); |