Практическое занятие № 6

Тема: "Приемы обработки однотипных компонентов"

Цель работы: получить практические навыки по обработке однотипных компонентов как массива с помощью универсальных обработчиков событий

 

Ход работы

 

Задание 1

 

Создать программу, которая эмулирует режим набора телефонного номера. Программа содержит форму вида:

 

 

Все кнопки служат для ввода в текстовое поле номеров телефона, кнопка Flash служит для очистки поля.
 

Указания: для формы задайте свойства: BorderStyle = bsDialog, Caption = Универсальный код. На форму нанесите нужное количество кнопок Button (Standard).

Для каждой из кнопок задайте свойства: Caption = цифра или символы "*", "#".

Для размещения изображения нанесите на форму компонент Image (Additional) и задайте свойства: Stretch = true, Picture = файл изображения, Transparent = true. Изображение телефона найдите на сайте http://www.findicons.com в формате bmp.

 

Для реакции кнопок на нажатие, нужно создать универсальную процедуру, которая в зависимости от нажатой кнопки будет вводить соответствующий символ. Кнопки можно различать по свойствам Caption, которые мы задали ранее.

 

Указания Для первой кнопки в события OnClick введите код:

 

procedure Tform1.Button1Click(Sender: Tobject);

begin

    edit1.Text:=edit1.Text+TButton(ActiveControl).Caption;

end;

 

Все кнопки должны при нажатии выполнять такой же код. Для этого, удерживая Shift выделите все кнопки на форме, в окне задания свойств перейдите на закладку Events и в события Onclick выберите в списке значение Button1Click.

Таким образом, для всех кнопок в события OnClick будет выполняться код из события первой кнопки.

 

 

Задание 2. Работа с массивами однотипныхъ компонентов

 

1. Создайте программу для обработки массива текстовых полей. Программа имеет форму вида:


 

Форма позволяет ввести данные в произвольные поля по желанию пользователя и с помощью переключателей и кнопки рассчитать нужное значение.

 

Указания для формы задайте свойства: BorderStyle = bsDialog, Caption = Массивы компонентов. На форму нанесите нужное количество полей Edit (Standard) для исходных данных, еще одно поле для результата. Для каждого поля очистите свойство Text. Поле результата нужно отделить от массива полей. Для этого в его свойства Tag введите 1.

Для создания группы переключателей нанесите на форму Radiogroup (Standard) и задайте свойства: Items = перечень названий переключателей, ItemIndex = 0 (номер выбранного переключателя по умолчанию).

Нанесите две кнопки Button (Standard) и в свойстве Caption укажите их надписи.

 

Для кнопки "Рассчитать" напишем код, который в зависимости от выбранного переключателя в поле для результата отражает ответ.

 

Указания для кнопки введите код:

 

procedure TForm1.Button1Click(Sender: TObject);

//описываем переменные

var i:integer; //счетчик цикла

result:real; //результат

k:integer; //признак, что хотя бы одно поле заполнено в массиве

kol:integer; //количество элементов для расчета среднего

 

begin

//вначале признак указывает, что поля не заполнены

k:=0;

 

//проверяем какой переключатель выбран

case CadioCroup1.ItemIndex of

//если выбран первый переключатель (нумерация с 0)

0: begin

    //вначале максимум равен маленькому значению

    result:=-100000;

    //запускаем цикл по всем компонентам на форме

    for i:=0 to ControlCount-1 do

        //если компонент - это поле и его Tag не 1

        if (Controls[i].ClassName = 'TEdit') and (Controls[i].Tag<>1)

        //и это поле не пустое

        and (TEdit(Controls[i]).Text<>'') then

            //если значение поля больше максимума

            if strtofloat(TEdit(Controls[i]).Text)>result then

            begin

                //запоминаем поле как максимальное

                result:=strtofloat(TEdit(Controls[i]).Text);

                //включаем признак, что есть заполненные поля

                k:=1;

            end;

end;

 

//если выбран второй переключатель

