Рисунок 14
Для доступа к строкам во время выполнения программы также используется свойство Lines класса TString. Подробнее остановимся на классе TString, с которым в последствии мы будем еще встречаться.
А именно, этот класс обладает свойствами: Count — целочисленное свойство, определяющее количество элементов в списке (в данном случае это будет количество строк в компоненте Memo), Text — свойство, содержащее все строки списка, String[Index:Integer] — свойство, определяющее строку с номером Index. Учитывая, что нумерация строк начинается
с 0 и свойство String является свойством по умолчанию, можно утверждать, что свойства Memo1.Lines.String[3] и Memo1.Lines[3] эквивалентны и указывают на четвертую строку в компоненте Memo1.
Класс TString обладает также рядом методов, среди которых отметим следующие: Add(St:String):integer добавляет строку St и возвращает номер этой строки; Delete(Index:Integer) удаляет строку с номером Index; Insert (Index:Integer, St:String) вставляет строку с номером Index, Clear полностью уничтожает все содержимое компонента.
Все содержимое компонента можно записать в файл с помощью метода SaveToFile или прочитать из файла посредством методом LoadFromFile. Аналогичным образом можно поступить и с потоком, направив в него весь файл, или прочитать файл из потока.
Важным свойством компонентов Memo и RichEdit является ScrollBar, которое определяет, будет ли окно содержать горизонтальные или вертикальные линейки прокрутки.
Пример 5
Задается текст в компоненте Memo1 и номер строки в компоненте Edit1. Необходимо вырезать строку с данным номером и поместить ее
в компонент Edit2.
Для решения данной задачи поместим все необходимые компоненты на форму и напишем процедуру обработки события, в которой задается значение компонента Edit2 и удаляется строка из Memo1:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=memo1.Lines[strToInt(edit1.Text)-1];
memo1.Lines.Delete(strToInt(edit1.Text)-1);
end;
Пример 6
Cохранить набранный в Memo файл с именем, определенным в Edit.
Для решения данной задачи поместим на форму компонент Memo1,
в котором будем набирать строки, компонент Edit1, чтобы задать имя файла, и кнопку с надписью «Сохранить», при нажатии на нее содержимое компонента Memo1 сохранится в файле. При этом форма может иметь вид, представленный на рисунке 15.
Рисунок 15
Процедура обработки события будет состоять из одной строки, и соответственно, листинг будет иметь следующий вид:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile(Edit1.Text);
end;
Компонент RichEdit обладает всеми характеристиками, присущими компоненту Memo, однако имеет богатые возможности для работы с текстовым форматом RTF. Данный формат предполагает возможность разбивать текст на параграфы. Для этого существуют специальные свойства: SelAttributes определяет атрибуты выделенного фрагмента и Paragraph — атрибуты абзаца.
Задания:
1. Проверьте все программы из данной лабораторной работы и выполните задание, которое соответствует номеру вашего варианта.
2. Создайте приложение, в котором при нажатии на одну из кнопок
в компоненте Memo добавляется строка, при нажатии на другую — удаляется строка.
3. Сделайте компонент Edit таким образом, чтобы в него можно было бы вводить только цифры.
4. Создайте приложение, в котором при наборе текста в компоненте Edit в момент нажатия буквы t все содержимое данной строки добавляется новой строкой в компонент Memo.
5. Создайте приложение, в котором в строку вводится буква я, выдается некоторое сообщение.
Лабораторная работа 4. Компоненты-переключатели
Цель: изучить компоненты выбора переключения с зависимой и независимой фиксацией.
Для организации ветвления в языке программирования Pascal используются два оператора: оператор ветвления If…then и оператор выбора Case. Выбор конкретной ветви алгоритма может осуществляться несколькими различными способами.
Можно программно анализировать полученные ранее данные, однако в реальном программировании часто встречается ситуация, когда дальнейшие действия должны зависеть от выбора пользователя. Именно для таких ситуаций существует множество компонентов, которые позволяют визуально выбирать некоторый способ продолжения выполнения программы. Эти компоненты будем условно называть переключателями. Существуют два принципиально различных вида переключателей, это, во-первых, те, которые могут принимать единственное значение из предлагаемого набора (иногда они называются переключателями с зависимой фиксацией) и, во-вторых, переключатели, которые в любой момент времени могут быть либо включены, либо выключены (по аналогии они называются переключателями с независимой фиксацией или включателями).
Рассмотрим первый тип переключателей.
Изображаются они в виде небольшого кружка. У выделенного переключателя внутри этого кружка помещается черная точка.
К переключателям относятся компоненты: RadioButton — выбор из одной альтернативы, RadioGroup — выбор из набора альтернатив, ComboBox — выбор из комбинированного списка, который переключателем как таковым не является, но может выполнять подобные функции. Все эти компоненты находятся на странице Standat.
Первый компонент RadioButton позволяет выбирать из одной альтернативы, поэтому на этапе выполнения существует ключевое свойство Checked, которое принимает значение True, если данная альтернатива выбрана, и False — в противном случае. С помощью этого свойства на этапе выполнения можно проверять состояние переключателя. Однако выбор из одной альтернативы не является выбором как таковым, поэтому либо группируют несколько подобных компонентов, либо используют другие компоненты.
Рассмотрим компонент RadioGroup. На этапе подготовки, пользуясь инспектором объектов, можно редактировать альтернативы с помощью свойства Items класса TString. При выборе данного свойства появляется редактор, где можно перечислять все возможные варианты действий. Данный редактор «String list edit» аналогичен тому, который появляется при выборе свойства Lines компонента Memo. Используя свойство Columns, можно задать число столбцов, где будут помещены выбираемые альтернативы.
На этапе выполнения с помощью свойства ItemIndex можно определить номер выбранной альтернативы, при этом нумерация начинается с 0. Если ни одна альтернатива не выбрана, то данное свойство принимает значение равное –1. Выбор начальной альтернативы можно установить
с помощью того же свойства. Свойства Items класса TString содержит указатель на список строк и все присущие этому классу свойства и методы.
Событие OnClick возникает в тот момент, когда выбирается другой вариант.
Приведем пример, использующий компонент RadioGroup.
Пример 1
Вычислить время падения с некоторой высоты при условии, что высота может задаваться в метрах, сантиметрах и дюймах.
Задача уже была решена раньше, однако не учитывалась возможность ввода данных различного типа. Для решения этой задачи, кроме ранее используемых компонентов, поместим на форму компонент RadioGroup
и с помощью инспектора объектов выберем свойство Items. Затем в редакторе строк в первой строке запишем метры, во второй — сантиметры, в третьей — дюймы.
После выполнения данных операций форма будет иметь вид, представленный на рисунке 16.
Рисунок 16
Как и раньше, будем анализировать нажатие на кнопку «Вычислить», но в расчетах учтем выбор соответствующей единицы измерения. Тогда процедура может иметь вид:
procedure TForm1.Button1Click(Sender: TObject);
Const g=9.81;
Var h,t : Real;
Begin
h:=StrToFloat(edit1.Text);
Case radioGroup1.ItemIndex of
0: t:=sqrt(2*h/g); {Высота задается в метрах}
1: t:=sqrt(2*h/100/g); {Высота задается в сантиметрах}
2: t:=sqrt(2*h*2.54/100/g); {Высота задается в дюймах}
End;
edit2.Text:=FloatToStr(t);
end;
Недостаток компонента RadioGroup заключается в том, что имеется возможность определить только номер выбранной альтернативы, а не ее текстовое содержание. Для того чтобы определить и текстовое содержание альтернативы, можно использовать комбинированную строку, компонент ComboBox. Комбинированная строка ввода объединяет в себе свойство строки и списка. В обычном состоянии она имеет вид строки Edit со стоящей рядом кнопкой с изображением направленной вниз стрелки. Если нажать эту кнопку, то появится список строк, где можно выбрать произвольную. Данный компонент имеет свойство Items, поэтому задание альтернатив, которые в данном случае будут раскрывающимся списком, происходит аналогичным образом. Однако на этапе выполнения допустимо свойство Text, в котором находится выбранная из списка строка. При работе с данным компонентом необходимо различать свойства ComboBox.Items. Text и ComboBox.Text. Если первое — это свойство, где находятся все строки списка, включая разделители (это свойство имеет подобный смысл и для RadioGroup), то второе содержит выбранную из списка строку.