Render.ru

Автоматический счётчик в Corel

#1
Ситуция такова:
каждый день печатаются куча картинок из Corel. На картинках есть элемент "Текст", который показывает номер по порядку кртинки. Номера каждый раз приходится исправлять, т.е. было 100 - стало 101, было 101 - стало 102 и т.д. в огромном количестве. Естественно это очень большие затраты времени, хотя из всего рисунка меняется именно только порядковый номер.
Есть ли какие то средства, какие бы позволили автоматически менять эти номера (допустим +1 к предыдущему номеру) например при открытии этого рисунка? Или нажал кнопку и они поменялись. Одним словом автоматизировать.

Спасибо
 
#4
Вот тебе простенький макрос.
Скопируй приведенный ниже модуль в буфер обмена.
Запусти Корел 9, 10, 11.
В меню выбери: Tools => Visual Basic => Visual Basic Editor...
Далее.

В окне Project выбери GlobalMacros и перейди в папку Modules
В меню VBA выбери: Insert =>Module
Появится новый модуль навроде Module1, щелкни правой кнопкой и выбери
View Code, перейди на окно кода и впаяй код из буфера
В свойствах модуля поменяй имя: например - Counter
Сохрани все.

Потом в Кореле сооруди себе кнопочку и через нее будешь запускать этот макрос. Но учти:
1. Макрос работает только если выделен один объект Artistic or Paragraph.
2. Текст должен содержать только цифры (целые числа).
3. Зашиты от ошибок нет. Если будет выделен другой объект: квадроат, элипс и т.д. то получишь сообщение об ошибке и все тормознется.

Удачи...
 
#5
А вот и сам макрос

Sub Counter()
Dim NumberText As String, Numer As Integer
With ActiveShape.Text
NumberText = .Contents(cdrAllFrames)
Numer = Val(NumberText)
Numer = Numer + 1
NumberText = Str(Numer)
.Contents(cdrAllFrames) = NumberText
End With
End Sub

Это так себе написано. По быстрому.
Кому надо пользутесь, а кто может допишите по себя захват текстового объкта без предварительного выделения мышкой.
 
#6
Дык, защита от ошибок элементарно делается:

OnError (и какой-нибудь msgbox)
Exit Sub
 
#7
Спасибо!!!! Сделал! Работает!

И еще один вопросик:
если таких элементов "Text" на рисунке штук 10. И чтобы одновременно при нажатии этой кнопочки в каждом из них прибавлялось по единице, а?

Просто это позарез надо, времени вникнуть в VB нет. После этого обязательно залезу разбираться.


Спасибо!
 
#8
И в дополнение:

кроме этих элементов-счетчиков "Text" , на рисунке есть еще элементы "Text", но содержащие буквы. А нужно, чтобы менялись только элементы, которые отображают порядковый номер. Т.е. может им можно присвоить какие-то имена (нужным элементам) и выбирать для обработки только их?
Или как?
 
#9
Ну, конечно, хочется все сразу.

Я еще и другую работу делаю...

По поводу счетчика на все необходимые элементы, то мы поступим так:

В Кореле, с помощью Менеджера Объектов, перетащи необходимые текстовые элементы на самый верх. Сегодня или завтра я допишу код для этих элементов, а тебе самому кое-что придется подправить, т.к. я не знаю сколько их на слое. Писать макрос на определение - что там: буквы или цифери - я думаю не стоит.

Постараюсь сегодня записать.
 
#11
Объектам в документе CorelDRAW! можно присваивать некое свойство NAME — это в Tools > Object Data Manager.
Потом в VB можно для выбора объекта использовать след. конструкцию:

Sub main()
Dim S As Shape
Set S = ActiveDocument.ActivePage.FindShape("Pupkin", cdrTextShape, , True)
S.CreateSelection
End Sub

Сей фрагмент выбирает и выделяет в текущем документе тектстовый объект (в т.ч. и входящий в состав группы) с именем Pupkin.
 
#13
Можно сделать и так как предложил Shyapa.

Ниже переписанный код для любого количества объктов, расположенных на слое по порядку сверху-вниз. Самых верхний объект в Кореле имеет ID=1, второй ID=2 и т.д. Поэтому я и предложил перетащить необходимые объекты наверх. Теперь осталось определиться - сколько их. В данном примере их - 6.
Это число стоит в начале цикла "For var=1 To 6". Подставь туда необходимое тебе число.

Sub Counter()
Dim var As Variant
Dim NumberText As String, Numer As Single
With ActivePage.Shapes
For var = 1 To 6
.Range(Array(var)).CreateSelection
With ActiveShape.Text
NumberText = .Contents(cdrAllFrames)
Numer = Val(NumberText)
Numer = Numer + 1
NumberText = Str(Numer)
.Contents(cdrAllFrames) = NumberText
End With
Next var
End With
MsgBox "Recount complete."
End Sub



Название макроса я не изменял, чтобы не возиться тебе с настройками кнопки. Изменился только тип переменной "Numer" для работы с большими числами.

Удачи.
 
Сверху