1: begin

    //вначале минимум равен большому значению

    result:=100000;

    //запускаем цикл по всем компонентам на форме

    for i:=0 to ControlCount-1 do

        //если компонент - это поле и его Tag не 1

        if (Controls[i].ClassName = 'TEdit') and (Controls[i].Tag<>1)

        //и это поле не пустое

        and (TEdit(Controls[i]).Text<>'') then

        //если значение поля меньше минимума

            if strtofloat(TEdit(Controls[i]).Text)<result then

            begin

                //запоминаем поле как минимальное

                result:=strtofloat(TEdit(Controls[i]).Text);

                //включаем признак, что есть заполненные поля

                k:=1;

            end;

end;

 

//если выбран третий переключатель

2: begin

    //вначале сумма = 0

    result:=0;

    //запускаем цикл по всем компонентам на форме

    for i:=0 to ControlCount-1 do

        //если компонент - это поле и его Tag не 1

        if (Controls[i].ClassName = 'TEdit') and (Controls[i].Tag<>1)

        //и это поле не пустое

        and (TEdit(Controls[i]).Text<>'') then

        begin

            //прибавляем поле к сумме

            result:=result+strtofloat(TEdit(Controls[i]).Text);

            //включаем признак, что есть заполненные поля

            k:=1;

        end;

end;

 

//если выбран четвертый переключатель

3: begin

    //вначале сумма = 0 и количество = 0

    result:=0; kol:=0;

    //запускаем цикл по всем компонентам на форме

    for i:=0 to ControlCount-1 do

        //если компонент - это поле и его Tag не 1

        if (Controls[i].ClassName = 'TEdit') and (Controls[i].Tag<>1)

        //и это поле не пустое

        and (TEdit(Controls[i]).Text<>'') then

        begin

            //прибавляем поле к сумме

            result:=result+strtofloat(TEdit(Controls[i]).Text);

            //увеличиваем количество посчитанных элементов в массиве на 1

            kol:=kol+1;

            //включаем признак, что есть заполненные поля

            k:=1;

        end;

    //если количество элементов не 0

    if kol>0 then

        //считаем среднее значение (сумма / количество)

        result:=result/kol;

   end;

end; //конец оператора case

 

//если нет введенных значений (признак остался равным 0)

//завершаем работу процедуры без вывода ответа

if k=0 then exit;

 

//для вывода ответа запускаем цикл по компонентам на форме

for i:=0 to ControlCount-1 do

    //если компонент - это поле и его Tag = 1

    if (Controls[i].ClassName = 'TEdit') and (Controls[i].Tag=1) then

    begin

        //выводи в этом поле ответ

        TEdit(Controls[i]).Text:=floattostr(result);

        //принудительно завершаем работу цикла (отвт уже выведен)

        break;

    end;

end;

 

Кнопка "Очистить" очищает все текстовые поля.

 

Указания: для кнопки введите код:

 

procedure TForm1.Button2Click(Sender: TObject);

var i:integer;

begin

    //запускаем цикл по всем компонентам на форме

    for i:=0 to ControlCount-1 do

        //если очередной компонент - это объект класса TEdit (поле)

        if Controls[i].ClassName = 'TEdit' then

            //очищаем его

            TEdit(Controls[i]).Clear;

end;

 

Задание 3. Создание окна регистрации

 

Создайте форму для ввода пароля, разбитого на 5 частей по 4 символа. Каждая часть вводится в отдельное текстовое поле, и курсор автоматически переходит по полям в процессе ввода.

 

 

Указания Для формы задайте свойства: BorderStyle = bsDialog, Caption = Окно регистрации. На форму нанесите 5 полей Edit (Standard) для ввода пароля. Для каждого поля задайте свойства: MaxLength = 4, PasswordChar = *, Text - очистить.

Для первого поля в событии OnChange введите код перехода на следущий компонент после ввода 4 символов:

 

procedure TForm1.Edit1Change(Sender: TObject);

begin

//если длина введенного текста равна 4

if length(TEdit(ActiveControl).Text)=4 then

    //переходим на следующий компонент

    SelectNext(ActiveControl,true,true);

end;

 

Выделите остальные текстовые поля и в событии OnChange выберите значение  Edit1Change.

 

Замечание. Обратите внимание, что следующим компонентом для текущего поля является не тот, что расположен рядом с ним, а тот, на который перейдет курсор при нажатии на клавишу Tab. Поэтому следите за порядком перехода по компонентам. Изменить порядок можно, если в контекстном мню формы выбрать команду "Tab Order...".