powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Редактирование файла из БД с сохранением назад в БД
6 сообщений из 6, страница 1 из 1
Редактирование файла из БД с сохранением назад в БД
    #39550398
TopCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!
Файл хранится в BLOB. Пользователь в программе выбирает в гриде имя файла и жмет кнопку просмотра, например, doc файл открывается в MS Word. Пользователь его редактирует и сохраняет. После этого необходимо изменённый файл положить назад в БД.

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

Может у кого есть рабочий код уже?
Спасибо
...
Рейтинг: 0 / 0
Редактирование файла из БД с сохранением назад в БД
    #39550414
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TopCore,

Если я правильно протелепатировал, то наверно, вот так Как подождать завершения выполнения внешней программы?
...
Рейтинг: 0 / 0
Редактирование файла из БД с сохранением назад в БД
    #39550438
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopCore,

я такое делал. Импортируешь библиотеку типов мсворд, запускаешь ворд как СОМ сервер, открываешь в нем документ, вешаешь свой обработчик на события онсэйв (просто взводишь флаг "изменен"), по завершению твоего экземпляра СОМ сервера, если установлен флан "изменен", сохраняешь исходный файл документа в базу.
...
Рейтинг: 0 / 0
Редактирование файла из БД с сохранением назад в БД
    #39551199
TopCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД, импортировал библиотеку ворда, но компиляция (Delphi 7) выводит ошибки
Код: plaintext
[Error] Word_TLB.pas(45886): Operator not applicable to this operand type
Код: plaintext
[Error] Word_TLB.pas(45913): Operator not applicable to this operand type
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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;


Что дэлфе не нравится, не понимаю?
...
Рейтинг: 0 / 0
Редактирование файла из БД с сохранением назад в БД
    #39551215
TopCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл решение ошибки.
...
Рейтинг: 0 / 0
Редактирование файла из БД с сохранением назад в БД
    #39551269
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopCore,

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

Код: pascal
1.
2.
3.
4.
  TWordApplication = class(TOleServer)
...
    property OnDocumentBeforeClose: TWordApplicationDocumentBeforeClose read FOnDocumentBeforeClose write FOnDocumentBeforeClose;
  end;


где
Код: pascal
1.
2.
  TWordApplicationDocumentBeforeClose = procedure(ASender: TObject; const Doc: WordDocument; 
                                                                    var Cancel: WordBool) of object;


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


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


- всё, в этом месте файл можно пихать обратно в базу.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Редактирование файла из БД с сохранением назад в БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]