powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FoxPro + Microsoft Visio
16 сообщений из 16, страница 1 из 1
FoxPro + Microsoft Visio
    #39034744
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много чего тут перерыл, многие совсем не хотят работать из-за стоимости, но реальных примеров работы с Visio я так и не смог найти.
Задача стоит такая:
1)подключиться к документы (выполнено)
2)открыть его в фоксе для визуального просмотра с инструментами Visio для масштабирования (выполнено)
3)необходимо найти объекты в документе и выделить их другим цветом (в разработке, не могу понять как обратиться к этим объектам и можно ли это сделать в принципе)
4)дорисовать что-нибудь в текущий документ и сохранить документ!

Может кто уже сталкивался с этим, мне бы маленький примерчик, дальше я сам
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035079
Ffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
ActiveDocument.Pages(1).Shapes(1)...
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035274
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ffffffffffffff
Код: vbnet
1.
ActiveDocument.Pages(1).Shapes(1)...



Нет у меня такого, Page могу найти активный, но дальше к нему обратиться не получается, максимум что могу вытянуть это его имя и имя слоя
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035281
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES

Объектную модель вам нужно найти подробную, и коды из того, что вам нужно, перевести в VFP в класс и по частям отладить.
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035284
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, Нашёл я способ обратится к элементам документа, через thisform.myVisio.ShapeName(1)
Всего элементов в документе: thisform.myVisio.ShapeCount
Только это мне в итоге не очень помогло, те кто создавал этот документ называл элементы как попало
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035285
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES, И всё равно нет возможно как-то изменить элемент, например изменить цвет или перечеркнуть его
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035304
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES

Не разобравшись с объектной моделью, вы так и будете тыкаться с каждым свойством, а их сотни.
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035307
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12AngelOKES

Не разобравшись с объектной моделью, вы так и будете тыкаться с каждым свойством, а их сотни.

Ну а как мне в ней разобраться? Документации как таковой нет, вот и делаем как привыкли тыкаемся и пробуем...
Я бы не отказался бы от нормальной документации
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035323
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES

Наберите в гугле "Объектная модель MS Visio" и начните ее изучать.
Описания и нужные вам коды вы найдете на каком-нибудь другом языке.
Разобравшись, переложить на VFP по аналогии с Word и Excel не так уж проблематично.
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035344
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, Мне бы ещё разобраться как работать :)

Сейчас решил, что SDK недостаточно и поставил полноценный Visio 2003, так теперь фокс совсем не хочет работать c OLE
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035381
Fffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
Vs=CreateObject("Visio.Application")


не работает?
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035431
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fffffffffffffff
Код: vbnet
1.
Vs=CreateObject("Visio.Application")


не работает?

Сейчас уже заработало, а вот OLE что-то тупит, мне же желательно загрузить и отобразить...

делаю

sz=CREATEOBJECT("Visio.Application")
sz.Documents.Add(GETFILE('*.vsd'))

Он мне открывает этот документ... вообщем буду разбираться... тяжко очень...
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035445
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12AngelOKES

Наберите в гугле "Объектная модель MS Visio" и начните ее изучать.
Описания и нужные вам коды вы найдете на каком-нибудь другом языке.
Разобравшись, переложить на VFP по аналогии с Word и Excel не так уж проблематично.

Сделал как вы сказали, ничего путного, элементарные вещи объяснены и всё, ни одного примера реализации...
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035535
Ffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
ActiveDocument.Pages(1).Shapes(1).DrawLine(a, b, c, d)
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39035585
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ffffffffffff
Код: vbnet
1.
ActiveDocument.Pages(1).Shapes(1).DrawLine(a, b, c, d)



Спасибо, уже пошло! Пока вопросов нет, немного стал разбираться, как закончу выложу код!!!
...
Рейтинг: 0 / 0
FoxPro + Microsoft Visio
    #39037453
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкладываю как и обещал код программы:

