Распечатать страницу

Дополнительные сведения для форм в Visual FoxPro

« Назад

Вариант взаимодействия формы ListForm с панелью инструментов ListFormToolBar можно распространить и две или более формы, запуская одну форму, например d:\FormTwo.scx, из другой, например из d:\FormOne.scx, и передавая в FormTwo в качестве параметра ссылку на себя – на FormOne.

Пример. Создаются две формы FormOne и FormTwo (рис. 10.29).

166.1.-Взаимодействующие-формы 

Рис. 10.29. Взаимодействующие формы: а – форма, открывающая FormTwo;

б – форма, меняющая цвет формы FormOne и ее кнопки

В обработчик события Click кнопки Command1 с заголовком "Открыть FormTwo" формы FormOne поместим следующую строку кода:

do form d:\FormTwo with ThisForm        && Передаем в FormTwo ссылку на FormOne

В форме FormTwo придется добавить новое свойство oFormOne и изменить 2 обработчика.

В обработчик события Init формы FormTwo добавим следующие строки:

&& Обработчик события Init формы FormTwo

parameters oForm

&& Параметр oForm получает ссылку на форму FormOne

This.oFormOne = oForm

В обработчик события Click кнопки "Изменить цвет в FormOne" формы FormTwo поместим следующий код:

&& Обработчик события Click кнопки "Изменить цвет в FormOne" формы FormTwo

&&

&& RGB-компоненты цвета формы

rForm = 255 * Rand( )

gForm = 255 * Rand( )

bForm = 255 * Rand( )

&&

&& RGB-компоненты цвета кнопки

rCmd = 255 * Rand( )

gCmd = 255 * Rand( )

bCmd = 255 * Rand( )

&&

&& Изменяем цвет формы FormOne и ее кнопки "Открыть FormTwo"

ThisForm.oFormOne.BackColor = Rgb(rForm, gForm, bForm)

ThisForm.oFormOne.Command1.BackColor = Rgb(rCmd, gCmd, bCmd)

Чтобы обеспечить работоспособность формы FormTwo при ее независимом открытии, то есть когда она не получает ссылку на форму или когда получает ссылку на форму, не имеющую кнопки Command1, обработчик события Init формы FormTwo можно снабдить следующим кодом:

&& Обработчик события Init формы FormTwo

parameters oForm

&&

&& Проверка типа на NULL и базового класса на равенство "Form"

if VarType(oForm) # "O" or IsNull(oForm) or Upper(oForm.BaseClass) # "FORM" then

MessageBox("Нужно передать ссылку на форму!")

return .F.

endif

&&

&& Проверяем, есть ли в форме oForm кнопка Command1

existCommand1 = .F.

for each ob in oForm.Objects

if Upper(ob.Name) = 'COMMAND1' then

existCommand1 = .T.         && Форма имеет кнопку Command1

exit                                      && Прерываем цикл

endif

next

if not existCommand1 then

MessageBox("Форма " + oForm.Caption + " не имеет кнопки Command1!")

return .F.

endif

&&

&& Параметр oForm содержит ссылку на форму FormOne

This.oFormOne = oForm

Второе уточнение состоит в том, что в обработчик события Destroy формы FormOne добавляется следующий код:

&& Обработчик события Destroy формы FormOne

&&

do while Wexist("FormTwo")

release windows FormTwo && Закрываем форму FormTwo

enddo

Его назначение – закрыть все открытые окна с именем FormTwo при закрытии формы FormOne (число открытий формы FormTwo нами не ограничено).

При этом отметим, что команда

release windows FormTwo

будет продуктивной, если FormTwo – это не только имя файла формы но и значение ее свойства Name.

Замечание. Возможны и иные способы взаимодействия с формой, в том числе:

  • через возвращаемое формой значение (см. описание опции TO VarName команды DO FORM);

  • посредством ссылок на объект формы, создаваемых либо при открытии формы командой DO FORM, либо возвращаемых функциями CreateObject( ) и NewObject( ). В общем случае переменные, хранящие ссылки, должны быть глобальными.

Пример. Программой d:\Test.prg открывается форма d:\FormOne.scx. Запускается программа d:\ChangeColor.prg, окрашивающая форму FormOne в красный цвет.

&& Файл d:\Test.prg

&&

&& После открытия формы переменная FormOne будет сдержать ссылку

&& на объект формы

public FormOne

do form d:\FormOne.scx

&& Конец файла d:\Test.prg 

&& Файл d:\ChangeColor.prg

&&

if VarType(FormOne) = "O" ;

  and not IsNull(FormOne) ;

  and Upper(FormOne.BaseClass) = "FORM" then

&& Изменяем цвет формы FormOne, открытой программой d:\Test.prg

FormOne.BackColor = RGB(255, 0, 0)

else

MessageBox("Форма не обнаружена!")

endif