| Author | 
                
                  Topic   | 
                  | 
               
              
                | 
                 Sign 
                 
                
                16 Posts  | 
                
                  
                    
                      
                       Posted - 07/04/2006 :  15:29:09
                      
  | 
                     
                    
                      |  Как программно организовать движение shape? Например, есть shape строительного крана. Нужно по нажатию кнопки заставить его вращаться, перемещать "бегунок" с крюком и т.п. Естественно не требуется абсолютной плавности движения как в играх. Попытка в цикле изменять соответствующую ячейку из ShapeSheet, например для вращения - ячейку "Angle", к необходимому результату не приводит. На экране видишь начальное положение shape и затем после паузы сразу положение shape, соответствующее уже последнему присвоенному значению в цикле. | 
                     
                   
                 | 
               
              
                | 
                 Tumanov 
                 
                
                Russia 
                1198 Posts  | 
                
                  
                 | 
               
              
                | 
                 Sign 
                 
                
                16 Posts  | 
                
                  
                    
                      
                       Posted - 07/05/2006 :  14:51:59
                      
  | 
                     
                    
                       quote: Originally posted by Tumanov
  Загляните на сайт к Digitall. Там есть статья, как он будильник со стрелочками рисовал :) http://www.prodigitall.narod.ru
 
   Спасибо, заглянул. Да, предложенный вариант с манимуляцией параметра реестра "Animation" работает. А если поставить его значение в 1, то по плавности движения shape не будет уступать и настоящей анимации. Но... это не выход из положения. Ибо добавлять в код VBA изменение параметров реестра, соглатитесь, не есть хорошо. Всегда есть вероятность, что после сбоя на место все вернуть не сможешь. После небольшого исследования выяснилось, что вообщем то проблема в неупраляемости процесса перерисовки shape в требуемый момент времени. Метода типа REDRAW я не нашел у shape, а сам VISIO перерисовывает shape, я понял, либо в момент передачи упраления пользователю (т.е. уже после отработки своей процедуры, изменяющей, например, тот же Angle из Cells), либо при смене времени в NOW(). Все-таки, есть ли возможность заставить VISIO отрисовать shape в нужный мне момент времени? | 
                     
                    
                        | 
                     
                   
                 | 
               
              
                | 
                 Tumanov 
                 
                
                Russia 
                1198 Posts  | 
                
                  
                    
                      
                       Posted - 07/05/2006 :  17:24:58
                      
  | 
                     
                    
                       Не хотите по хорошему - можно поставить внешний таймер :) Например, написать на VB такую программу Dim appVisio As Visio.Application Dim p As Integer Private Sub Command1_Click() Timer1.Interval = 100 p = 2 Timer1.Enabled = True End Sub Private Sub Command2_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Text1.Text = Time Set appVisio = GetObject(, "Visio.Application") If p < 10 Then p = p + 1 Else p = 2 appVisio.ActivePage.Shapes(1).Cells("Width").Formula = p End Sub При нажатии на кнопку Command1 (это будет "Пуск") запустится 100-миллисекундный таймер и начнет изменять ширину первого шейпа в открытом приложении Visio. Шейп начинает "дышать". Довольно быстро, хотя и рывками. Нажатие кнопки Command2 ("Останов") останавливает таймер и Visio замирает. В принципе, таймер не обязательно делать внешним экзешником. Можно придумать, как запускать его из Visio. | 
                     
                    
                        | 
                     
                   
                 | 
               
              
                | 
                 Sign 
                 
                
                16 Posts  | 
                
                  
                    
                      
                       Posted - 07/07/2006 :  10:31:46
                      
  | 
                     
                    
                       quote: Originally posted by Tumanov
  Не хотите по хорошему - можно поставить внешний таймер :) Например, написать на VB такую программу Dim appVisio As Visio.Application
 
   ..... Спасибо, работает. Причем интервальное по времени изменение ячеек shape в приложении Visio не обязательно делать через таймер.  Чтобы работало, достаточно эти изменения делать из любой внешней программы (я пробовал просто через Excel) по отношении открытому приложению Visio.
 quote:
  В принципе, таймер не обязательно делать внешним экзешником. Можно придумать, как запускать его из Visio.
 
   Запустить внешнюю программу из Visio проблемы, думаю, не будет. А вот вообще не выйти за пределы Visio... Вот это проблема. Пока все-таки склоняюсь к изменению Animation в реестре. Тут вопрос больше к Digitall. На что еще в Visio влияет параметр реестра Animation кроме функции NOW()? У него это на сайте сказано весьма размыто:"... Visio по умолчанию, для быстродействия видимо, "время" в формулах обновляется 1 раз в минуту (В ссылках Разработчика об этом не раз упоминается)." Так что если только на NOW(), то можно это пережить. Так ли? Ибо копание в инете большего чем он сказал не принесло. В том числе и microsoft.com . Может у кого еще информация есть? | 
                     
                    
                        | 
                     
                   
                 | 
               
              
                | 
                 Sign 
                 
                
                16 Posts  | 
                
                  
                    
                      
                       Posted - 07/20/2006 :  12:12:11
                      
  | 
                     
                    
                       Для завершения данной темы. Лучший вариант, по-моему, по данному вопросу будет использование внешнего таймера. Конкретно - использование функций API SetTimer и KillTimer (user32.dll). А в вашей TimerProc, которая прицепляется к таймеру, уже можно организовывать изменение ячеек ShapeSheet. | 
                     
                    
                        | 
                     
                   
                 | 
               
              
                |   | 
                
                  Topic   | 
                  | 
               
             
           | 
         
       
     |