Author |
Topic |
|
Ven
28 Posts |
Posted - 07/25/2006 : 13:25:03
|
Здраствуйте еще раз :) Подскажите пожалуйста, как можно узнать, что шейп, указатель на который содержится в переменной IVShape, выбран или не выбран? Простой способ это пройтись по всем шейпам объекта VisioDrawingControl.Document.Application.ActiveWindow.Selection Но в определенных ситуациях это довольно медленный способ. Может есть способ пошустрее или все же этот? |
|
Ven
28 Posts |
Posted - 07/25/2006 : 15:11:23
|
И еще один вопрос. Можно ли сделать так, что бы при использовании метода Drop Визио не выделял бы автоматически новый объект (т.е. что бы с выбранных ранее объектов выдиление не снималось и событие OnSelectionChange не возникало)? |
|
|
Ven
28 Posts |
Posted - 07/31/2006 : 12:46:45
|
Мде, похоже вопросы либо очень сложные, либо слишком простые :)
Тут возник еще один вопрос. У меня есть объект, который является группой других объектов. У группы в разделе Group Properties, параметр SelectMode равен 1 (visGrpSelModeGroup1st), т.е. сначала при клике на группе, выбирается сама группа, а при повторном клике, выбирается объект группы, над которым находится мышь. Так вот, если теперь нажать Delete, то удалится не вся группа, а только этот объект. Это хорошо, мне так и нужно. Но проблемма в том, что стандартную реакцию на событие Delete я отключил, и обрабатываю это действие сам.
Проблемма заключается в следующем: Как определить, какие шейпы сейчас выбраны? Если выбрана сама группа, т.е. объект, находящийся на самом верху иерархии, то все работает как часы. Я вот таким макаром VisioDrawingControl.Document.Application.ActiveWindow.Selection получаю список всех выбранных объектов и по одному с ними разбираюсь.
Но если выбран объект внутри группы (он получается на втором уровне иерархии), то список VisioDrawingControl.Document.Application.ActiveWindow.Selection пустой, как и в том случае, если ничего не выбранно. Как можно отследить какой элемент сейчас выбран, даже если этот элемент не является внешним?
Ребята, помогите плиз. Очень нужно! Заранее спасибо. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 07/31/2006 : 21:51:48
|
На первый вопрос скорее всего просто никто не знает ответа, но и абсолютной уверенности, что этого сделать нельзя тоже нет. Вот и остается без ответа. Второй скорее всего можно сделать с помощью массы ухищрений, но кому же захочется над этим голову ломать... :) Для решения третьего вопроса нужно работать со свойствами IterationMode и ContainingShape объекта Selection. Присмотритесь к этому коду: Sub ttt() Dim Sel As Visio.Selection Set Sel = ActiveWindow.Selection Debug.Print Sel.IterationMode Debug.Print Sel.Count Sel.IterationMode = 0 Debug.Print Sel.Count Debug.Print Sel(1).ContainingShape Debug.Print Sel(2).ContainingShape End Sub Если на страничке два шейпа, объединенных в группу и селектирован один из внутренних, он даст примерно такой вывод 1280 0 2 ThePage Sheet.3 Это значит, что по умолчанию свойство IterationMode имеет значение &H0500 (visSelModeSkipSub Or visSelModeSkipSuper), что значит не показывать ни контейнера, ни вложенных шейпов. Поэтому Cuunt равен 0. Если установить IterationMode = 0, то будет показываться и то и другое. Счетчик станет равным 2. Теперь ContainingShape для шейпа-группы выведет страницу (ThePage), а для вложенного - имя шейпа-группы (Sheet.3). В принципе, этого должно быть достаточно. |
|
|
Ven
28 Posts |
Posted - 08/01/2006 : 12:57:22
|
Супер! Это то, что нужно. Вот тока проблемма в том, что вот это действие Sel.IterationMode = 0 у меня почему то игнорируется. Не выдается никаких ошибок, но если потом вывести IterationMode, то он опять будет 1280 (((
|
|
|
Ven
28 Posts |
Posted - 08/01/2006 : 13:37:46
|
Мде, разобрался с проблеммой: Этот вариант не пашет var i: integer; App: IVApplication; begin App := VisioDrawingControl.Document.Application; App.ActiveWindow.Selection.IterationMode := visSelModeOnlySub; Memo1.Lines.Add('IterationMode = '+inttostr(App.ActiveWindow.Selection.IterationMode)); end
А этот пашет var i: integer; Sel: IVSelection; begin Sel := VisioDrawingControl.Document.Application.ActiveWindow.Selection; Sel.IterationMode := visSelModeOnlySub; Memo1.Lines.Add('IterationMode = '+inttostr(Sel.IterationMode)); end
Походу ActiveX че то еще создает только тогда когда берется интерфейс именно Selection. В общем чужая душа потемки, слава богу хоть работает |
|
|
mers
Russia
159 Posts |
Posted - 08/03/2006 : 10:28:23
|
quote: Originally posted by Ven А этот пашет var i: integer; Sel: IVSelection; begin Sel := VisioDrawingControl.Document.Application.ActiveWindow.Selection; Sel.IterationMode := visSelModeOnlySub; Memo1.Lines.Add('IterationMode = '+inttostr(Sel.IterationMode)); end
Правильно ли я понял что при вставке этого кода, при дропе на DrawingControl Visio не выделяет добавленный шейп? |
|
|
Ven
28 Posts |
Posted - 08/04/2006 : 12:43:07
|
quote: Правильно ли я понял что при вставке этого кода, при дропе на DrawingControl Visio не выделяет добавленный шейп?
Нет, это решение проблеммы с тем, что Sel.IterationMode := visSelModeOnlySub игнорировалась в первом варианте и учлась во втором. А проблемма выделения шейпа при дропе осталась актуальной (((( |
|
|
|
Topic |
|
|
|