Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хранилище документов


Андре ©   (2002-02-18 17:33:00) 

Подскажите пожалуйста как лучше реализовать такую вещь.

База данных, например Access, в которой в поле типа OleObject хранятся различные документы, например Word, Excel, jpg...
Работая с базой данных пользователь должен:
а) Просматривать документы - вроде нет проблем
б) Открывать документы - тоже все нормально - выгружаю документ из базы на диск во временную папку и оттуда его открываю
в) После окончания работы пользователя с документом, он сохраняет документ - при этом он сохраняется все в той же временной папке, в которую мы его извлекли и закрывает приложение, например. А вот здесь мне бы хотелось, чтобы этот документ перенесся обратно в базу данных. То есть все изменения которые пользователь сделал в документе, за последний сеанс работы, сохранились и в том документе который находится в БД.

Так как лучше всего реализовать пункт в). Можно при открытии документа получать ссылку на окно приложения, работающего с ним, и переодически проверять, не закрылось ли оно. В случае закрытия окна, считывать файл обратно в базу, а затем удалять его копию на диске.

А может все таки есть лучший способ ?


Slava   (2002-02-19 09:57:00) [1]

Заголовок нехороший, когда через OLEContainer,
например "TR645.txt" вместо "Список.txt" или "Документ в OLEContainer1 - Microsoft Word" вместо "Список - Microsoft Word"


Slava   (2002-02-19 09:51:00) [2]

> wicked

Вобщем я про это и говорил :о))


wicked   (2002-02-19 09:40:00) [3]

2 Slava ©
а если совместитьдва способа?.... то есть использовать WaitForSingleObject, а после возврата из него пробовать монопольно открывать файл?... если не получилось открыть - каждые полсекунды - секунду пробовать опять... хоть и коряво, но проблему решить можно...
также можноподумать насчёт заголовка окна - у нас ведь есть handle процесса...


Slava   (2002-02-19 09:29:00) [4]

> wicked

Здесь есть подводные камни.

Например у нас открыт документ в Word"е(Word2000). Из базы
мы вытягиваем свой файл и запускаем Word еще раз с нашим
документом. Теперь мы хотим подождать, когда пользователь
закончит редактировать наш документ, чтобы залить его обратно
в базу...

Фиг вам!

Эта вторая копия Word"а (повторяю, я пробовал только с Word2000)
передает управление и наш документ первой копии и благополучно
завершается. А мы-то думаем, что пользователь закончил работу и
закрыл документ, а он как ни в чем не бывало продолжает
редактировать дальше.

Я не нашел способ как это побороть. Можно, конечно, еще
попробовать открыть файл монопольно и если получилось, то
считаем, что с ним никто не работает и после этого сохранять.
Но не все редакторы держат файл открытым (открыли-прочитали-
закрыли-отредактировали-открыли-сохранили-закрыли).

С OLE-объектами такого не происходит, но далеко не все
редакторы являются OLE-серверами, да и заголовок у окна не очень-то :о)

Может кто решил эту проблему?


wicked   (2002-02-18 20:34:00) [5]

есть... при выгрузке документа на диск ты запускаешь приложение для его обработки... запустить его можно с помощью api"шной функции CreateProcess, которая вернёт тебе handle созданного процесса.... другой api"шной функцией, WaitForSingleObject, можно проверять, не закрылось ли то твоё приложение... если реализовать это с помощью thread"ов (не переводится :), то задача по периодической проверке отпадает сама по себе....
детали по функциям можно узнать в справке...


Наверх

Титульная страница Поиск, карта сайта Написать письмо