Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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"



Страницы: 1 вся ветка

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

Наверх





Память: 0.46 MB
Время: 0.007 c
14-57499
Донской
2002-02-02 14:43
2002.03.18
clMoneyGreen


4-57564
Serhy
2002-01-16 01:57
2002.03.18
Интересное в ShellExecute


4-57550
Death
2002-01-18 21:03
2002.03.18
Дебаг...


14-57491
Igor_thief
2002-01-30 16:50
2002.03.18
Компоненты


1-57419
Лана Розанова
2002-03-02 20:49
2002.03.18
Анализ даты.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский