powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Передать форме массив...
25 сообщений из 26, страница 1 из 2
Передать форме массив...
    #32362582
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно сделать что-то вроде

DIMENSION array(5,5)
DO FORM form1 WITH array TO array

Как?
...
Рейтинг: 0 / 0
Передать форме массив...
    #32362732
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык вроде так все и работает
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363014
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так не рабатаєт :(

В Init form1 пишу
Код: plaintext
1.
2.
Lparameters myarray

? myarray( 2 , 2 ) && говорило, что нет такой программы, пока не добавил EXTERNAL ARRAY

В UNLOAD'е
Код: plaintext
1.
2.
3.
DIMENSION NewArray( 5 , 5 )

NewArray( 2 , 2 )= "NewValue" 
RETURN NewArray

В форме из которой вызывал form1

Код: plaintext
1.
2.
3.
DIMENSION array( 5 , 5 ) 
DO FORM form1 WITH array TO array 

? array( 2 , 2 ) && возвращает .F., а я надеялся увидить  "NewValue" 
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363068
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернее так
Код: plaintext
1.
DIMENSION array( 5 , 5 ) 
DO FORM form1 WITH array TO ModifiedArray 
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363079
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
DIMENSION myarray[ 5 , 5 ]
STORE  0  TO myarray
DO FORM myform WITH myarray TO myarray
DISPLAY MEMORY LIKE myarray

в форме
Код: plaintext
WindowType=  1  && Modal

myform.Init
Код: plaintext
1.
LPARAMETERS x
DISPLAY MEMORY LIKE x

myform.Unload
Код: plaintext
1.
2.
LOCAL ARRAY y[ 5 , 5 ]
STORE  1  TO y
RETURN y
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363084
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ModifiedArray или нет, это в принципе по барабану.

PS у меня фокс 8-й
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363114
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у меня VFP7

Если написать:
DO FORM myform WITH myarray TO myarray
? alen(myarray)&& Возвращает длину старого массива, хотя в новой форме я её уже поменял.

DO FORM myform WITH myarray TO ModifiedArray
? ModifiedArray(2,2) &&Говорит, что ModifiedArray.prg не существует

DO FORM myform WITH myarray TO ModifiedArray
Dimension ModifiedArray(10,5)
? ModifiedArray(2,2) &&Возвращает .F.

Такие вот приколы.

Думаю будет проще сделать
PUBLIC myarray
а так не хотелось этого делать...
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363153
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я глянул в 5-м и 7-м, действительно как параметр массив не воспринимается, а вот возвращается из формы нормально.

> Думаю будет проще сделать
PUBLIC myarray


В принципе достаточно PRIVATE.
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363202
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> а вот возвращается из формы нормально
это уже интересно, как?

form1.Unload
Код: plaintext
1.
2.
DIMENSION y( 5 , 5 )
STORE  1  TO y
RETURN y


Код: plaintext
1.
2.
3.
DIMENSION array( 10 , 5 ) 
STORE  0  TO array
DO FORM form1 WITH array TO array 
? alen(array) && возвратит  50 , а не  25  (хотя первые  25  будут =  1 )
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363225
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если RETURN @y?
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363246
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда
Data type mismatch
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363293
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня VFP6 и лично я передавал в форму не сам массив, а имя массива

DIMENSION MyArray(2,2)
DO FORM MyForm WITH "MyArray"

Соответсвенно в форме делается пропертя, которая будет хранить имя массива, например ArrayName. Тогда Init-формы выглядит так:

LPARAMETERS tcArrayName
ThisForm.ArrayName=m.tcArrayName

В пределах формы я это массив вообще не трогаю. А вот в методе UNLOAD (ну или в любом методе непосредственно предшествующем выгрузке) выполняю нужную модификацию массива

Код: plaintext
1.
2.
3.
4.
LOCAL lcArrayName
lcArrayName=ThisForm.ArrayName
&lcArrayName[ 1 , 1 ]='1'
&lcArrayName[ 2 , 1 ]='2'
...


Фактически, это то же самое, что работа с PUBLIC или PRIVATE массивом. В данном случае он и должен иметь такую область видимости.
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363368
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом массиве у меня список из 3 колонок, который я отображаю в листбоксе.
Листбокс я потом редактирую (добавляю/удаляю строки). Надо бы паралельно править и массив.
Я шото не понял как использовоть функции ADEL и AINS.
Как добавить строчку в массив например, под номером 5 и как удалить например 2? Как быть с перенумерацией строк, надо вручную?
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363391
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lnu

> ? alen(array) && возвратит 50, а не 25 (хотя первые 25 будут = 1)

Возможно, это я не проверял.

> Я шото не понял как использовоть функции ADEL и AINS.

Эти функции не изменяют размерность массива. ADEL() удаляет строку, сдвигает строки идущие за ней и помещает в последнюю строку .F.. AINS() добавляет новую строку, заполненную .F., и сдвигает остальные строки, последняя пропадает. Соответственно и со столбцами.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DIMENSION x[ 6 ]
FOR i= 1  TO ALEN(x)
	x[i]=i
ENDFOR 
DIMENSION x[ALEN(x)+ 1 ]
=AINS(x, 5 )
x[ 5 ]= 0 
=ADEL(x, 2 )
DIMENSION x[ALEN(x)- 1 ]
FOR i= 1  TO ALEN(x)
	?x[i]
ENDFOR 
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363418
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное правило, при работе с функциями типа ADEL, AINS, ACOPY и т.п.

Никакие функции по работе с массивом не изменяют размерности массива

Единственная функция, изменяющая размерность массива - это DIMENSION (DECLARE). Если массив существует, то эта функция просто изменит его размерность, не изменяя области видимости (LOCAL, PUBLIC, PRIVATE). Если не существует, то он будет создан с областью видимости PRIVATE.

ADEL - указынный элемент (или группа элементов) принимают значени .F. и перемещаются в конец массива

AINS - в указанное место вставляется элемент (или группа элементов) со значением .F., а из конца массива удаляется столько элементов сколько было вставлено по AINS()

Например, есть массив

DIMENSION MyArray(10,5)

* Удалить строку №2
=ADEL(MyArray,2)
* И изменить размерность массива
DIMENSION MyArray(9,5)

* Прежде чем вставить строку надо изменить размерность массива
DIMENSION MyArray(10,5)
* Теперь сосбственно вставка строки №5
=AINS(MyArray,5)

Что подразумевается под словами "перенумерация строк"? Изменить порядок следования строк?

Ну допустим, надо поменять местами строки 2 и 5 в данном массиве:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
* Создаем дополнительную пустую строку
DIMENSION MyArray( 11 , 5 )

* Делаем вставку на место  2  строки
=AINS(MyArray, 2 )

* Переносим в эту строку информацию из  5  строки
* а в  5  строку информацию из  2 
* За счет вставки по AINS() строка  2  имеет номер  3 ,
* а строка  5  номер  6 
FOR m.lnI= 1  TO ALEN(MyArray, 2 )
MyArray[ 2 ,m.lnI]=MyArray[ 5 + 1 ,m.lnI]
MyArray[ 5 + 1 ,m.lnI]=MyArray[ 2 + 1 ,m.lnI]
ENDFOR

* Удаляем уже не нужную  2  строку
=ADEL(MyArray, 2 + 1 )

* И возвращаем размерность масива в исходное состояние
DIMENSION MyArray( 10 , 5 )


Со столбцами все значительно сложнее и муторнее. Но тебе это и не надо.

При работе с массивом внутри формы, лучше создать пропертю типа массив и с ней и работать. В качестве источника данных для ListBox можно прямо так и указывать

RowSource=ThisForm.aMyArray
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363423
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что же, спасибо!
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363457
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Что подразумевается под словами "перенумерация строк"?
В листбоксе у меня MoverBar=.T.(и по этому мой массив не может быть как RowSource).
А как отследить, что пользователь переместил строку номер 5 на вторую позицию? InteractiveChange что-ли?
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363471
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
HELP OnMoveItem
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363504
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет такого (vfp7)
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363541
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда.. Тебе именно отследить или достаточно просто просмотреть полученный вариант? В последнем случае используй свойство List.
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363636
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблемка вот в чем.

В листбоксе есть ограничение на длину строки (<255), чтоб обойти это ограничение, я решил держать паралельно массив (где нет таких ограничений). Последовательность строк листбокса и массива должна совпадать. Ну и все, что делается с листбоксом должно произойти с массивом. Перемещение отдельной строки в листбоксе (с помощью moverbar'а), должно вызвать перемещение и в массиве.
Как - мне не извесно. Перемещение вызывает событие InteractiveChange, но так же не известно, перемищение ли это, или только клик. Если перемещение, то откуда куда (ведь тоже надо сделать и с массивом)? А при каждом InteractiveChange сравнивать список и массив не наилучшая идея.
Как тут поступить - не представляю :(
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363932
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убивайте, но я не понимаю зачем нужен массив и тем более для листбокса...
Все списки передаю временной таблицей (курсором), а в форму ее имя...
Проще не бывает!!!!!!!!!
И вообще большое количество параметров так легче передавать и таскать по всей программе...
...
Рейтинг: 0 / 0
Передать форме массив...
    #32363999
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lnu

А зачем "двигать" массив при каждом перемещении? Может просто проводить всю обработку при закрытии формы?
...
Рейтинг: 0 / 0
Передать форме массив...
    #32364444
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется решил проблему.

Листбокс у меня из 3 колонок, а массив теперь из 4. И в эту четвёртую колонку я записываю ListItemId. Если шото удаляєм из листа, тоже удаляєтся из массива ADEL(ar,ASCAN(ar,thisform.list1.IndexToItemId(thisform.list1.ListIndex))/4).

Ну и при закрытии формы "двигаю" массив ;)

Да, кстати, массив я читаю из файла типа этого:

|1|,|2|,|3|
|4|,|5|,|6|
...
Я ищу 2, 4, 6 символ "|" (AT), запихиваю туда то что между ними, и обрезаю строчку до первого CHR(13) и т.д.
Нормальный ли это алгоритм, или есть есть какой-то более быстрый?
На 1500 строк у меня уходит около 15с. (Duron800)
Когда не обрезал строчку (искал 1, 2 символ"|", потом 3, 4; 5, 6; 7,8...) на это дело у меня уходило около 5 мин.
Возможно-ли сделать это ещё быстрее?
...
Рейтинг: 0 / 0
Передать форме массив...
    #32364505
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lnu

Посмотри про APPEND FROM, EXPORT, а так же GETWORDNUM() (кажется в 7-й версии уже было).
И без '|' никак нельзя? Получился бы классический CSV.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Передать форме массив...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]