Author |
Topic |
|
Sviataslau
Belarus
10 Posts |
Posted - 09/20/2006 : 18:09:51
|
Создал свой реализующий интерфейс Master public class CMasterCtrl : Microsoft.Office.Interop.Visio.Master
Реализовал все методы и свойства, но при доюавлении его в страницу mMaster = new CMasterCtrl();// Masters.get_ItemU("Process"); mDoc.Pages[1].Drop(mMaster,1.476378, 10.334646);
Наступает кирдык. У кого нибудь опыт создания собственных шейпов есть ?
|
|
Sviataslau
Belarus
10 Posts |
Posted - 09/20/2006 : 19:19:03
|
Да еще вопрос прикрепляюсь к свойствам mVisioApp.Documents.ConnectionsAdded += new EDocuments_ConnectionsAddedEventHandler(mMaster.FunConnectionsAdded); Но при добавлении конектора свойство не вызывается - что я не так делаю (может кто знает)
|
|
|
Sviataslau
Belarus
10 Posts |
Posted - 09/20/2006 : 19:23:27
|
Пардон с конектором все работает |
|
|
brace
Russia
358 Posts |
Posted - 09/21/2006 : 10:57:42
|
этот макрос рисует квадрат.
Public Sub DrawRectangle_Example()
Dim vsoShape As Visio.Shape Set vsoShape = ActivePage.DrawRectangle(1, 4, 4, 1)
End Sub
|
|
|
Sviataslau
Belarus
10 Posts |
Posted - 09/21/2006 : 10:59:45
|
Ну квадрат нарисовать это одно, а вотполностью создать собственный shape и его контролировать это "чуть-чуть другое" |
|
|
brace
Russia
358 Posts |
Posted - 09/21/2006 : 11:58:09
|
создать шейп = нарисовать шейп !!! или что по Вашему ??? что значит контролировать шейп ??? перемещать, изменять размеры, копировать и тп. эти простые вещи может делать любой юзер визио. |
|
|
Sviataslau
Belarus
10 Posts |
Posted - 09/25/2006 : 11:13:54
|
Вопрос не в том чтобы рисовать (это понятно как делать), а вопрос в том чтобы на програмном уровне расширить фукциональность стандартного Master для требуемой задачи, контролировать обект можно "изнутри" можно снаружи, изнутри переопределяя стандартные интерфейсы снаружи используя стандартные события. Необходимо контролировать изнутри - в связи счем был реализован интерфейс обеспечивающий (на первый взгляд) внедрение собственного Master а в документ, но не тут то было при его внедрении скорее всего чтото не учтено (знать бы что) приводящее к зависанию визио. Вот в этом собственно и есть интерес узнать бы что не реализовано. |
|
|
arturik
Russia
29 Posts |
Posted - 09/25/2006 : 14:04:59
|
Попробуй по шагово описать чего ты хочешь добиться, а то как-то не понятно чего ты хочешь.
Visio 2003(SP2) |
|
|
mers
Russia
159 Posts |
Posted - 10/02/2006 : 13:06:04
|
Да понятно вообщем все. А что хоть пишет-то? Что Visio не нравится.
З.Ы. Если не жалко, киньте исходник реализации интерфейса на почту, очень любопытно, хотя мне интреснее было бы реализовать интерфейс Shape. |
|
|
mers
Russia
159 Posts |
Posted - 10/04/2006 : 14:30:35
|
Ну в целом и общем ваша задача ясна. Единственное не очень понял что значит компиляция с последущим устранением ошибок.
Я занимаюсь несколько другими вещами, однако проблемы похожие. Безусловно удобнее всего было бы наследовать класс шейп и добавить в него необходимые свойства/функции :).
По поводу объектной модели Visio и документации вообще могу посоветовать 2 вещи: 1. читать MSDN :) /MSDN Home > MSDN Library > Office Solutions Development > Visio 2003/ Тут есть очень многое. Посмотрить что вам будет полезно. SDK так же содержат много интересных вещей. 2. Конференции разработчиков Visio в группах Гугл http://groups.google.com/. Полезная вещь, позволяющая общаться напрямую с создателями Visio. Очень рекомендую.
Код получил на почту..так что в форуме можно стереть этот трактат :) |
|
|
Sviataslau
Belarus
10 Posts |
Posted - 10/04/2006 : 14:51:28
|
Спасибо. Я впринципе разобрался что к чему :) Используя события страницы, я имею необходимый уровень контроля над происходящим :) Компиляция - процес проверки правильности связей и объектов обеспечивающих логику самого программирования :) |
|
|
Sviataslau
Belarus
10 Posts |
Posted - 10/05/2006 : 10:35:38
|
Интересная ситуация. Выполняю след код Открываю документ и регистрирую события mVisioApp = new ApplicationClass(); mVisioApp.Visible = true; mDoc = mVisioApp.Documents.AddEx("D:/Project/Lun_New/Development/Program/C#/VisioPLC/VisioPLC/Visio/Базовый проект.vsd",VisMeasurementSystem.visMSDefault,0,0); ((Page)mVisioApp.ActiveWindow.Page).ShapeAdded += new EPage_ShapeAddedEventHandler (FunAddShape); ((Page)mVisioApp.ActiveWindow.Page).TextChanged += new EPage_TextChangedEventHandler (FunTextChanged); ((Page)mVisioApp.ActiveWindow.Page).BeforeShapeDelete += new EPage_BeforeShapeDeleteEventHandler (FunBeforeMasterDelete); ((Page)mVisioApp.ActiveWindow.Page).CellChanged += new EPage_CellChangedEventHandler (FunCellChanged); ((Page)mVisioApp.ActiveWindow.Page).ConnectionsAdded += new EPage_ConnectionsAddedEventHandler (FunConnectionsAdded);
Отрабатываю добавление нового шейпа
int a= 0; a++; if(iShape.NameU.IndexOf("Состояние")!=-1) { mBaseObject = new CBaseObject(iShape,EN_BASE_TYTPE.EN_BASE_TYTPE_STATE); IAsyncResult fIResult = BeginInvoke(mdlFillObject,new object[]{mBaseObject}); }
Происходит потеря события, то есть повторное добавления шейпа не приводит к вызову события, это былобы понятно еслибы повторное выполнение открытия документа работало точно также, но при повторном открытии событие не сбрасывается. Есть идеи где собака могла порыться :) ?
|
|
|
Sviataslau
Belarus
10 Posts |
Posted - 10/05/2006 : 10:49:45
|
Маленькое дополнение к такой ситуации приводит добавление строк в DataGrid
fList.Add("ID");fList.Add(mBaseObject.mID); mObjectPropDataTable.Rows.Add(fList.ToArray());
Если этой строки нет все работает нормально. Правда есть еще загадка к такомуже положению дел приводит и следующий код
Document fObject = EnemList.EnumStrDocument(mVisioApp.Documents.GetEnumerator(),"//Project/Lun_New/Development/Program/C#/VisioPLC/VisioPLC/VisioTN_Диаграммы.vss");//. Masters.ItemU("Process") Master fMaster = fObject.Masters.get_ItemU("Состояние"); ((Page)mVisioApp.ActiveWindow.Page).Drop(fMaster,1.476378, 10.334646);
|
|
|
Sviataslau
Belarus
10 Posts |
Posted - 10/05/2006 : 12:49:11
|
Победа над фичей была достигнута путем шаманства (может есть опытные шаманы объясняющие происходящее, я в глубоком трансе :)) Шаманство заключается в том что при инициализации было вставлена след последовательность if(mObjectPropDataTable.Rows.Count>0) { mObjectPropDataTable.Rows.Clear(); } ArrayList fList = new ArrayList(); fList.Add("ID");fList.Add(".."); mObjectPropDataTable.Rows.Add(fList.ToArray()); fList.RemoveRange(0,fList.Count); fList.Add("Уровень");fList.Add("...");
mObjectPropDataTable.Rows.Add(fList.ToArray());//fBaseObj.mLevelID.ToString()});
|
|
|
|
Topic |
|