1) Открывается форма и кнопка выбора файла:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 
 ***  Для отображения используется компонент ActivX обычный просмоторщик Visio, полноценный я так и не нашёл  
 ***  А для програмирования уже создаю объект на основе Visio.Application  
  With Thisform  
  	mFile=Getfile('vsd')                                             && Получение файла с нужным расширением  
  	If Upper(Allt(.MyFisio.srC))==Upper(Allt(mFile))                 && Проверка выбранного файла и то, что уже загружено в OLE  
  	Else  
  		If Len(Allt(.MyFisio.srC))=0                                   && Если загрузка впервые  
  			answer=6  
  		Else  
  			answer=Messagebox('?Перезагрузить файл ?',36,'Вопрос')    
  		Endif  
  		If answer=6  
  			.MyFisio.Unload                                              && Выгружаем, то что есть на данный моментв OLE  
  			.MyFisio.Load(Allt(mFile))                                   && Загружаем выбранный файл (Процесс долгий, зависит от файла, может грузить секунд 30)  
  			.MyFisio.Object.PageVisible = .T.                            && делаю видимой страницу, хотя можно и убрать, сомнительно что это нужно, просто есть проблемы с отрисовкой и эта строчка вроде как помогла  
  			mkod=Thisform.MyFisio.Object.CurrentPageIndex                && Текущая страница документа  
  			mkodMax=Thisform.MyFisio.Object.PageCount                    && Всего страниц в документе  
  			mShapeCount=Thisform.MyFisio.Object.ShapeCount               && Количество элементов на странице (В данном случае пользователю это не нужно, но я отображаю для наглядности)  
  			.tkod.Value=mkod  
  			.tFile.Value=mFile  
  			.linfo.Caption = 'Страница '+Allt(Str(mkod))+' из '+Allt(Str(mkodMax))+' Всего элементов на странице: '+Allt(Str(mShapeCount))  
  		Endif  
  	Endif  
  Endwith



