![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выгрузка 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 - как надо?