Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.13;
Скачать: CL | DM;

Вниз

Выгрузка PNG и PDF из BLOB а   Найти похожие ветки 

 
RomanH ©   (2006-06-06 13:04) [0]

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


 
unknown ©   (2006-06-06 13:09) [1]

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


 
RomanH ©   (2006-06-06 14:38) [2]

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


 
unknown ©   (2006-06-06 16:30) [3]

Что-то типа этого:
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 17:22) [4]

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


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

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


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

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

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


 
Desdechado ©   (2006-06-07 17:50) [6]

с точностью до наоборот
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 18:23) [7]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.08.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.051 c
15-1152966255
Юрий Зотов
2006-07-15 16:24
2006.08.13
2 stone: Олег, позвони мне, пожалуйста.


2-1153752574
VitV
2006-07-24 18:49
2006.08.13
Delphi+Interbase - организация таблиц


2-1153659312
vain
2006-07-23 16:55
2006.08.13
DelphiX


15-1152912172
Servelat
2006-07-15 01:22
2006.08.13
Вопрос про си (компилятор MVC дот нет он же визуал студио 2005)


6-1143539218
Alkid
2006-03-28 13:46
2006.08.13
FastNet