Пример иллюстрирует использование строки ввода, зависимых и независимых кнопок и нестандартных команд.
Для задания начальных параметров и чтения параметров, установленных в результате диалога, используется поле TDialog.Data. Это поле содержит данные, используемые в ходе диалога, в виде записи, поля и тип которой строго соответствуют порядку и типу вставляемых в окно терминальных элементов. В нашем примере (см. текст программы) первым в окно вставляется статический текст, однако этот терминальный элемент не имеет параметров, которые можно было бы изменить в ходе диалога, поэтому в записи Data ему не отводится место. Второй по счету в окно вставляется строка ввода TInputLine. Этот объект характеризуется длиной L строки, указываемой вторым параметром обращения к TInputLine.Init, поэтому для него в Data выделяется поле, длинойL+1 байт. Каждому кластеру с кнопками выделяется поле WORD, что дает возможность задать в кластере до 16 независимых кнопок и до 65536 зависимых: каждая независимая кнопка связана с соответствующим разрядом 16-битного поля (первая кнопка - с младшим разрядом), а каждой зависимой кнопке соответствует свое число (первой кнопке соответствует число 0, второй - 1 и т.д.). Установка данных в поле TDialog.Data осуществляется методом TDialog.SetData, получить данные после диалога можно с помощью метода TDialog.GetData.
{$Х+}
Uses Objects , App , Drivers , Dialogs,Menus,Views,MsgBox ;
type
MyApp = object (TApplication)
Procedure InitStatusLine; Virtual;
Procedure HandleEvent (var Event: Tevent) ; Virtual;
Procedure GetDialog;
end;
PMyDialog = TMyDialog;
TMyDialog = object (TDialog)
Procedure HandleEvent (var Event: Tevent); Virtual;
end;
const
cm0 = 200;
cm1 = 201;
cm2 = 202;
{-------------------}
Procedure MyApp.InitStatusLine;
{Создает строку статуса}
var
R: TRect;
begin
GetExtent(R) ;
R.A.Y := pred(R.B.Y) ;
StatusLine := New(PStatusLine, Init(R,
NewStatusDef (0,$FFFF,
NewStatusKey ( ' ~Alt-X~ Выход' , kbAltX, cmQuit,
NewStatusKey ( ' ~F1~ Вызов окна', kbF1,cm0, NIL)),
NIL) ) )
end {MyApp.InitStatusLine} ;
{-----------------}
Procedure MyApp.HandleEvent;
{Обрабатывает нестандартную команду cm0}
begin
Inherited HandleEvent (Event) ;
case Event . Command of
cm0 : GetDialog
else
ClearEvent (Event)
end
end {MyApp . HandleEvent} ;
{------------------}
Procedure MyApp.GetDialog;
{Создает и использует диалоговое окно}
var
R: TRect; {Координаты элементов}
D: PMyDialog; {Диалоговое окно}
I: PInputLine; {Строка ввода}
RB: PRadioButtons; {Зависимые кнопки}
СВ: PCheckBoxes; {Независимые кнопки}
s : String; {Для вывода сообщения}
const
L = 120; {Длина строки ввода}
type
TDialogData = record {Параметры диалогового окна}
I_Data: String [L]; {Текст в строке ввода}
CB_data: Word; {Независимые кнопки}
RB_Data: Word {Зависимые кнопки}
end;
const
st: array [0..2] of String = ('Первое','Второе','Третье ');
Data : TDialogData =( {Начальные параметры диалога}
I_Data : 'Начальный текст';
CB_Data: 3; {1-я и 2-я кнопка}
RB_Data: 2); {3-е продолжение}
begin
R.Assign(5,3,75,18); {Координаты диалогов ого окна}
D := New(PMyDialog,Init(R,'