:: Visual Foxpro, Foxpro for DOS
BUG: Member objects + Property_assign
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, All & Aleksey Tsingauz especially!

Вот опять нарвался на не совсем понятное, и наверное неправильное поведение
фокса. Итак:

1) Создаём класс chk (производный от CheckBox) в библиотеке test.vcx
В классе создаём новое пользовательское свойство nSome (Default/Initial
Value = 0) и отмечаем переключатель Assign Method.
В тело метода nSome_Assign помещаем следующий простой код:
LPARAMETERS vNewVal
MESSAGEBOX("nSome_Assign fired for object " + SYS(1272, This))
IF This.nSome # m.vNewVal
This.nSome = m.vNewVal
ENDIF

2) Создаём класс frm (производный от Form) в той-же (или другой - это
неважно) библиотеке.
На форму помещаем 6 объектов класса chk - (их имена chk1, chk2 и т.д.
оставляем без изменения). Удобно разместить их в две строки - первые 3 и
ниже вторые 3.
В окне свойств для chk1 и chk4 устанавливаем свойство nSome в 15, для chk2 и
chk5 устанавливаем nSome в =1+2+4+8 (без кавычек, скобок, лишних пробелов но
со знаком равно), chk3 и chk6 не трогаем (оставляем унаследованное от класса
chk значение 0).

3) Создаём форму производную от класса frm (CREATE FORM frmTest AS frm FROM
test.vcx). В окне свойств устанавливаем для объекта chk1 свойство nSome в
=1+2+4+8 (см. примечания выше), для объектов chk2 и chk3 свойство nSome в
15.

4) Запускаем форму на выполнение (DO FORM frmTest) и наблюдаем результаты:
- Событие nSome_Assign срабатывает только для тех объектов, для которых
свойство переопределялось на уровне формы. Это можно считать нормальным
поведением (by design) - но необходимо документировать (в хелпе или статье
KB).
- Происходит ошибка при срабатывании nSome_Assign для chk1 ! Проблема
кроется очевидно в том, что на уровне класса данное свойство содержит
выражение, а на уровне формы - простое значение (число). Как видим при
обратном сочетании (число в классе, выражение в форме - как например для
объекта chk2) ошибка не возникает. Более того если при возникновении ошибки
попытаться просмотреть содержимое свойства nSome в отладчике (добавив
например This в окно Watch, или просто подведя указатель мыши к This.nSome в
окне кода и дождавшись появления всплывающей подсказки), то можно увидеть
всё что угодно, начиная от произвольного мусора, и заканчивая кусками
исходного текста программы. Более того, свойство nSome находящееся в таком
"промежуточном" состоянии неадекватно ведёт себя с функциями TYPE(),
VARTYPE(), PEMSTATUS(), GETPEM() и возможно другими.

P.S. Также отослано на vfpfeed




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 25 (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика