Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Вниз

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


Андре   (2002-02-18 17:33) [0]

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

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

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

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



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

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



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

> wicked

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

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

Фиг вам!

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

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

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

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



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

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



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

> wicked

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



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

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




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.02 c
14-57515          McSimm                2002-02-04 17:53  2002.03.18  
Клиент для форумов. Dolphin 1.1


14-57493          Igor_thief            2002-01-31 13:56  2002.03.18  
Слабаки


4-57556           daos                  2002-01-19 13:30  2002.03.18  
Как узнать что курсор покинул мое окно?


3-57289           Dim                   2002-02-18 15:10  2002.03.18  
Сортировка по нажатию на заголовки колонок DBGrid а


1-57360           valery_f              2002-03-04 13:27  2002.03.18  
Shell controls (D6)