All Forums
 Категория Visio
 Форум Вопросы и ответы
 Дублирование
Author Previous Topic Topic Next Topic  

Ven

28 Posts

Posted - 02/28/2007 :  15:30:44
Здраствуйте!

Есть такая проблема, если нарисовать шейп а потом зажать Ctrl и перетащить его правой кнопкой крысы, то мы получим два одинаковых шейпа. А можно ли как нибудь отключить эту возможность? В идеале было бы указать, что для тех или иных шейпов такая возможность отключена, но и глобальный вариант тоже не помешал бы. Заранее спасибо.

mers

Russia
159 Posts

Posted - 02/28/2007 :  15:59:03
Здравствуйте.
При добавление шейпа через Ctrl, да и вообще при добавлении шейпа, вы не получаете два одинаковых шейпа. Они отличаются, хотя и имеют один и тот-же мастер.

Вот три решения вашей проблемы навскидку:

1. Залочить возможность выделения. В шейпшите объекта LockSelection = 1. Соответсвенно сделать Duplicate() с помощью мышки будет нельзя.
2. Обрабатывать нажатия клавиш. Т.е. при возникновении события ChangeSelection проверять зажат ли контрол.
3. При добавлении шейпа проверять его мастер, если мастер объекта уже присутствует на листе, тогда не добавлять объект.

На самом деле задача слишком общая. Трудно понять что конкретно вам нада. Уточните пожалуйста.

Edited by - mers on 02/28/2007 15:59:57
Go to Top of Page

Ven

28 Posts

Posted - 03/01/2007 :  16:27:01
quote:
Originally posted by mers
На самом деле задача слишком общая. Трудно понять что конкретно вам нада. Уточните пожалуйста.



Ситуация такая: есть программа на дельфи, которая использует ActiveX компонент VisioDrawingControl. В программе, пользователю предлагается заранее подготовленная коллекция шейпов (Стенсил) из которой он переносит шейпы на рабочий лист, программа распознает эти шейпы и для каждого создает соответствующий управляющий класс который тут же выводит запрос к пользователю на ввод параметров объекта, который символизируется этим шейпом. Если пользователь отказался от ввода параметров, шейп уничтожается. Тут все работает нормально, если пользователь продублировал шейп указанным мной способом, то возникает меню и если юзер его заполнил, то это означает, что он просто добавил новый объект.

Теперь другая ситуация, в этой программе, к примеру нужно соединить два объекта связью (например соеденить АТС и Распределительный шкаф (РШ) кабелем). Реализованно это так: Юзер кликает правой кнопкой крысы на АТС, возникает меню, в котором он выбирает опцию "проложить кабель". После этого он кликает на РШ и рисуется линия от АТС к РШ. Концы этой линии нельзя оторвать от РШ или Шкафа (и это правильно). И вот тут проблемма, если эту линию продублировать, то появится такой же шейп, причем программа не знает что с ним делать, поскольку такой шейп не может быть введен вручную, а только программно. И в итоге он валяется мусором. Согласен, можно запретить выделение этого шейпа. Но в программе встречаются и другие шейпы с подобной логикой, но их нельзя запрещать выбирать и перемещать.

Вот такие пироги :)

Edited by - Ven on 03/01/2007 16:27:54
Go to Top of Page

mers

Russia
159 Posts

Posted - 03/01/2007 :  17:58:18
1. Гм. Все-таки почему бы не использовать запрета селектировария?
Т.е. при возникновении события ShapeAdded анализировать добавляемый объект и если это "кабель", тогда возможность его селектирования лочится. Если другие объекты, тогда нет.
2. Есть такое событие EnterScope, можно использовать его:
// C# code.
// Подключения обработчика события.
drawingControl.Window.Application.EnterScope += new Microsoft.Office.Interop.Visio.EApplication_EnterScopeEventHandler(Application_EnterScope);

// Обработчик события.
private void Application_EnterScope(Microsoft.Office.Interop.Visio.Application app, int nScopeID, string bstrDescription)
{
  // Строка bstrDescription описывает, что происходит.
  MessageBox.Show(bstrDescription);

  // В вашем случае нужно проверять на Duplicate.
  if(bstrDescription == "Duplicate")
  {
    // Действия при дублировании объекта, т.е. в вашем случае.
  }
}

Go to Top of Page

Ven

28 Posts

Posted - 03/02/2007 :  15:28:20
quote:
Originally posted by mers

1. Гм. Все-таки почему бы не использовать запрета селектировария?
Т.е. при возникновении события ShapeAdded анализировать добавляемый объект и если это "кабель", тогда возможность его селектирования лочится. Если другие объекты, тогда нет.

Ну на данный момент я так и делал, только я уничтожал шейпы с определенными именами. Просто я думал есть какой-нибудь способ запретить это средствами Визио без лишнего кода. Ну нет, так нет.

quote:
Originally posted by mers
2. Есть такое событие EnterScope, можно использовать его:
// C# code.
// Подключения обработчика события.
drawingControl.Window.Application.EnterScope += new Microsoft.Office.Interop.Visio.EApplication_EnterScopeEventHandler(Application_EnterScope);

// Обработчик события.
private void Application_EnterScope(Microsoft.Office.Interop.Visio.Application app, int nScopeID, string bstrDescription)
{
  // Строка bstrDescription описывает, что происходит.
  MessageBox.Show(bstrDescription);

  // В вашем случае нужно проверять на Duplicate.
  if(bstrDescription == "Duplicate")
  {
    // Действия при дублировании объекта, т.е. в вашем случае.
  }
}




Блин, а вот это очень нужная тема! Проблемма в том, что при получении всех интерфейсов с библиотеки (прогой Tlibimp.exe) интерфейс не содержит этого события ((( Я пробовал сделать конвертацию СИшными средствами, там вроде все ОК, а вот с дельфи фигня. Ну тут можно добавить евент в EventList, только я еще не совсем разобрался в этом.
Go to Top of Page

mers

Russia
159 Posts

Posted - 03/02/2007 :  16:07:52
quote:
Блин, а вот это очень нужная тема! Проблемма в том, что при получении всех интерфейсов с библиотеки (прогой Tlibimp.exe) интерфейс не содержит этого события
Я не знаком с Дельфи, поэтому может скажу глупость, но зачем что-то конвертировать, это событие должно быть доступно из объкта drawingConrol, с которым я так понимаю вы работаете. В чем проблема?
quote:
Ну тут можно добавить евент в EventList, только я еще не совсем разобрался в этом.
Об этом событии хорошо написано в SDK и MSDN почитайте, если что-то непонятно спрашивайте.
Go to Top of Page

Ven

28 Posts

Posted - 03/05/2007 :  10:33:51
quote:
Originally posted by mers

Я не знаком с Дельфи, поэтому может скажу глупость, но зачем что-то конвертировать, это событие должно быть доступно из объкта drawingConrol, с которым я так понимаю вы работаете. В чем проблема?



Ну в дельфе, во время проектирования, чтобы у объекта были видны его свойства и методы необходимо подключить к проекту файл с их описанием. Именно этот файл и выгружается с Dllки визио борландовской прогой tlibimp.exe.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)