2) Теперь поиск элемента и его видоизменение двумя разными способами


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
 Local VisApp As Visio.Application  
  Local VisDoc As Visio.Document  
 ******************************************************  константы  ***************************************************************  
  visSectionObject=1  
  visRowFill=3  
  visFillForegnd=0  
  visFillForegndTrans=6  
  visFillBkgndTrans=7  
  visFillPattern=2  
  visSectionCharacter=3  
  visCharacterSize = 7  
  visFitWidth = 2  
 **********************************************************************************************************************************  
  mkod=Thisform.tkod.Value        && страница  
  mtp=Allt(Thisform.ttp.Value)    && то что ищем  
  mFile=Thisform.tFile.Value      && выбранный файл  
 *****************************  создаем курсор для хранения всех объектов страницы  ************************************************  
  Create Cursor MyOb (NomerS1 Int, NomerS2 Int, mid Int, NameS Varchar(50), tText Varchar(50))  
  If File(mFile)  
  	VisApp=Createobject("Visio.Application")              	&& Создаем экземпляр объекта  
  	VisApp.Visible=.F.                                    	&& Делаем его невидимым  
  	VisDoc=VisApp.Documents.Open(mFile)                   	&& Открываем в нём наш документ  
  	VisApp.ActiveWindow.Page = VisDoc.Pages(mkod)         	&& Переходим на нужную страницу (хотя данный кусок кода мне уже не нужен, сделал там другую фишку)  
  	VisApp.ActiveWindow.ViewFit = visFitWidth             	&& По ширине экрана  
  	pagObj = VisApp.ActivePage                            	&& Переменная активной страницы  
  	For i=1 To pagObj.Shapes.Count Step 1                 	&& Открываем первый цикл по всем элементам Shapes  
  		If pagObj.Shapes(i).Shapes.Count>1                  	&& Если у Shapes есть свои Shapes  
  			For i2=1 To pagObj.Shapes(i).Shapes.Count Step 1  	&& Если есть, то открываем второй цикл по Shapes.Shapes  
  				Insert Into MyOb (NomerS1, NomerS2, mid, NameS, tText) Values (i, i2, pagObj.Shapes(i).Shapes(i2).Id, ;  
  					pagObj.Shapes(i).Shapes(i2).Name, pagObj.Shapes(i).Shapes(i2).Text)  
  			Endfor  
  		Else  
  			Insert Into MyOb (NomerS1, NomerS2, mid, NameS, tText) Values (i, 0, pagObj.Shapes(i).Id, ;  
  				pagObj.Shapes(i).Name, pagObj.Shapes(i).Text)  
  		Endif  
  	Endfor  
  	Thisform.cUp.Caption ='Найти и выделить ТП ('+Allt(Str(Reccount('q1')))+')'  
  	Select * From MyOb Where Like('*ТП*',tText) And Like('* '+mtp+' *',tText) Into Cursor q1   && Здесь я делаю свою выборку и если она не удачна, то делаю другую  
  	If Reccount('q1')<>0  
  		If Reccount('q1')>1  
  			Messagebox('Найдено '+Allt(Str(Reccount('q1')))+' элементов на схеме, удовлетворяющим условиям',32,'Оповещение')  
  		Endif  
  		Select q1  
  		Scan  
 			****  здесь я просто меняю цвет, но можно сделать почти всё, что захочется  
  			VisApp.ActiveWindow.Page.Shapes.ItemFromID(mid).CellsSRC(visSectionObject, visRowFill, visFillForegnd).FormulaU = "THEMEGUARD(RGB(0,176,240))"    
  		Endscan  
  	Else  
  		Select * From MyOb Where tText==mtp Into Cursor q2  
  		If Reccount('q2')=0  
  			Messagebox('Элементы на схеме, удовлетворяющим условиям не найдены',32,'Оповещение')  
  		Else  
  			If Reccount('q2')>1  
  				Messagebox('Найдено '+Allt(Str(Reccount('q2')))+' элементов на схеме, удовлетворяющим условиям',32,'Оповещение')  
  			Endif  
  			Select q2  
  			Scan  
 				****  здесь я просто размер шрифта, возможностей достаточно много  
  				VisApp.ActiveWindow.Page.Shapes.ItemFromID(mid).CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = "30 pt"  
  			Endscan  
  		Endif  
  	Endif  
  	VisDoc.SaveAs('c:\1.vsd')   								&& пересохраняем в другой файл  
  	VisApp.Quit                 								&& вроде бы так освобождаю объект  
  	Thisform.MyFisio.Unload     								&& выгружаю OLE  
  	Thisform.MyFisio.Load('c:\1.vsd')   				&& загружаю в OLE изменённый файл, оригинал не трогаем  
  	Thisform.MyFisio.Object.PageVisible = .T.   && делаю страницу видимой (под вопросм, нужло лии это я описал в первой процедуре)  
  	Messagebox('Загрузка файла закончена, нажмите ОК для продолжения',32,'Оповещение')  
  	Thisform.Refresh                            && обновляю форму и на всякий случай сам OLE, но всё равно бывают проблемы не прорисовки  
  	Thisform.MyFisio.Refresh  
  Else  
  	Messagebox('Файл не найден',32,'Оповещение')  
  Endif



3) С самим OLE почти ничего сделать нельзя, единственное что я сделал это на событие OnPageChanged


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
*** ActiveX Control Event ***  
  Lparameters pageindex  
  mkod=pageindex  
  Thisform.tkod.Value=mkod  
  mkodMax=Thisform.MyFisio.Object.PageCount  
  mShapeCount=Thisform.MyFisio.Object.ShapeCount  
  Thisform.linfo.Caption = 'Страница '+Allt(Str(mkod))+' из '+Allt(Str(mkodMax))+' Всего элементов на странице: '+Allt(Str(mShapeCount))  
  Thisform.Refresh




Работает медленно, но в принципе в пределах разумного, проблема есть в обновление OLE, не всегда он обновляет, может просто висеть пустое место, тронешь на нём мышкой и тогда всё отображает, но сейчас почему-то перестало глючить, с чем связано не понятно.
Хотелось бы конечно как-то перерисовывать OLE без перезагрузки, но думаю что для этого нужен какой-нибудь другой OLE.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FoxPro + Microsoft Visio
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]