powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Refresh
5 сообщений из 5, страница 1 из 1
Refresh
    #36509930
tansoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объясните такую тонкость Refresh в vpf-9.0 sp2.

В хелпе про него написано:
Код: plaintext
1.
2.
3.
4.
5.
Repaints a form or control and refreshes any values, or refreshes a project's visual display.

When a form is refreshed, all controls on the form are also refreshed. When a page frame is refreshed, only the active page is refreshed.
When you call the Refresh method for a Label control, Visual FoxPro updates the Caption property and redraws the label.
When you call the Refresh method for a Shape control, Visual FoxPro redraws the shape.

Насколько я понимаю, тут сказано, что при "рефреше" формы должно происходить обновление всего входящего в форму, кроме неактивных страниц pageframe.

Однако, у меня не все обновляется. Например:

1. Назначаем форме новое свойство myVALUE с начальным значением .t.
2. накладываем на форму две commandbutton и один shape и один label.
3. В click первой кнопки пишем

Код: plaintext
1.
thisform.myVALUE= ! thisform.myVALUE
thisform.Refresh

4. в Enabled второй кнопки пишем: =Thisform.myVALUE
5. "FontBold"-у лейбла присваиваем: =Thisform.myVALUE
6. и, к примеру, в visible "шейпа" пишем то же самое: =Thisform.myVALUE.

Итак, при нажатии первой кнопки вторая кнопка должна деактивироваться, лейбл "похудеть", а Shape вообще исчезнуть. Однако, этого не происходит.

Исчезновение, "похудание" и деактивация происходят только если в click первой кнопки прописать персональное обращение:

Код: plaintext
1.
2.
thisform.shape1.visible=thisform.myVALUE
thisform.label1.enable=thisform.myVALUE
thisform.shape1.enable=thisform.myVALUE

Объясните, pls, отчего Thisform.Refresh не "рефрешит" все свои контролы? Или им до фени свойства формы ?
...
Рейтинг: 0 / 0
Refresh
    #36509947
tansoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sorry, ачепятка... Последний код должен выглядеть так:

Код: plaintext
1.
2.
Thisform.Command2.Enabled=Thisform.myVALUE
Thisform.Label1.Fontbold     =Thisform.myVALUE
Thisform.Shape1.Visible      =Thisform.myVALUE
...
Рейтинг: 0 / 0
Refresh
    #36510070
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы путаете понятия "ссылка" и "значение".

Когда Вы даете команду вроде

Код: plaintext
Thisform.Command2.Enabled = Thisform.myVALUE

То Вы присваиваете свойству Enabled то значение свойства myVALUE которое есть сейчас. Именно на момент присвоения.

После выполнения этой команды свойство Enabled "забывает" про свойство myVALUE. Оно уже получило от него все, что необходимо. Получило значение.

Теперь Вы можете менять значение свойства myVALUE сколько угодно и на что угодно, но на свойство Enabled это не повлияет никак. Между этими свойствами просто не осталось никакой связи.

Если Вы хотите "обновить" значение свойства Eanbled актуальным значением свойства myValue, Вам придется в принудительном порядке снова дать команду на присвоение.

В FoxPro нет возможности в качестве значения свойства указать ссылку на другое свойство (исключение - это ссылка на объект).

До некоторой степени автоматизировать весь этот процесс помогает метод X_Assign(). Т.е. когда Вы создаете свое свойство MyValue, то в окне настройки есть такая птичка "Assign Method". Если ее установить, то будет создан метод с именем MyValue_Assign()

Этот метод будет срабатывать каждый раз при программном изменении значения свойства MyValue. Соответственно, в этом методе и следует прописать все присвоения.
...
Рейтинг: 0 / 0
Refresh
    #36510213
tansoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Владимиру за подробный ответ.

Но с этим методом X_assign() мне не понравилось. В сущности, получается, что вместо того, чтобы обойтись вывешиванием единственного объявления о том, что всем контролам следует перестроиться(т.е. изменить myVALUE и забыть), я должен перепоручать это занятие другому лицу.
И это будет даже не простая объява, но уже с его стороны, а рассылка писем счастья каждому контролу.

В сущности, это я мог сделать и в своем click первой кнопки. Вместо привлечения посредника x_assign(), я сам мог разослать приказы контролам непосредственно из click-a первой кнопки.

Мда.... У меня слишком много однотипных контролов будет, причем переменное количество, чтобы по каждому поводу лезть в этот x_assign() и добавлять ручками приказы...

Однако, благодаря вашему ответу я смекнул, что автоматизировать можно иначе.
При создании каждого контрола в его собственный Refresh следует вставить строчку
типа:

Код: plaintext
This.Enabled=Thisform.myValue

По-моему, так было бы правильнее. Тем более, что работает. :)
Еще раз спасибо
...
Рейтинг: 0 / 0
Refresh
    #36510288
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tansoc
Однако, благодаря вашему ответу я смекнул, что автоматизировать можно иначе.
При создании каждого контрола в его собственный Refresh следует вставить строчку
типа:

Код: plaintext
This.Enabled=Thisform.myValue

По-моему, так было бы правильнее. Тем более, что работает. :)

Собственно, это один из стандартных способов автоматической верификации объектов, основанный на том факте, что вызов метода Refresh() объекта-контейнера вызывает методы Refresh() всех вложенных в него объектов.

Возможно, будет полезным еще метод SetAll(), который позволяет присвоить одно и то же значение одноименному свойству всех объектов одного класса-родителя, вложенных в объект-контейнер. Правда, его недостаток (как и достоинство) в "глобальности" охвата. Невозможно сделать присвоение "всем кроме".
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Refresh
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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