Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.11.2015, 04:18
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
Печаль Отображение изображений из БД на форму

Доброго времени суток! Вопрос такой, и мучает очень!(
В БД есть таблица, содержащая индексы и изображения (объект OLE). Необходимо отображать все изображения на форме. И кликая, допустим, на одно из них оно копируется в таблицу с изображениями. Примерно как мы выбираем из изобилия смайлов нужный нам, и он отображается в нашем поле для текста сообщения. И еще эти выбранные изображения должны сохраняться в БД как последовательность, т.е. в одном поле последовательность индексов на изображения.
Подкиньте идеек как это сделать, свежим взглядом, так сказать, посмотрите, пожалуйста.
P.S. была идея изображения поместить в DrawGrid, т.к. изображений немало упорядочить немного и еще в DBCtrlGrid была идея поместить, но не увенчалось успехом, может что не правильно делала...(
Ответить с цитированием
  #2  
Старый 27.11.2015, 20:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если это что-то типа смайлов, то там сделано немного по другому. На самом деле там передается некоторая комбинация символов, которую уже клиент разпознаёт и вместо этих символов выводит изображение из своего списка. А уж как ты этот список будешь хранить - дело десятое.
Ответить с цитированием
  #3  
Старый 28.11.2015, 03:14
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как сохранять
Код:
 uses Jpeg;
procedure PictureToGraphicField(D: TDataSet; F: TField);
var
     FileName: TFileName;
     Bmp: TBitmap;
     jpg: TJPEGImage;
begin
   D:= F.DataSet; // множество данных, которое содержит поле F
   if D.Active then // если таблица открыта, то
    if D.RecordCount > 0 then // если в таблице есть записи, то
     if OpenPictureDialog1.Execute then // если файл картинки выбран, то
      begin
       if not (D.State in [dsEdit]) then D.Edit; // перевод таблицы в режим редактирования
       FileName:= OpenPictureDialog1.FileName; // имя файла с картинкой
       try
        Bmp:= TBitmap.Create; // создаем Bitmap в памяти
        jpg:= TJPEGImage.Create; // создаем JPEG
        jpg.CompressionQuality:= 100; // качество сжатия изображения
        jpg.Compress; // сжатие
        jpg.LoadFromFile(FileName); // загрузка
        bmp.Assign(jpg); // передача из JPEG в BMP
        F.Assign(bmp); // передача картинки из Bitmap в поле "Каринка"
        D.Post; // сохранение записи
       except // в случае исключительной ситуции делать:
        ShowMessage('Не удалось загрузить картинку.'); // сообщение об ошибке
        FreeAndNil(jpg); // освобождение памяти, занятой JPEG
        FreeAndNil(bmp); // освобождение памяти, занятой Bitmap
       end;
      end;

end;
использование
Код:
PictureToGraphicField(DataSource.DataSet,DataSource.DataSet.FieldByName('Картинка'));
Ответить с цитированием
  #4  
Старый 29.11.2015, 02:55
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо, очень полезная вещь, она мне пригодится
Но все же основная проблема не решена
У меня в БД есть таблица (Element), где хранятся изображения. Мне нужно "вытащить эти изображения" (все) на форму. Пусть коряво, но у меня получилось пока только так:
Код:
procedure TForm1.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var Im1: TBitmap;
begin
Im1:=TBitmap.Create;
if  (Column.FieldName='Symbol' ) then begin
with  DBGrid2.Canvas do begin
Brush.Color:=clWhite;
FillRect(Rect);
if (data.DataForm.Element.FieldByName('Ind').Value=1)
then begin
ImageList1.GetBitmap(0,Im1);
end else begin
ImageList1.GetBitmap(1,Im1);
end;
Draw(round((Rect.Left+Rect.Right-Im1.Width)/2),Rect.Top,Im1);
end;
end;
end;
Следующая задача передо мной это то, что я, грубо говоря, двойным нажатием мыши кликаю на ячейку с изображением в таблице и оно переносится в другую таблицу. Я могу сколько угодно добавлять из 1-ой таблицы во вторую изображений в ОДНУ ячейку (это важно), затем перевести фокус на др.ячейку и там также добавлять изображения. И вот из этой другой (второй) таблицы изображения автоматически заносятся в БД в таблицу (Tabl). Т.о. получается что таблица с изображениями это справочник своего рода, а в главной таблице хранятся индексы изображений
как то так

прошу Вас о помощи, и буду рада даже малейшей
Ответить с цитированием
  #5  
Старый 29.11.2015, 20:26
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AlSh17
...Мне нужно "вытащить эти изображения" (все) на форму...
Вот набросок как это можно сделать
Вложения
Тип файла: zip Element.zip (354.4 Кбайт, 13 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AlSh17 (30.11.2015)
  #6  
Старый 30.11.2015, 02:13
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ваши наброски работают, спасибо!)
Но только я вставляю в свой код пишет такую ошибку: Project raised exception class EAccessViolation with message 'Access Violation at address 0052bafa in module Project1.exe. Read of address 000002f4'
Я и Ваш полностью модуль добавляла в проект и копировала, не помогло. Изменяла - аналогичный результат(
И еще, этот вопрос покажется глупым, но у Вас БД изображения хранятся как двоичные данные, как Вы это сделали? У меня тот же тип данных, но хранится как "Пакет"
Ответить с цитированием
  #7  
Старый 01.12.2015, 12:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AlSh17
...изображения хранятся как двоичные данные...
Собсно вся инфа уже в топке, функция заноса приведена, но если что-то непонятно, то вот небольшая переработка того же самого, только с управлением содержимым таблиц
Вложения
Тип файла: zip AlSh17.zip (274.7 Кбайт, 14 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AlSh17 (02.12.2015)
  #8  
Старый 02.12.2015, 01:07
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не работает кнопка сохранения в БД - ни ошибок ничего не выдает, а тем не менее не сохранят(((
Ответить с цитированием
  #9  
Старый 03.12.2015, 12:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AlSh17
Не работает кнопка сохранения...
Да она и не подключена на сохранение, как собрать цепочку из рисунков я там вам показал, а дальше... просто у нас форум - обучающий т.е. задача дать толчок для ТС в нужном направлении, а если у него (у вас) нет желания что-то решать самостоятельно, то тогда милостипросимо в раздел "работа" или "коднашару", там таких ответов точно не будет
Ответить с цитированием
  #10  
Старый 04.12.2015, 21:58
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Поняла Желание есть, нет времени и дается тяжко
спасибо Вам за помощь)
Теоретические вопросы задам:
1. У Вас кликая на табл. DBGrid2 столбец Theard в ScrollBox2 появляются сохраненные в БД изображения, я так поняла выделяется вся строка, а т.к. там всего один столбец картинки появляются. у меня их больше чем 1 столбец, поэтому появляется ошибки о несоответствии типов. Можно ли сделать так чтобы выделяя всю строку в ScrollBox2 заносились картинки из одной ячейки где хранятся индексы?
2. Можно ли вывести на печать документ, шаблон его в MS Word, из Delphi? я читала что это возможно, но для этого какие нужны компоненты на форму кидать? их дополнительно скачивать нужно?
3. Можно ли с помощью команды SQL Insert добавить запись в БД где информация находится в определенных столбах, а не полностью описывать все поля что есть и всем им присваивать значения?

Последний раз редактировалось AlSh17, 05.12.2015 в 00:07.
Ответить с цитированием
  #11  
Старый 05.12.2015, 08:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп:
Извнт, не умею на гуще гадать, мож выходит что я думаю одно, а вы - вероятно совсем другое, диалог слепого с глухим, и точно не знаю, может уже тупиковая ветка образовалась

По теме: принцип примерно такой - в tabl.theard чисто текстовая инфа, там просто через разделитель (,) идут индексы картинок из Element.ID, при считывании происходит разбор этой строки и показ на ScrollBox2 картинок по этим значениям из каталога, самих рисунков там нет
Ответить с цитированием
  #12  
Старый 06.12.2015, 01:28
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
при считывании происходит разбор этой строки и показ на ScrollBox2
Считывание строки, т.е. выделяется вся строка, со всеми его полями. У Вас в табл. одно поле - thread, поэтому считывание строки идет без ошибок. А если у меня полей много, они все выделяются, и возникает ошибка о несоответствии типов. Это как то решается? Я должна какую-то функцию добавить, чтоб при считывании строки в ScrollBox2 уходили данные чисто из поля с индексами изображений?

Еще такой вопрос возник: печать и вывод информации в MS Word я осилила, а вот вывод изображений из ScrollBox2 нет( не подскажите через что и как это реализовывать?Пожалуйста.

Последний раз редактировалось AlSh17, 07.12.2015 в 03:00.
Ответить с цитированием
  #13  
Старый 07.12.2015, 14:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AlSh17
...чтоб при считывании строки в ScrollBox2 уходили данные чисто из поля с индексами изображений...
Можно добавить проверку кликнутого поля, в случае вышележащей сборки примерно так
Код:
procedure TForm1.DBGrid2CellClick(Column: TColumn);
begin
 if Column.FieldName = 'thread' then zgr(Column.Field.AsString);
end;
Ответить с цитированием
  #14  
Старый 09.12.2015, 00:37
AlSh17 AlSh17 вне форума
Прохожий
 
Регистрация: 27.11.2015
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не работает когда просто не реагирует на клик, когда ошибку выдает
Не знаете ли Вы как из Scrollbox2 изображения в документ ворда перекинуть программно? получается я заполняю данными DBEdit, Scrollbox2 изображениями и все это дружно кидается в ворд. данные из DBEdit благополучно переносятся из проги в ворд, а вот изображения нет
Ответить с цитированием
  #15  
Старый 09.12.2015, 01:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AlSh17
...как из Scrollbox2 изображения в документ ворда перекинуть программно?
Зачем из Scrollbox, когда изображения в базе и так лежат? Можно выполнить это "псевдо-программно", загнать рисунуко из имиджа в clipboard и из него уже в сам документ напр.
Код:
Clipboard.Assign(DBImage1.Picture);
vstart:=1;
vend:=2;
WordDocument1.Frames.Add(WordDocument1.Range(vstart,vend));
i:=1;
WordDocument1.Frames.Item(i).Height:=DBImage1.Height;
WordDocument1.Frames.Item(i).Width:=DBImage1.Width;
WordDocument1.Frames.Item(i).Select;
WordApplication1.Selection.Paste;
если рамка вокруг рисунка не нужна (текстовая вставка, в ней может находиться не только текст, но и картинка, чем и пользуемся чтоб руками размер не подгонять) то добавьте сторчку WordDocument1.Frames.Item(i).Delete;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter