Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выгрузка PNG и PDF из BLOB'а [D7, IB7.5]


RomanH ©   (2006-06-06 13:04:00) 

Добрый день мастера.В BLOB'е записанны данные,загруженные
с png-файла, а так же с pdf-файла. Подскажите каким образом
можно выгрузить эти данные из BLOB'а и отобразить.


Vic111   (2006-06-07 18:23:00) [1]

Может если туплю, простите.

Но если запускаю через ShellExecute, то открываю в ворд, делаю изменения, сохраняю файл и затем в своей проге зятягиваю его снова в блоб-поле подсказанным Desdechado ©  способом.

Чтобы не повторять предыдущие манипуляции - гружу в контейнер, тут же на форме будет доступна кнопка сохранить. Но когда редактирую в контейнере - ворд же не дает сохранить файл при работе в контейнере, а файл на диске находится в неизмененном состоянии.


Desdechado   (2006-06-07 17:50:00) [2]

с точностью до наоборот
Query1.Sql.Text :=
  'INSERT INTO testblob ' +
  ' ( ' +
  '  fBlob' +
  ' )' +
  ' VALUES' +
  ' (' +
  ' :ParamBlobField' +
  ')';
Query1.ParamByName('ParamBlobField').DataType := ftBlob;
Query1.ParamByName('ParamBlobField').ParamType := ptInput;
Query1.ParamByName('ParamBlobField').LoadFromFile('MyFile',ftBlob);
Query1.ExecSql;


Vic111   (2006-06-07 17:43:00) [3]

Да, классно получается.

А вот если у меня хранятся ворд-файлы. Их гружу в ОЛЕконтейнер через создание файла на диске. А если были произведены изменения, как сохранить измененный уже файл в BLOB-pole.


RomanH   (2006-06-06 17:22:00) [4]

Спасибо Вам за очень подробную информацию.


> Но лучше все-таки отображать эти данные по желанию пользователя.
>
> Т.к. нехорошо это, тащить на клиента blob-ы.

А я об этом даже не подумал.(Если не этот совет, не представляю на сколько медленней будет работать программа).
Спасибо


unknown   (2006-06-06 16:30:00) [5]

Что-то типа этого:
procedure TForm1.IBQuery1AfterScroll(DataSet: TDataSet);
var
 FileName: string;
begin
 FileName := ExtractFilePath(Application.ExeName) + 'temp\';
 ForceDirectories(FileName);
 FileName := FileName + DataSet.FieldByName('FILENAME').AsString;
 DeleteFile(FileName);
 try
   TBlobField(DataSet.FieldByName('BODY')).SaveToFile(FileName);
   OleContainer1.CreateLinkToFile(FileName, False);
 except
 end;
end;

Это для pdf.
Но лучше все-таки отображать эти данные по желанию пользователя.
Т.к. нехорошо это, тащить на клиента blob-ы.
Лучше по нажатию на кнопку формировать запрос и вытягивать конкретную
запись, из которой уже извлекать данные из блоб поля и отображать
с пом. createprocess.
Например вот так :

var
 si: Tstartupinfo;
 p: Tprocessinformation;
......
procedure TMainForm.FilesGridColumns2EditButtonClick(Sender: TObject;
 var Handled: Boolean);

var
 FileName: string;
 ABCEdit: string;
 Msg: tagMsg;

begin
 Data.Tmp.Active:=False;
 Data.Tmp.SQl.Text:='SELECT BODY FROM ABC_FILES WHERE ID='+
   Data.ViewQuery.FieldByName('ID').AsString;
 Data.Tmp.Active:=True;
 FileName := ExtractFileDir(Application.ExeName) + '\temp\';
 ABCEdit := ExtractFileDir(Application.ExeName) + '\ABCEDIT.EXE';
 FileName := FileName + Trim(Data.ViewQuery.FieldByName('FILENAME').AsString);
 ForceDirecTories(ExtractFileDir(FileName));
 SysUtils.DeleteFile(FileName);
 TBlobField(Data.Tmp.Fields[0]).SaveToFile(FileName);
 Data.Tmp.Active:=False;  
 FillChar(Si, SizeOf(Si), 0);
 with Si do
 begin
   cb := SizeOf(Si);
   dwFlags := startf_UseShowWindow;
   wShowWindow := 4;
 end;
 Createprocess(nil, PAnsiChar('"' + ABCEdit + '" ' + FileName), nil, nil,
   False, Create_default_error_mode, nil, nil, si, p);

{ Для красивости будем отрисовывать главное окно при выполнении внешнего процесса}
 while true do
 begin
   case MsgWaitForMultipleObjects(1, p.hProcess, false, INFINITE, QS_PAINT) of
     WAIT_OBJECT_0:
     begin
       Break;
     end;
     WAIT_OBJECT_0 + 1:
{В очереди появились WM_PAINT, выбираем только их и перенаправляем окнам}
     begin
       while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) do
       begin
         DispatchMessage(Msg);
       end;
     end;
   end;
 end;
 CloseHandle(p.hProcess);
 CloseHandle(p.hThread);
 SysUtils.DeleteFile(FileName);
 RemoveDir(ExtractFilePath(FileName));
end;


RomanH   (2006-06-06 14:38:00) [6]

Отобразить при Scrolling'е таблицы.


unknown   (2006-06-06 13:09:00) [7]

TBlobField(Query.Fieldbyname('abc')).SaveToFile(FileName);
Отобразить - или shellexecute или olecontainer - как надо?


Наверх

Титульная страница Поиск, карта сайта Написать письмо