All Forums
 Категория Visio
 Форум Вопросы и ответы
 Выбранный шейп
Author Previous Topic Topic Next 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 не возникало)?
Go to Top of Page

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
пустой, как и в том случае, если ничего не выбранно. Как можно отследить какой элемент сейчас выбран, даже если этот элемент не является внешним?

Ребята, помогите плиз. Очень нужно! Заранее спасибо.
Go to Top of Page

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).
В принципе, этого должно быть достаточно.
Go to Top of Page

Ven

28 Posts

Posted - 08/01/2006 :  12:57:22
Супер! Это то, что нужно. Вот тока проблемма в том, что вот это действие Sel.IterationMode = 0 у меня почему то игнорируется. Не выдается никаких ошибок, но если потом вывести IterationMode, то он опять будет 1280 (((
Go to Top of Page

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. В общем чужая душа потемки, слава богу хоть работает
Go to Top of Page

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 не выделяет добавленный шейп?
Go to Top of Page

Ven

28 Posts

Posted - 08/04/2006 :  12:43:07
quote:
Правильно ли я понял что при вставке этого кода, при дропе на DrawingControl Visio не выделяет добавленный шейп?


Нет, это решение проблеммы с тем, что Sel.IterationMode := visSelModeOnlySub игнорировалась в первом варианте и учлась во втором. А проблемма выделения шейпа при дропе осталась актуальной ((((
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)