Дополнительные сведения для форм в Visual FoxPro
« Назад Вариант взаимодействия формы ListForm с панелью инструментов ListFormToolBar можно распространить и две или более формы, запуская одну форму, например d:\FormTwo.scx, из другой, например из d:\FormOne.scx, и передавая в FormTwo в качестве параметра ссылку на себя – на FormOne. Пример. Создаются две формы FormOne и FormTwo (рис. 10.29). Рис. 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. Замечание. Возможны и иные способы взаимодействия с формой, в том числе:
Пример. Программой 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 |