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 |
© 2000-2024 Fox Club  |