Форум: "Базы";
Текущий архив: 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.109 c