Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

OLE and Visio   Найти похожие ветки 

 
dragonGlad ©   (2004-03-11 15:26) [0]

Привет всем.
Думал куда написать, и решил в эту категорию.
Описываю ситуацию.
Задача, есть набор файлов которые сохранены в базе как BLOB поля, это файлы visio. Требуется вытащить данные из базы, изменить их, и записать заново.
Опишу сложности с которыми столкнулся, вытащить данные и передать их в Visio, это понятно не проблема, а вот как быть потом, ничего не получается, я не знаю как перехватить когда пользователь будет сохранять файл, чтобы в этот момент отправить его в базу. Заставлять пользователя указывать файл, который надо положить в базу, мягко говоря, никто этого делать не будет, потому требуется либо перехватить когда он его сохраняет, либо использовать какой либо другой вариант решения. Например встраивать документ на форму, но тогда возникают проблемы с редактированием, в общем, может кто сталкивался с подобными проблемами, подскажите как можно это решить.


 
WebErr ©   (2004-03-11 15:32) [1]

Т.е. перехватить ситуацию, когда другое приложение будет сохранять файл?


 
DragonGlad ©   (2004-03-11 15:52) [2]

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


 
WebErr ©   (2004-03-11 16:08) [3]

Только при наличии в соответствующем интерфейсе функции типа "CloseSome". По любому у Visio должен быть потомок интерфейса IUnknown прочитай у него все методы, проверь всё... Вообще документация должна бы быть. Я же не знаю, какой у Visio OLE...


 
Sentinel ©   (2004-03-11 16:18) [4]

Используешь OleContainer?


 
DragonGlad ©   (2004-03-11 16:18) [5]

Вот в этом и есть наверное основная проблема, что я тоже этого не знаю, и документацию пока не нашел к сожалению.
И еще, как мне найти потомка интерфейса, и как к нему обратиться? Подскажите пожалуйста.


 
DragonGlad ©   (2004-03-11 16:20) [6]

to Sentinel.
Пока не использую, просто вызываю Visio и отдаю ему данные, может быть подскажете как использовать все возможности Visio через OleContainer? Мне кажеться что для этого придется переопределять все команды Visio, но вполне возможно что я ошибаюсь.


 
evvcom   (2004-03-11 16:29) [7]

С Visio можно работать точно также как и с Excel, Word. Во всех них используется Automation, поэтому делаем CreateOleObject и т.д.
Файл из BLOB предварительно копировать в какой-нибудь Temp, оттуда его и открывать. На свою форму можно повесить обработчик OnCloseQuery с соответствующим сообщением о том, что надо бы данные сохранить. Сохранить и удалить временный файл. Если вдруг неудача с удалением, значит что-то не так и форму можно не закрывать.
А интерфейсы Visio расписаны в MSDN. Удачи.


 
DragonGlad ©   (2004-03-11 16:37) [8]

To evvcom
Я и делал через CreateOleObject, и файл создаю во временной директории.
Как мне отловить что пользователь нажал сохранить, или вышел из Visio? Тогда можно записать к себе, и удалить временный файл.


 
evvcom   (2004-03-11 16:42) [9]

Тогда надо рыться в MSDN.microsoft.com, разбираться с интерфейсами и т.д. Мне пока не было необходимости с этим разбираться, поэтому дальше пас.


 
Sentinel ©   (2004-03-11 16:43) [10]

По-моему, переопределять ничего не придется.
Для вставки файла в OleContainer вызывается его метод InsertObjectDialog, можно создавать объект внутри контейнера при помощи, например, функции, CreateObjectFromInfo. После вставки объекта, для вызова Visio и редактирования файла нужно будет активизировать объект, по умолчанию 2clk. При изменение файла пользователем, это все делается, разумеется в Visio, как в серверном приложении, просто нужно будет сохранить блоб-данные из объекта в блоб-поле.
Итак, последовательность такова:

Загружаем из базы:
BlobStream:=TDataSet.CreateBlobStream(TBlobField(BlobField), bmRead);
OleContainer.LoadFromStream(BlobStream);
BlobStream.Free;

Редактируем:
OleContainer.DoVerb(OleContainer.PrimaryVerb);

Сохраняем:
BlobStream:=TDataSet.CreateBlobStream(TBlobField(BlobField), bmWrite);
OleContainer.SaveToStream(BlobStream);
BlobStream.Free;
TDataSet.Post;

Если чего забыл - я не виноват.) Однако еще один плюс - разумеется (или мне так кажется), при всем этом можно использовать именно автоматизацию, например, для вставленного в него листа Excel:
OleContainer.OleObject.WorkSheets[1].Cells[1,1] := "TDataSet";

И проч.


 
Sentinel ©   (2004-03-11 16:47) [11]

ВОт реальный пример из моей практики:

   if OleContainer.State <> osEmpty then
   begin
     OleStream := ClientDataSet.CreateBlobStream( Fields.G_DATA, bmWrite );
     try
       OleContainer.SaveToStream( OleStream );
     finally
       OleStream.Free;
     end;
   end;
   ClientDataSet.Post;

+Отпадает необходимость файловых операций ручками.
Посмотри также $(DELPHI)\Demos\ActiveX\OleCtnrs - есть примеры


 
DragonGlad ©   (2004-03-11 16:53) [12]

To Sentinel
Спасибо за развернутый ответ, сейчас попробую все это проделать, и напишу что получиться.


 
Amoeba ©   (2004-03-11 16:57) [13]

Если использутся OleContainer, то имеет смысл попробовать компонент TDBOleContainer. Могу намылить.


 
DragonGlad ©   (2004-03-11 17:06) [14]

To Sentinel
Ничего не получилось к сожалению, при попытке загрузить из потока пишет Invalid Stream format. Может что не так делаю...
To Amoeba намыль если не сложно, посмотрю что это такое, может будет проще на нем все это сделать.


 
Sentinel ©   (2004-03-11 17:14) [15]

Тут дело такое, что ты, скорее всего грузишь файл, в том виде, в каком он у тебя на диске хранится. А для контейнера не только это надо. Информация о классе приложения-сервера, я так понимаю, и проч. Попробуй метод:
 if OpenDialog1.Execute then
 OleContainer1.CreateObjectFromFile(OpenDialog1.FileName,False);
Надеюсь, поможет. Должно просто. А потом сохрани, как было сказано.


 
DragonGlad ©   (2004-03-11 17:21) [16]

to Sentinel
Должно понимаю но не помогает :-((
Выдает ошибку OLE error 80030002...
может я что не выставил в свойствах?


 
Sentinel ©   (2004-03-11 17:21) [17]

А может тебе просто имя файла в базе хранить?


 
Sentinel ©   (2004-03-11 17:33) [18]

И вот что он тебе выдает:
Search for "80030002"
 C:\Program Files\BORLAND\Delphi7\source\rtl\Win\Windows.pas(10451):   STG_E_FILENOTFOUND = HRESULT($80030002);
Делай выводы.


 
DragonGlad ©   (2004-03-11 17:33) [19]

To Sentinel
Это мне не подходит, мне же данные нужны.


 
Sentinel ©   (2004-03-11 17:45) [20]


> DragonGlad ©   (11.03.04 17:33) [19]

Ак данные же в файле...


 
DragonGlad ©   (2004-03-11 17:46) [21]


> Sentinel ©   (11.03.04 17:45) [20]

Данные в файле, а как до него добраться с другого рабочего места?


 
Sentinel ©   (2004-03-11 18:13) [22]

Ну. Абсолютно также, как ты и делал. Просто не надо его вообще хранить в базе данных. И размер поменьше, и нового ничего не надо придумывать. Не надо будет "вытащить данные из базы, изменить их, и записать заново". Просто изменить. Просто открыть. Просто, например:
ShellExecute(Handle,"open","\\server\1\visiofile.ext,nil,nil,SW_ENJOY); И если ресурс расшарен, и если файл не заблокирован другой копией Visio и если не только для чтения, то какие проблемы?


 
Sentinel ©   (2004-03-11 18:16) [23]

Ладно, ухожу. У меня сегодня отчего-то интер дохлый, тяжко мне тут.


 
DragonGlad ©   (2004-03-12 15:55) [24]

В принципе у меня все основное получилось, остались некоторые мелкие моменты, надеюсь их сам побороть.
Всем спасибо за участие в моей проблеме.


 
Sentinel ©   (2004-03-12 17:30) [25]


> DragonGlad ©   (12.03.04 15:55) [24]

И как сделал, если не секрет?



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

Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.052 c
1-1079063333
BorisMor
2004-03-12 06:48
2004.04.04
Многострочная ветка в TTreeView


1-1079208207
Volodya_
2004-03-13 23:03
2004.04.04
прокрутка combobox


9-1064494630
Ilyasim
2003-09-25 16:57
2004.04.04
DXF в массиве


3-1078204603
Merry
2004-03-02 08:16
2004.04.04
SQL-запрос


3-1078827023
hfa
2004-03-09 13:10
2004.04.04
User DSN. Естьли компонент или функция для создания ...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский