Сложнейшая задача для дилетанта
01/06/2009 16:10:29
#Link
Салютую всем заинтересованным, и тем паче всем, кто сможет помочь)))
Возникла надобность автоматизации некоторых рабочих процессов в 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, да и справочника человеческого тоже нема, а юзать хелп - все равно, что искать черную кошку в темной комнате...так что уповаю на вас, друзья....Уж очень хочется развить свой пытливый мозг в этом направлении.....
Re: Сложнейшая задача для дилетанта
01/06/2009 18:03:12
#Link
а что вы конкретно хотите то?
чтобы за вас написали макрос или чтобы вас научили писать на ВБА? :D
Re: Сложнейшая задача для дилетанта
01/06/2009 18:16:39
#Link
в том-то и дело, что хочу сам, то есть что бы меня направили в нужное русло....я уже написал, основываясь на примерах, макрос выравнивания объектов по левому краю с организацией заданного пробела между объектами...теперь мне нужно понять алгоритм сравнения по ширине всего массива моих объектов, то есть мне нужно, что бы мои объекты выравнивались по левому краю с промежутком в 3мм между собой, при этом отсортированы по размеру)))......сейчас сижу в кипе распечаток-пытаюсь поближе понять синтаксис)).....а Вы, я понимаю, можете предложить свои услуги за некоторое количество liberal values!?...
Re: Сложнейшая задача для дилетанта
01/06/2009 18:18:12
#Link
в данный момент я буду рад, если мне кто-нибудь сможет разжевать представленный в начале код))
Re: Сложнейшая задача для дилетанта
01/06/2009 18:39:12
#Link
ну, код мой
он просто создает нечто вроде массива, упорядоченного по координате 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
Re: Сложнейшая задача для дилетанта
01/06/2009 18:54:00
#Link
ну то что туда вместо позиции нужно размер вклинивать - я понял, поэтому и схватился за алгоритм, но в силу нулевого опыта некоторые вещи непонятны, спасибо за подсказки, я поморочусь,и если что получится, вынесу на одобрение))))......если я чем-то смогу помочь, обращайся без стеснения)))
Re: Сложнейшая задача для дилетанта
01/06/2009 18:57:55
#Link
Это мой изначальный код......сюда то я и буду вклинивать сортировку, но скорее всего потом нужно будет как-нибуть упрощать посредством общих функций или каких-либо универсальных классов....Конечный проект, по моей задумке, облегчит жизнь многим братьям по цеху....
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
Re: Сложнейшая задача для дилетанта
01/06/2009 19:41:00
#Link
советую до кучи, найти несколько книг или сайтов с примерами, по основам ВБА... это вам поможет разобратся в самом языке.
ПС. Не, услуги я не предлагаю... надоело это ВБА
Re: Сложнейшая задача для дилетанта
02/06/2009 13:39:26
#Link
Спасибо Sancho, уже перерыл кучу ресурсов, немногим раньше уже имел знакомство с VB, даже маленький exe'шничек сделал по книжке. теперь пытаюсь поженить Corel с Exel'ем..... занимательное это дело - скрипты писать)))
Кстати, может посоветуешь литературку, которая на твой взгляд наиболее доходчиво объясняет работу в VB|VBA (содержание задач с примерами их решений вообще было бы прекрасно)....
Источник: https://powerclip.ru/modules/newbb/viewtopic.php?topic_id=8843&start=0