Можно ли создать массив динамически?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Можно ли создать массив динамически?
Можно с оговорками, см. "arrays - variable size".
С уважением, ДП
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Можно ли создать массив динамически?
Для GROUP не работает... хотя обошел, так как массив групп из двух целочисленных полей можно выразить как в два раза больший массив этих полей... Спасибо
Можно ли создать массив динамически?
Clarion 6.1
Я так делаю с динамическими массивами (помогает и как указатель на массив при работе с WinAPI)
Я так делаю с динамическими массивами (помогает и как указатель на массив при работе с WinAPI)
Код: Выделить всё
mRunDynArray procedure
tgMyGroup group,type
lID long
rSum real
szStr cstring(31)
end
tagMyGroupArray group,type
gMyGroup group(tgMyGroup),dim(1).
end
pagMyGroupArray &tagMyGroupArray
loc:ptr long
loc:lArraySize long(10)
!Ниже для нагладности
qMyGroup queue(tgMyGroup).
loc:i long
window WINDOW('mRunDynArray'),AT(,,331,216),FONT('MS Sans Serif',10,,FONT:regular),CENTER,STATUS,SYSTEM, |
GRAY,MAX,RESIZE,MDI
SPIN(@n4),AT(132,5,60,12),USE(loc:lArraySize),HVSCROLL,RIGHT(2),RANGE(1,100),STEP(1)
BUTTON('Создать'),AT(210,2,60,16),USE(?bArrayCreate),FLAT,LEFT,ALRT(EscKey),ICON(ICON:New)
PROMPT('Размер массива'),AT(73,6),USE(?Prompt1)
LIST,AT(1,30),USE(?qMyGroup),FULL,HVSCROLL,ALRT(EnterKey),ALRT(MouseRight),ALRT(EnterKey),ALRT(MouseLeft2), |
ALRT(EscKey),VCR,FORMAT('40R(2)|FM~ID~@n11@60R(2)|FM~Сумма~@n18.2@140L(2)|FM~Строка~S(800)@s255@'), |
FROM(qMyGroup)
BUTTON('Выход'),AT(1,2,60,16),USE(?bClose),FLAT,LEFT,ALRT(EscKey),ICON('exit.ico'),STD(STD:Close)
END
code
open(window)
accept
case field()
of ?bArrayCreate
case event()
of EVENT:Accepted
do mRun
end
end
end
do onExit
close(window)
onExit routine
do mFreePtr
mFreePtr routine
if loc:ptr
!WinAPI
HeapFree(GetProcessHeap(),0,loc:ptr)
loc:ptr = 0
end
mRun routine
do mFreePtr
update(?loc:lArraySize)
if ~inrange(loc:lArraySize, 1, 100) !Сами ограничиваем
Select(?loc:lArraySize)
beep
exit.
!WinAPI
loc:ptr = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size(tgMyGroup) * loc:lArraySize)
if ~loc:ptr
exit.
pagMyGroupArray &= (loc:ptr)
do mFill_Array
do mFill_Queue
mFill_Array routine
loop loc:i = 1 to loc:lArraySize
pagMyGroupArray.gMyGroup[loc:i].lID = loc:i
pagMyGroupArray.gMyGroup[loc:i].rSum = 200 + loc:i
pagMyGroupArray.gMyGroup[loc:i].szStr = 'Строка номер '&loc:i
end
mFill_Queue routine
free(qMyGroup)
loop loc:i = 1 to loc:lArraySize
qMyGroup = pagMyGroupArray.gMyGroup[loc:i]
add(qMyGroup)
end