powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / таблы в worde
11 сообщений из 11, страница 1 из 1
таблы в worde
    #33796917
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла проблемка.
В ворде есть стандартная рисовалка таблиц, И проблема в том что я незнаю можно ли через фокс создавать, удолять, редактировать, вставлять значения и подгонять размеры таблиц под значения в ворде??
...
Рейтинг: 0 / 0
таблы в worde
    #33796964
-)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-)
Гость
Из под Fox можно делать очень многое, в том числе и решить данную задачу.
Посмотри для начала - здесь
Ну и конечно, необходимо разобраться с VBA, хотя бы на начальном уровне.
...
Рейтинг: 0 / 0
таблы в worde
    #33797489
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 -)

Делаю через макросы, но что-то не могу приобщить код байсика к фоксовому.
Вот код бейсика для создания таблы в ворде

ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
With Selection.Tables(1)
If .Style <> "Сетка таблицы" Then
.Style = "Сетка таблицы"
End If
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With

Помогите его приобщить к фоксу.
...
Рейтинг: 0 / 0
таблы в worde
    #33797676
-)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-)
Гость
Код: plaintext
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.
*
LOCAL lcOldError, loWord, lnCountDoc, lcNaimDoc, lcRange

#DEFINE True .T.
#DEFINE False .F.
lcOldError = ON("ERROR")
ON ERROR loWord = .NULL.
loWord = GetObject(, "Word.Application")
ON ERROR &lcOldError

IF ISNULL(loWord)
	loWord = CreateObject("Word.Application")
ENDIF

WITH loWord
	* В переменную - lnCountDoc получаем количество открытых документов в Word
	lnCountDoc = .Documents.Count

	* Если нет открытых документов, то добавляем
	IF lnCountDoc =  0 
		.Documents.Add
	ENDIF

	* В пременную - lcNaimDoc получаем имя первого документа
	lcNaimDoc = .Documents.Item( 1 ).Name

	* Активируем документ имя которого расположено в переменной - lcNaimDoc 
	.Documents(lcNaimDoc).Activate

	* В переменную - lcRange назначаем интервал в который должна добавится таблица	
	lcRange = .ActiveDocument.Range( 0 ,  0 )

	* Добавляем таблицу из  2  - строк и  5  - столбцов
	.ActiveDocument.Tables.Add(lcRange,  2 ,  5 )

	* Формируем стиль таблицы
	WITH .Selection.Tables( 1 )
		IF .Style.NameLocal <> "Сетка таблицы"    
			.Style = "Сетка таблицы" 
		ENDIF
		.ApplyStyleHeadingRows = .T.
		.ApplyStyleLastRow = .T.
		.ApplyStyleFirstColumn = .T.
		.ApplyStyleLastColumn = .T.
	ENDWITH

ENDWITH			&&WITH loWord

* Делаем видимым наш "шедевр"
loWord.Visible = .T. 

Ну а вообще-то, если особо не настаивает заказчик, то - с таблицам лучше (проще) работать в Excele. А по своим возможностям работы текстом, Excel ни в чем не уступает Wordу.
...
Рейтинг: 0 / 0
таблы в worde
    #33802973
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 -)

С этим я согласен. С экселем у меня проблем нет, и макросы екселя пока перевожу без проблем. Но люди требуют ворд потому что привыкли с ним работать и здесь никак в ексель их не перекинуть. Только ворд. Ну а переводить макросы ворда мне проблематично. Неполучаеться правильно это зделать. Поэтому и обращаюсь.
...
Рейтинг: 0 / 0
таблы в worde
    #33803065
-)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-)
Гость
Недоходящий
…С экселем у меня проблем нет, и макросы екселя пока перевожу без проблем…


Недоходящий
…Ну а переводить макросы ворда мне проблематично…


И с макросами Worda тоже проблем не будет, если более глубоко ознакомиться с объектной моделью Worda, да - она немного отличается от Excelьной, но особо сложного ничего там – нет. Удачи!
...
Рейтинг: 0 / 0
таблы в worde
    #33811109
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 -)

Помогите разобраться в чем проблема.
Вот нашел и решил попробывать:
oword=create('word.application')
oword.documents.add()
lcNaimDoc = oword.Documents.Item(1).Name
oword.Documents(lcNaimDoc).Activate
oWordRef = GetObject('','word.basic')
owordRef.insert(cr) && Вставляем строку
Вот на последней строке ругаеться что документ не активный. Почему так??

И еще макрос ворда Selection.TypeText Text:="m" как перевести? Массу вариантов перепробывал и ничего. :-(
...
Рейтинг: 0 / 0
таблы в worde
    #33812755
-)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-)
Гость
2 Недоходящий
В VBA есть два совершенно равноценных способа представления аргументов в процедурах и функциях.
1. Вариант – использование именованных аргументов
2. Вариант – обычный
Так вот, код - который генерирует макрорекордер, использует синтаксис именованных аргументов. Например, как здесь -
Код: plaintext
1.
Selection.TypeText Text:="m" 

Fox же как раз работает со вторым вариантом представления аргументов и при работе с приложениями Office, нужно помнить про это.
Переделать синтаксис варианта 1 в вариант 2 совсем не сложно, и для приведенного примера, он будет выглядеть так -
Код: plaintext
1.
Selection.TypeText("m")

Возникает вопрос, а зачем вообще нужен этот способ с именованными аргументами, в том же VBA?
А для тех случаев, когда функция принимает аргументов больше 1.
При использовании обычного способа (вариант 2, приемлемый для Fox), то если устанавливается аргумент - не первый в списке, или же, например 3 и 5, возникает необходимость вместо пропущенных аргументов ставить знак – «запятая», а если использовать именованные аргументы (вариант 1, не приемлемый для Fox), то можно указать только для необходимых аргументов «имя аргумента := значение аргумента» и при этом не указывать все пропущенные.

Теперь конкретно по задаче.
Ты внимательно смотрел на код, который я приводил выше?
Ты понял, что делают строки -
Код: plaintext
1.
2.
loWord = CreateObject("Word.Application")
loWord = GetObject(, "Word.Application")
и если нет, то – читай внимательно и разбирайся, так как проблема именно в непонимании работы этих строк.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
lcOldError = ON("ERROR")
ON ERROR loWord = .NULL.
* Здесь выполняем проверку на то, что - а не запущен ли и работает Word в данный момент, и 
* если это так, то получаем ссылку на его экземпляр,
* в противном случае  (т.е. – нет в момент выполнения этого кода, запущенного Word) возникнет ошибка 
* и переменная loWord становится равна .NULL.
loWord = GetObject(, "Word.Application")
ON ERROR &lcOldError

* А вот это - будет  выполнятся, когда loWord = .NULL.,
* Здесь запускается невидимая копия Word без загрузки в нее документа
IF ISNULL(loWord)
	loWord = CreateObject("Word.Application")
ENDIF

А, что получилось у тебя, объектные переменные - oword и owordRef ссылаются, каждая на свой экземпляр Word и эти экзкмпляры находятся в разных процессах и если ты, через ссылку oword, в коллекцию добавил документ, то обращение к этому документу через ссылку – owordRef - вызовет ошибку, так как в Wordе, который находится «под контролем» owordRef – ничего не добавилось и не изменилось.

Экспериментируй с этим кодом до полного ... понимания.
Код: plaintext
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.
*
LOCAL oword, owordRef, lcNaimDoc_oword, lcNaimDoc_oWordRef, lnCount_oword, lnCount_oWordRef   

oword=create('word.application') 

* Работаем через ссылку - oword
oword.documents.add() 
lnCount_oword = oword.documents.count
lcNaimDoc_oword = oword.Documents.Item( 1 ).Name
oword.Documents(lcNaimDoc_oword).Activate

* Работаем через ссылку - owordRef
oWordRef = GetObject('','word.application') 
owordRef.documents.add()    && Добавляем документ
owordRef.documents.add()    && Добавляем еще один документ
lnCount_oWordRef = owordRef.documents.count
lcNaimDoc_oWordRef = owordRef.Documents.Item( 2 ).Name
owordRef.Documents(lcNaimDoc_oWordRef).Activate

* Если снять комментарий с кода ниже, то можно увидеть число документов в коллекции по ссылке - lnCount_oword
* и число документов в коллекции  по ссылке - owordRef
*WAIT "Количество документов в коллекции по ссылке oword - " + ALLTRIM(STR(lnCount_oword)) +;
          " и по ссылке - owordRef - " +  ALLTRIM(STR(lnCount_oWordRef )) window 


oword.Documents.Item( 1 ).Select
oword.Selection.TypeText("Этот текст, вставлен в документ коллекции по ссылке - oword")

* Если убрать комментарии с  2 -х последующих строк кода - будет ошибка, так как объектная переменная - oword
* ссылается на Word который имеет коллекцию документов состоящую из  1  документа
* а обращение идет ко  2 -му.
*oword.Documents.Item( 2 ).Select
*oword.Selection.TypeText("Этот текст вставлен в другой документ коллекции по ссылке - oword")


owordRef.Documents.Item( 1 ).Select
owordRef.Selection.TypeText("Этот текст, вставлен в документ коллекции по ссылке - owordRef")

* А здесь ошибки - нет, так как объектная перменная - owordRef ссылается на приложение Word с коллекцией из  2 -х документов 
owordRef.Documents.Item( 2 ).Select
owordRef.Selection.TypeText("Этот текст, вставлен в другой документ коллекции по ссылке - owordRef")

* Делаем видимым Word из первого процесса
oword.visible = .t.
* Делаем видимым Word из второго процесса
oWordRef.visible = .t.

* В этом месте, нажми на Ctrl+Shift+Esc и в Диспетчере задач Windows на вкладке -  "Процессы" 
* посмотри сколько Wordoв у тебя запущено. Должно быть -  2 
* Затем закомментируй весь код относящийся к ссылке - oWordRef и взгляни еще раз. Должно быть -  1  

Если это не вызвано какими-то существенными, но не озвученными – обстоятельствами, то мне не понятно, зачем ты создаешь еще одну ссылку – owordRef, если у тебя уже есть ссылка – oword?
Тебе что - нужно два независимо работающих Wordа в разных процессах?
...
Рейтинг: 0 / 0
таблы в worde
    #33813051
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Недоходящий!

> Вот нашел и решил попробывать:

Неразумно использовать одновременно и 'word.application' и древний
'word.basic'

> И еще макрос ворда Selection.TypeText Text:="m" как перевести?

Selection.TypeText("m")

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
таблы в worde
    #33813178
-)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-)
Гость
Вот еще информация, которая может тебя натолкнуть на размышления
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
* Эти две строки приведут к запуску новой невидимой копии – Word,
* что имеет место в твоем примере
loWord1 = CreateObject("Word.Application")
loWord2 = GetObject ("", "Word.Application")


* А вот эта строка, позволит получить ссылку на текущее приложение Word, (т.е. в момент   
* выполнения кода – Word уже запущен)
* Если Word в данный момент не запущен, то будет сгенерировано сообщение об
* ошибке.
loWord3 = GetObject(, "Word.Application")

Обрати внимание - какая большая разница получается, в зависимости от того - опущен ли первый аргумент вообще или он равен пустой строке , в функции – GetObject()
...
Рейтинг: 0 / 0
таблы в worde
    #33816103
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 all

Ребята огромное спасибо за обяснения! Вы мне дали ценную инфу. Просто супер. Теперь эксперементирую дальше. Еще я так понял что в ворде в отличии от эксель нужно следить за местом расположения курсора, дабы правильно размещать информацию на листе.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / таблы в worde
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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