Могу предложить такой вариант...
Код: Выделить всё
PROGRAM
MAP
END
IteratorQueue QUEUE,TYPE
Item &CSTRING
END
Iterator CLASS,TYPE
Items &IteratorQueue,PRIVATE
Position LONG,PRIVATE
Construct PROCEDURE
Destruct PROCEDURE
Init PROCEDURE(*QUEUE Q, LONG FieldPosition=1)
Init PROCEDURE(STRING Items)
AddItem PROCEDURE(STRING Item)
Count PROCEDURE(),LONG
Get PROCEDURE(),STRING
Next PROCEDURE(),STRING
Kill PROCEDURE
END
IterOne Iterator
TestQueue QUEUE
ID LONG
Number LONG
END
CODE
! вариант 1
IterOne.Init('1,2,3')
LOOP IterOne.Count() TIMES
MESSAGE(IterOne.Get())
END
IterOne.Kill
! вариант 2
IterOne.AddItem(100)
IterOne.AddItem(200)
IterOne.AddItem(300)
LOOP IterOne.Count() TIMES
MESSAGE(IterOne.Get())
END
IterOne.Kill
! вариант 3
LOOP W# = 1 TO 5
TestQueue.ID = W#
TestQueue.Number = RANDOM(1,1000)
ADD(TestQueue)
END
IterOne.Init(TestQueue, 2)
LOOP IterOne.Count() TIMES
MESSAGE(IterOne.Get())
END
Iterator.Construct PROCEDURE
CODE
SELF.Items &= NEW IteratorQueue
Iterator.Destruct PROCEDURE
CODE
SELF.Kill
DISPOSE(SELF.Items)
Iterator.Init PROCEDURE(*QUEUE Q, LONG FieldPosition=1)
Cnt LONG
Field ANY
CODE
LOOP Cnt = 1 TO RECORDS(Q)
GET(Q, Cnt)
Field &= WHAT(Q, FieldPosition)
SELF.AddItem(Field)
END
Iterator.Init PROCEDURE(STRING Items)
SplitStrPos LONG,AUTO
StartPos LONG(1)
Delimiter EQUATE(',')
CODE
LOOP
SplitStrPos = INSTRING(Delimiter, Items, 1, StartPos)
IF SplitStrPos
SELF.AddItem(Items[StartPos : SplitStrPos-1])
StartPos = SplitStrPos + LEN(Delimiter)
IF StartPos > LEN(Items)
BREAK
END
ELSE
SELF.AddItem(Items[StartPos : LEN(Items)])
BREAK
END
END
Iterator.AddItem PROCEDURE(STRING Item)
CODE
SELF.Items.Item &= NEW CSTRING(LEN(Item)+1)
SELF.Items.Item = CLIP(LEFT(Item))
ADD(SELF.Items)
Iterator.Count PROCEDURE()!,LONG
CODE
RETURN RECORDS(SELF.Items)
Iterator.Get PROCEDURE()!,STRING
CODE
RETURN SELF.Next()
Iterator.Next PROCEDURE()!,STRING
CODE
SELF.Position += 1
GET(SELF.Items, SELF.Position)
IF ERRORCODE() THEN RETURN '' END
RETURN SELF.Items.Item
Iterator.Kill PROCEDURE
Cnt LONG
CODE
LOOP Cnt = 1 TO SELF.Count()
GET(SELF.Items, Cnt)
DISPOSE(SELF.Items.Item)
END
FREE(SELF.Items)
SELF.Position = 0
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса