В некоторых случаях при разработке пользовательских проектов может возникнуть необходимость расширения свойств (методов) стандартной формы за счет применения наследования от пользовательских классов или интерфейсов. В дальнейшем для доступа к пользовательским свойствам (методам), необходимо осуществлять приведение к пользовательскому классу или интерфейсу. Если по ходу программы однозначно нельзя определить, может ли какая-либо форма быть приведена к пользовательскому классу (интерфейсу), то необходимо осуществлять проверку на возможность преобразования с использованием операции Is. Рассмотрим типичный вариант проверки на примере MDI-приложения.
Для выполнения примера предполагается наличие главной MDI-формы и нескольких дочерних MDI-форм. Главная MDI-форма содержит панель инструментов, содержащую две кнопки. Одна из дочерних MDI-форм содержит расширение за счет пользовательского интерфейса IUserInterface. В интерфейсе описано одно свойство, реализация свойства представлена в классе формы. Возможный код форм представлен ниже:
Главная MDI-форма:
Class MDIMainForm: Form
Toolbar1: Toolbar;
ToolbarButton1: ToolbarButton;
ToolbarButton2: ToolbarButton;
Form1: MDIChild1Form;
Form2: MDIChild2Form;
//...
//Переменные для n дочерних MDI-форм
//...
Sub MDIMainFormOnShow(Sender: Object; Args: IEventArgs);
Begin
Form1 := New MDIChild1Form.CreateForm(Self As IWin32Window);
Form2 := New MDIChild2Form.CreateForm(Self As IWin32Window);
//...
//Создание n дочерних MDI-форм
//...
End Sub MDIMainFormOnShow;
Sub ToolbarButton1OnClick(Sender: Object; Args: IEventArgs);
Begin
If Self.MDIActive Is IUserInterface Then
Text := (Self.MDIActive As IUserInterface).UserProp;
End If;
End Sub ToolbarButton1OnClick;
Sub ToolbarButton2OnClick(Sender: Object; Args: IEventArgs);
Begin
If Self.MDIActive Is IUserInterface Then
(Self.MDIActive As IUserInterface).UserProp := Math.Rand.ToString;
End If;
End Sub ToolbarButton2OnClick;
End Class MDIMainForm;
Дочерняя MDI-форма, расширенная за счет пользовательского
интерфейса:
Public Class MDIChild1Form: Form, IUserInterface
EditBox1: EditBox;
Sub Set_UserProp(s: String);
Begin
EditBox1.Text := s;
End Sub Set_UserProp;
Function Get_UserProp: String;
Begin
Return EditBox1.Text;
End Function Get_UserProp;
End Class MDIChild1Form;
Public Interface IUserInterface
Sub Set_UserProp(s: String);
Function Get_UserProp: String;
Public Property UserProp: String Get Get_UserProp Set Set_UserProp;
End Interface IUserInterface;
После выполнения примера при нажатии кнопок панели инструментов главной MDI-формы, будет осуществляться проверка на возможность приведения активной дочерней MDI-формы к пользовательскому интерфейсу IUserInterface. Если преобразование возможно, то в зависимости от нажатой кнопки, будет считываться, либо устанавливаться значение свойства «UserProp», описанного в интерфейсе IUserInterface. При считывании значение будет выводиться в заголовок формы. В качестве устанавливаемого значения будет случайное вещественное число.

См. также: