Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

Выгрузка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.035 c
6-1139988013
maep
2006-02-15 10:20
2006.08.13
SOAP, вызов метода веб сервиса


3-1149675879
irena
2006-06-07 14:24
2006.08.13
MSSql: редактирование длинных полей varchar(1024)


15-1152657756
SPeller
2006-07-12 02:42
2006.08.13
Снова борьба с альтернативными ICQ клиентами?


2-1153734206
nickmas
2006-07-24 13:43
2006.08.13
Chart или DBChart


15-1152793731
Yeg
2006-07-13 16:28
2006.08.13
Siemens AT Commands





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский