Регистрация | | запомнить |
 
 
ВК



Просматривают:   1 Анонимно





Сложнейшая задача для дилетанта
print | #
Новичок
Присоединился:
2009/6/1 9:40
Откуда МО
Сообщений: 9
Offline
Салютую всем заинтересованным, и тем паче всем, кто сможет помочь)))
Возникла надобность автоматизации некоторых рабочих процессов в CD13, а так как самому хочется заставить программу работать в нужном русле, лишь прошу у всех вас, как у старших товарищей - не глупых и чутких подтянуть мои знания в VBA для Corela)). стоит несколько задач, но первоначальная - сортировка множества объектов по-нарастающей их ширины....Порылся на форуме, нашел следующие скрипты (весьма полезные при достаточном опыте):

Set gb = ActivePage.FindShapes(, cdrTextShape)

'в объявлении New использовать не надо, ибо будет тормозить
dim coll as Collection: set coll=new Collection

for each s in gb
collStuffSorted coll, s, -1
next
' теперь массив сортирован

dim obj as object ' на всякий случай если не пройдет перебор через 's'
for each obj in coll
set s=obj
'а дальше работать с 's' как с обычным объектом Shape
.............
.............
next

Function collStuffSorted&(coll As Collection, sh as shape, ByVal Direction&)

Dim a&, b&, C&, rel&
a = 1: b = coll.Count: C = 0: rel = 0
dim key0 as double: key0 = sh.PositionX
Do While b - a >= 0
C = (a + b) \ 2: rel = (key0 - coll(C).PositionX) * Direction
Select Case rel
Case is < 0: If C = a Then Exit Do Else b = C
Case 0: Exit Do
Case is > 0: If b = a Then Exit Do Else If a = C Then a = b Else a = C
End Select
Loop
If C = 0 Then coll.Add sh Else If rel = -1 Then coll.Add s, , C Else coll.Add s, , , C

End Function

Но для меня еще это тяжеловато, ибо еще толком не могу врубиться в синтаксис VBA, да и справочника человеческого тоже нема, а юзать хелп - все равно, что искать черную кошку в темной комнате...так что уповаю на вас, друзья....Уж очень хочется развить свой пытливый мозг в этом направлении.....

Опубликовано: 2009/6/1 16:10


Re: Сложнейшая задача для дилетанта
Пользователь 1 уровня
Присоединился:
2006/10/30 14:36
Откуда Барнаул
Сообщений: 252
Offline
а что вы конкретно хотите то?
чтобы за вас написали макрос или чтобы вас научили писать на ВБА? :D

Опубликовано: 2009/6/1 18:03
_________________


Re: Сложнейшая задача для дилетанта
Новичок
Присоединился:
2009/6/1 9:40
Откуда МО
Сообщений: 9
Offline
в том-то и дело, что хочу сам, то есть что бы меня направили в нужное русло....я уже написал, основываясь на примерах, макрос выравнивания объектов по левому краю с организацией заданного пробела между объектами...теперь мне нужно понять алгоритм сравнения по ширине всего массива моих объектов, то есть мне нужно, что бы мои объекты выравнивались по левому краю с промежутком в 3мм между собой, при этом отсортированы по размеру)))......сейчас сижу в кипе распечаток-пытаюсь поближе понять синтаксис)).....а Вы, я понимаю, можете предложить свои услуги за некоторое количество liberal values!?...

Опубликовано: 2009/6/1 18:16


Re: Сложнейшая задача для дилетанта
Новичок
Присоединился:
2009/6/1 9:40
Откуда МО
Сообщений: 9
Offline
в данный момент я буду рад, если мне кто-нибудь сможет разжевать представленный в начале код))

Опубликовано: 2009/6/1 18:18


Re: Сложнейшая задача для дилетанта
Титан - модератор
Присоединился:
2006/4/8 19:42
Сообщений: 152
Offline
ну, код мой он просто создает нечто вроде массива, упорядоченного по координате X (.PositionX в вспомогательной функции collStuffSorted). Надо будет заменить на .SizeWidth.

так, раз сам разбираться будешь, то вот пару подсказок в неупорядоченном виде.

Параметр Direction в вызове collStuffSorted coll, s, -1 это направление сортировки.
Надо будет в начале добавить объявление dim s as shape
Еще заключить основной код в рамки процедуры:
Sub SortObj()
...основной код
End Sub

Function collStuffSorted......
......
end function

ну и самое главное двигать объекты на новые координаты в цикле:
dim obj as object ' на всякий случай если не пройдет перебор через 's'
for each obj in coll
set s=obj
'а дальше работать с 's' как с обычным объектом Shape
.............
.............
next

тут вместо ............ надо например
s.SetPosition curX, CurY
curX=curX+s.SizeWidth+10: if curX>ActivePage.SizeWidth then curX=10: cyrY=curY+100: if curY>ActivePage.SizeHeight then curX=10:curY=10: ActiveDocument.InsertPages 1, false, ActivePage.Index

ну и разумеется в начале процедуры SortObj поставить выбор миллиметров:
ActiveDocument.Unit = cdrMillimeter

ах, да - и в начале же для порядока можно объявить dim CurX#, CurY#: CurX=10: CurY=10

Опубликовано: 2009/6/1 18:39


Re: Сложнейшая задача для дилетанта
Новичок
Присоединился:
2009/6/1 9:40
Откуда МО
Сообщений: 9
Offline
ну то что туда вместо позиции нужно размер вклинивать - я понял, поэтому и схватился за алгоритм, но в силу нулевого опыта некоторые вещи непонятны, спасибо за подсказки, я поморочусь,и если что получится, вынесу на одобрение))))......если я чем-то смогу помочь, обращайся без стеснения)))

Опубликовано: 2009/6/1 18:54


Re: Сложнейшая задача для дилетанта
Новичок
Присоединился:
2009/6/1 9:40
Откуда МО
Сообщений: 9
Offline
Это мой изначальный код......сюда то я и буду вклинивать сортировку, но скорее всего потом нужно будет как-нибуть упрощать посредством общих функций или каких-либо универсальных классов....Конечный проект, по моей задумке, облегчит жизнь многим братьям по цеху....
Public Sub DistributeButt()
Dim X As Double, Y As Double
Dim NumObjs As Long
Dim s As Shape
Dim First As Boolean
Dim i As Integer
Dim d As Document
Set d = ActiveDocument
ActiveDocument.Unit = cdrMillimeter
NumObjs = d.Selection.Shapes.Count
If NumObjs < 2 Then
i = MsgBox("You should select s few objects first", vbOKOnly, "Distributing"
Exit Sub
End If
d.BeginCommandGroup
First = True
For Each s In d.Selection.Shapes
If Not First Then
s.PositionX = X
s.PositionY = Y
End If
X = s.PositionX
Y = s.PositionY - s.SizeHeight - 3
First = False
Next s
d.EndCommandGroup
End Sub

Опубликовано: 2009/6/1 18:57


Re: Сложнейшая задача для дилетанта
Пользователь 1 уровня
Присоединился:
2006/10/30 14:36
Откуда Барнаул
Сообщений: 252
Offline
советую до кучи, найти несколько книг или сайтов с примерами, по основам ВБА... это вам поможет разобратся в самом языке.

ПС. Не, услуги я не предлагаю... надоело это ВБА

Опубликовано: 2009/6/1 19:41
_________________


Re: Сложнейшая задача для дилетанта
Новичок
Присоединился:
2009/6/1 9:40
Откуда МО
Сообщений: 9
Offline
Спасибо Sancho, уже перерыл кучу ресурсов, немногим раньше уже имел знакомство с VB, даже маленький exe'шничек сделал по книжке. теперь пытаюсь поженить Corel с Exel'ем..... занимательное это дело - скрипты писать)))

Кстати, может посоветуешь литературку, которая на твой взгляд наиболее доходчиво объясняет работу в VB|VBA (содержание задач с примерами их решений вообще было бы прекрасно)....

Опубликовано: 2009/6/2 13:39







Форма быстрого ответа
ЛогинИмя   Пароль   Логин
Сообщение:          

      ПРИМЕР


 [далее...]
Уведомлять о сообщениях в теме.



[Настройки поиска]