Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Редактирование файла из БД с сохранением назад в БД  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 829
Приветствую!
Файл хранится в BLOB. Пользователь в программе выбирает в гриде имя файла и жмет кнопку просмотра, например, doc файл открывается в MS Word. Пользователь его редактирует и сохраняет. После этого необходимо изменённый файл положить назад в БД.

На комп я файл загружаю и обратно тоже могу в БД загрузить. А вот как реализовать то, что пользователь отредактировал файл и сохранил его не знаю. Надо ли выгружать редактирование файла в отдельный поток?

Может у кого есть рабочий код уже?
Спасибо
9 ноя 17, 17:05    [20940820]     Ответить | Цитировать Сообщить модератору
 Re: Редактирование файла из БД с сохранением назад в БД  [new]
DesWind
Member

Откуда:
Сообщений: 64
TopCore,

Если я правильно протелепатировал, то наверно, вот так Как подождать завершения выполнения внешней программы?
9 ноя 17, 17:20    [20940888]     Ответить | Цитировать Сообщить модератору
 Re: Редактирование файла из БД с сохранением назад в БД  [new]
чччД
Guest
TopCore,

я такое делал. Импортируешь библиотеку типов мсворд, запускаешь ворд как СОМ сервер, открываешь в нем документ, вешаешь свой обработчик на события онсэйв (просто взводишь флаг "изменен"), по завершению твоего экземпляра СОМ сервера, если установлен флан "изменен", сохраняешь исходный файл документа в базу.
9 ноя 17, 17:49    [20940985]     Ответить | Цитировать Сообщить модератору
 Re: Редактирование файла из БД с сохранением назад в БД  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 829
чччД, импортировал библиотеку ворда, но компиляция (Delphi 7) выводит ошибки
[Error] Word_TLB.pas(45886): Operator not applicable to this operand type
[Error] Word_TLB.pas(45913): Operator not applicable to this operand type
procedure TWordDocument.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
  case DispID of
    -1: Exit;  // DISPID_UNKNOWN
    //..........
    9: if Assigned(FOnXMLBeforeDelete) then
         FOnXMLBeforeDelete(Self,
                            IUnknown(TVarData(Params[0]).VPointer) as Range {const Range},
                            IUnknown(TVarData(Params[1]).VPointer) as XMLNode {const XMLNode},
                            Params[2] {WordBool});
    12: if Assigned(FOnContentControlAfterAdd) then
    //..........
    18: if Assigned(FOnBuildingBlockInsert) then
         FOnBuildingBlockInsert(Self,
                                IUnknown(TVarData(Params[0]).VPointer) as Range {const Range},
                                Params[1] {const WideString},
                                Params[2] {const WideString},
                                Params[3] {const WideString},
                                Params[4] {const WideString});
  end; {case DispID}
end;

Что дэлфе не нравится, не понимаю?
10 ноя 17, 17:08    [20944397]     Ответить | Цитировать Сообщить модератору
 Re: Редактирование файла из БД с сохранением назад в БД  [new]
TopCore
Member

Откуда: Mariupol, Ukraine
Сообщений: 829
Нашёл решение ошибки.
10 ноя 17, 17:22    [20944454]     Ответить | Цитировать Сообщить модератору
 Re: Редактирование файла из БД с сохранением назад в БД  [new]
чччД
Guest
TopCore,

смотри, совсем просто:

  TWordApplication = class(TOleServer)
...
    property OnDocumentBeforeClose: TWordApplicationDocumentBeforeClose read FOnDocumentBeforeClose write FOnDocumentBeforeClose;
  end;

где
  TWordApplicationDocumentBeforeClose = procedure(ASender: TObject; const Doc: WordDocument; 
                                                                    var Cancel: WordBool) of object;

Вешаешь обработчик на OnDocumentBeforeClose, в обработчике проверяешь свойство Doc.Saved. Если не Saved, то выводи диалог "Да-Нет-Отмена" и, если отмена, устанавливай Cancel в "Да". Ели "Нет" - то просто закрывай этот документ:
      fP := False;
      Doc.Close(fP, EmptyParam, EmptyParam);

Если "Да" - то сохраняй его:
Doc.Save 

- всё, в этом месте файл можно пихать обратно в базу.
10 ноя 17, 19:04    [20944755]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить