Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
5.4. Классы TStringList и TiniRle.
Динамическое помещение компонентов на форму
Класс TStrings является абстрактным классом, определяющим все поведение, ассоциирующееся со списком строк. Однако TStrings не обеспечивает никаких механизмов для реального хранения списка строк. За это несут ответственность потомки TStrings, подобные TStringList. Класс TStringList использует объект TList для создания списков строк. Чаще всего объекты TStringList применяются для чтения и записи текстовых файлов.
Приведем пример использования объекта TStringList:
var SL: TStringList;
begin
SL:=TStringList.Create; {создаем экземпляр класса TStringList}
try
SL. LoadFromFile {' data . txt' ); {загружаем данные из файла}
listboxl. items .AddStrings (SL) ; {добавляем данные в listboxl}
finally
SL. free; {освобождаем память, выделенную под экземпляр типа TStringList}
end;
End;
В Delphi существует класс TIniFile, который облегчает чтение и запись инициализационных файлов Windows (файлы с расширением .ini).
Примечание. Вместо Ini-файлов в Win32 используется системный реестр, в котором приложения сохраняют свои установки. Для работы с реестром в Delphi используется класс TRegistrylniFile. Работа с реестром аналогична работе с классом TIniFile.
Класс TIniFile не является компонентом, поэтому создание и освобождение объектов типа TIniFile, а также вызов их методов необходимо осуществлять только программным образом.
Для создания или обновления файла необходимо сначала создать объект типа TIniFile, например, в обработчике события OnCreate формы:
IniFile := TIniFile.Create(<имя_файла>);
После окончания работы с объектом IniFile его необходимо освободить с помощью оператора:
IniFile.Free;
Ini-файл имеет следующую структуру:
[название_раздела1]
имя_ключа_10=значение_ключа_10
имя_ключа_11=значение_ключа_11
...
имя_ключа_1п=значение_ключа_1п
[название_раздела2]
имя_ключа_20=значение_ключа_20
имя_ключа_21=значение_ключа_21
...
имя_ключа_2п=значение ключа_2п
...
Для работы с Ini-файлами используются следующие методы:
function SectionExists определяет существование
(const Section: string): раздела, заданного параметром
boolean; Section, в INI-файле;
function ValueExists (const определяет, существует ли
Section, Ident: string): заданное значение ключа Ident
boolean; в разделе Section Ini-файл а;
procedure ReadSection (const читает все имена ключей из
Section: string; strings: раздела Section Ini-файла в
TStrings); переменную Strings;
procedure ReadSectionValues читает значения всех ключей
(const Section: string; из раздела Section Ini-файла в
strings: TStrings); переменную Strings;
function ReadString (const извлекает значение типа
Section, Ident, Default: string из раздела Section,
string) : string; значение ключа Ident.
Подобные функции: Параметр Default определяет
ReadBool значение по умолчанию в том
ReadDate, ReadDateTime, случае, если
ReadTime заданный в Section раздел
ReadFloat существует,
Readlnteger заданный в Ident ключ не существует, значение ключа не задано;
procedure WriteString (const используется для записи
Section, Ident, Value: значения типа string в
string) ; INI-файл. Параметр Section
Подобные процедуры: определяет секцию, a Ident
WriteBool имя ключа, для которого
WriteDate, WriteDateTime, устанавливается значение.
WriteTime Параметра Value задает
WriteFloat значение строки для записи.
Writelnteger
Упражнение 5.4.1. Напишите приложение, которое позволяет настраивать цвет компонентов ListBox, TabSet, Edit.
Решение
Создайте новый проект. Сохраните новое приложение в папке Colorlni файл модуля под именем Main.pas, файл проекта Colorlni. dpr.
1-й этап. Создадим визуальный интерфейс приложения (рис. 5.4.1)
Для выбора компонента воспользуемся компонентом Combo-Box, RadioGroup для выбора изменяемого свойства, Shape для отображения значения выбранного свойства.
Для подбора цветовых значений используются полосы прокрутки ScrollBar) RedSB, GreenSB, BlueSB, или строки ввода (SpinEdit), в которые можно ввести целые значения от 0 до 255.
Для передачи выбранного цвета компоненту служит кнопка Установить (Set), для возвращения первоначального значения кнопка Отменить (Reset). Для сохранения текущих цветовых установок выбранного компонента в файле Colors.ini используется кнопка Сохранить (Save). Для завершения работы приложения кнопка Закрыть (Close).
Поместите на форму 4 компонента Label, ComboBox, RadioGroup, Shape, no 3 компонента ScrollBar и SpinEdit, 4 компонента Button.
Установите значения Caption компонента, в соответствии с рис. 5.4.1, измените значения других свойств следующим образом:
Компонент |
Свойство |
Значение |
Forml |
Name |
MainF |
Shape1 |
Name |
CurrentShape |
Shape |
stRoundRect |
|
ScrollBarl |
Name |
RedSB |
Tag |
0 |
|
ScrollBar2 |
Name |
GreenSB |
Tag |
1 |
|
ScrollBar3 |
Name |
BlueSB |
Tag |
2 |
|
RedSB, GreenSB, BlueSB |
Max |
255 |
Buttonl |
Name |
SetBtn |
Button2 |
Name |
ResetBtn |
Button3 |
Name |
SaveBtn |
Button4 |
Name |
Close |
ComboBox 1 |
Items.Strings |
TabSet ListBox Edit |
RadioGroup 1 |
Name |
ColorPropertyRG |
SpinEdit 1 |
Name |
RedSE |
Tag |
0 |
|
SpinEdit2 |
Name |
GreenSE |
Tag |
1 |
|
SpinEdit3 |
Name |
BlueSE |
Tag |
2 |
|
RedSE, GreenSE, BlueSE |
AutoSelect |
False |
MaxValue |
255 |
|
Value |
0 |
Расположите компоненты на форме в соответствии с рис. 5.4.1, сохраните проект.
2-й этап. Разработка программного кода
Выбранные цветовые параметры компонента TabSet будем хранить в файле Colors.ini. Для работы с Ini-файлом создадим экземпляр класса TIniFile, в разделе Private описания класса формы опишите переменную
IniFile: TIniFile;
Кроме этого необходимо задать имя Ini-файла. В разделе Interface модуля опишите константу полное имя Ini-файла:
IniFileName='Z:\Colors.ini';
Для синхронизации выбранных цветовых значений в компонентах ScrollBar и SpinEdit введем вспомогательные массивы:
EditControls: array[0..2] of TSpinEdit;
ScrollBars: array[0..2] of TScrollBAr;
Опишите эти переменные в разделе Private описания класса формы.
При запуске приложения необходимо инициализировать значения элементов массивов и создать экземпляр класса TIniFile. Создайте обработчик события OnCreate формы:
procedure TMainF.FormCreate(Sender: TObject);
begin
editcontrols [0] :=redSE;
editcontrols[1]:=greenSE;
editcontrols[2]:=blueSE;
scrollbars[0]:=redSb;
scrollbars[1]:=greenSb;
scrollbars [2] :=blueSb;
iniFile:=TIniFile.Create{IniFileName);
end;
После завершения работы с приложением освободим память, выделенную под объект IniFile:
procedure TMainF.FormDestroy(Sender: TObject);
begin
IniFile.Free;
end;
Компонент ComboBoxl служит для выбора компонента, цветовые настройки которого нужно изменить. Для обработки события выбора элемента из списка Items используется обработчик OnChange.
В компонентах типа TTabSet для изменения цветового отображения служат свойства BackGroundColor (фон), SelectedColor (выбранная закладка), UnSelectedColor (невыделенные закладки), Font.Color (текст), в компонентах типа TEdit и TListBox Color (фон), Font.Color (текст).
При событии OnChange компонента Comboboxl в ColorPro-pertyRG (типа TRadioGroup) нужно добавить соответствующие выбранному компоненту свойства:
procedure TMainF.ComboBoxlChange(Sender: TObject);
begin
ColorPropertyRG.Items.Clear;
{удаляем свойства предыдущего выбора}
case comboboxl.itemindex of 0:
begin {выбран TabSet}
with ColorPropertyRG.Items do
begin
Add('BackgroundColor');
Add('SelectedColor');
Add('UnSelectedColor');
Add('Fontcolor1);
end;
NewTabset;
end;
1: with ColorPropertyRG.Items do
begin {выбран Edit}
Add С Color1) ;
Add('Fontcolor' ) ;
end;
2: with ColorPropertyRG.Items do
begin {выбран ListBox}
Add('Color1);
Add('Fontcolor');
end;
end;
ColorPropertyRG.Height:=35*(ColorPropertyRG.items.Count)
{изменение высоты компонента ColorPropertyRG в зависимости от количества свойств} end;
Динамическое создание компонента типа TTabSet. Для визуального отображения цветовых установок выбранного в Comboboxl элемента нужно создать объект соответствующего типа и отобразить на форме. При выборе значения «TabSet» эти действия выполняет процедура NewTabset:
procedure TMainF.NewTabset;
var i: 0 .. 3;
begin
Tabset:=TTabSet.Create(MainF);
with Tabset do
begin
Parent:=MainF;
Left:=200;
Top : =5; {свойства left и top используются
для позиционирования компонента внутри родительского компонента}
DitherBackground: =true; {значение свойства, равное true, устанавливает цвет фона компонента Tabset светлее на 50 %}
Tabs.Add('Tab_l');
Tabs.Add('Tab_2');
Tabs . Add (' Tab_3 ') ; {добавление трех закладок в Tabset}
TabIndex:=0; {выделение первой закладки}
BackGroundColor:= getsyscolor(COLOR_BTNFACE); {●}
SelectedColor:= clWhite; {●}
UnSelectedColor:= getsyscolor
(TColor(clBtnFace xor $80000000)); {●}
Font.Color:= getsyscolor
(TColor(clWindowtext xor $80000000)); {●}
ColorArray[0].OriginalColor:=BackGroundColor; ColorArray[l].OriginalColor:=SelectedColor; ColorArray[2].OriginalColor:=UnSelectedColor; ColorArray[3].OriginalColor:=Font.Color;
for i:=0 to 3 do
ColorArray[i].CurrentColor:=ColorArray[i].Originalcolor;
end;
// LoadTabsetSetting; {*}
end;
Поясним операторы процедуры.
Переменная Tabset содержит адрес компонента. Опишите переменную Tabset типа TTabset в разделе private описания класса TMainF.
Создание экземпляра любого класса осуществляет конструктор. Оператор
Tabset:=TTabSet.Create(MainF);
вызывает конструктор класса TTabset. Параметр конструктора определяет владельца компонента. Владельцем созданного компонента Tabset будет форма MainF.
Самый важный этап при динамическом создании компонента это установка свойства Parent. Это свойство помещает текущий компонент в список Controls родителя. Компонент-предок использует список Controls для выдачи команды нарисовать себя всем принадлежащим ему компонентам. Поэтому если компонента нет в родительском списке Controls, то он не появится при выполнении приложения. Примерами компонентов, которые могут владеть другими компонентами, являются Panel и GroupBox. Оператор
Tabset.parent:=MainF
определяет форму родительским компонентом.
Операторы {●} задают цветовые настройки компонента Tab-set.
В операционной системе Windows для всех элементов (рабочий стол, заголовок активного окна, полоса прокрутки и др.) определены цветовые константы, каждая из которых имеет свое имя (COLOR_WINDOW, COLOR_ACTIVECAPTION, COLOR_ SCROLLBAR и др.). Значения этих констант изменяются в зависимости от выбранной схемы оформления (Пуск\ Програм-мы\ Настройка\ Панель управления\ Экран\ Оформление).
В Object Pascal соответствующие цветовые константы определяются в модуле C:\Program Files\Borland\Delphi5\Source\ Vcl\graphics.pas следующим образом:
clScrollBar = TColor(COLOR_SCROLLBAR or $80000000); clActiveCaption = TColor(COLOR_ACTIVECAPTION or $80000000);
clWindow = TColor(COLOR_WINDOW or $80000000); и т. д.
Функция getsyscolor определяет текущее значение заданной в параметре цветовой константы. Выражения getsyscolor(COLOR_ BTNFACE) и getsyscolor(TColor(clBtnFace xor $80000000)) определяют одно и то же цветовое значение. В первом выражении параметр задан цветовой константой Windows, во втором эта константа получена из константы, определенной в Object Pascal обратным преобразованием.
Для сохранения текущих цветов определим новый тип ColorRec, который является записью, состоящей из двух значений типа TColor. OriginalColor представляет собой значение цвета, определенное для элемента операционной системой или Ini-файлом. CurrentColor это значение цвета, задаваемое элементу после нажатия кнопки Set. При нажатии кнопкЬ Save значения из поля CurrentColor переписываются в поле OriginalColor и сохраняются в Ini-файле.
Этот тип является вспомогательным и используется только подпрограммами модуля. В разделе implementation опишите тип и введите переменную этого типа:
type
ColorRec = record
OriginalColor: TColor;
CurrentColor: TColor;
end;
var ColorArray: array[0..3] of ColorRec;
Начальные значения массива определяются операторами:
ColorArray[0].OriginalColor:=BackGroundColor; ColorArray[1].OriginalColor:=SelectedColor; ColorArray[2].OriginalColor:=UnSelectedColor; ColorArray[3].OriginalColor:=Font.Color;
for i:=0 to 3 do
ColorArray[i].CurrentColor:=ColorArray[i].Original.color;
Оператор {*} будет рассмотрен позднее, он предназначен для считывания цветовых значений из Ini-файла.
Эксперимент. Сохраните и запустите проект. Убедитесь, что при выборе элемента Tabset из списка Comboboxl на форме появляется объект Tabset, а в ColorPropertyRG появляются его свойства.
Выбор элемента в ColorPropertyRG. В прямоугольнике CurrentShape нужно установить цвет, соответствующий выбранному свойству, а также установить значения в полосах прокрутки и окнах редактирования.
procedure TMainF.ColorPropertyRGClick(Sender: TObject);
begin
case Comboboxl. Itemlndex of 0:
{количество и названия свойств зависят от выбранного компонента}
case ColorPropertyRG.Itemlndex of
0 : CurrentShape.Brush.Color:=Tabset.BackGroundColor;
1: CurrentShape.Brush.Color:=Tabset.SelectedColor;
2: CurrentShape.Brush.Color:=Tabset.UnSelectedColor;
3: СигrentShape.Brush.Color:=Tabset.Font.Color;
end;
end;
SetScrollbars(CurrentShape.Brush.Color); {изменить значения в полосах прокрутки и окнах редактирования}
end;
Опишем процедуру SetScrollbars, которая устанавливает значения в полосах прокрутки. В разделе implementation модуля опишем 32-битовые беззнаковые шестнадцатеричные целые константы, которые будут использоваться для выделения отдельных составляющих цвета из объектов TColor:
Const
RedMask = $800000FF;
GreenMask = $8000FF00;
BlueMask - $80FF0O00;
procedure TMainF.SetScrollbars {c: TColor);
begin
RedSB.Position:=c and redMask;
RedSE.Value:=RedSb.Position;
{выделение красной составляющей цвета с}
GreenSB.Position:=(с and GreenMask) shr 8;
GreenSE.Value:=GreenSb.Position;
{выделение зеленой составляющей цвета с}
BlueSB.Position : = (с and BlueMask) shr 16;
BlueSE.Value:=BlueSb.Position;
{выделение синей составляющей цвета с}
end;
Эксперимент. Запустите приложение. Убедитесь в том, что цвет компонента CurrentShape изменяется в соответствии с выбранным в компоненте ColorPropertyRG свойством Tabset. ♦
Изменение значения в полосе прокрутки. Выделите компоненты RedSb, GreenSB, BlueSb и создайте для них обработчик события OnChange:
procedure TMainF.ColorSbChange(Sender: TObject);
begin
with Sender as TScrollbar do
EditControls[Tag].Text:=IntTostr(Position);
CurrentShape.Brush.Color:=RGB ( RedSB.Position,
GreenSB.Position, BlueSB.Position);
end;
Первый оператор процедуры синхронизирует значение полосы прокрутки с соответствующим ей окном редактирования. Для определения необходимого окна редактирования используется свойство Tag. Проверьте, чтобы значения свойства Tag соответствующих компонентов совпадали. Напомним, что для удобства программирования окна редактирования были объединены в массив EditControls.
Второй оператор процедуры, используя функцию RGB, вычисляет значения цвета по значениям, установленным в полосах прокрутки, и перекрашивает прямоугольник CurrentShape,
Эксперимент. Убедитесь, что при изменении положения «бегунка» в полосах прокрутки изменяется цвет компонента CurrentShape. ♦
При активизации кнопки Set необходимо сохранить новое значение цвета в поле CurrentColor массива цветов и отобразить этот цвет в компоненте:
procedure TMainF.SetBtnClick(Sender: TObject);
begin
If ColorPropertyRG. Itemlndex<>-1 then {если компонент выбран} ColorArray[ColorPropertyRG.Itemlndex].CurrentColor:=
CurrentShape.Brush.Color; {в массиве ColorArray запоминаем
новое текущее значение для свойства, выбранного в ColorPro-pertyRGB}
case ComboBoxl.Itemlndex of
0: ChangeTabsetColor; {отображаем новое цветовое значение
выбранного свойства в компоненте}
end;
end;
Для отображения новых значений свойств компонента Tabset используется массив ColorArray:
procedure TMainF.ChangeTabsetColor;
begin
with Tabset do
begin
BackGroundColor:=ColorArray[0].CurrentColor; SelectedColor:=ColorArray[1].CurrentColor; UnSelectedColor:=ColorArray[2].CurrentColor; Font.Color:=ColorArray[3].CurrentColor;
end;
end;
Опишите метод ChangeTabsetColor в разделе private описания класса TMainF.
При активизации кнопки Отменить, нужно восстановить исходные значения свойств из массива ColorArray:
procedure TMainF.ResetBthClick(Sender: TObject); var i: 0..3;
begin
if Comboboxl. itemindexO-1 then
begin {если компонент выбран}
for i:=0 to ColorPropertyRG.Items.Count-1 do with ColorArray[i] do CurrentColor:=OriginalColor;
{восстанавливаем значения свойств в массиве ColorArray}
case Comboboxl.itemindex of
0: ChangeTabsetColor;
{восстанавливаем значения свойств компонента Tabset}
end;
ColorPropertyRG.OnClick(ColorPropertyRG);
{отображаем восстановленный цвет выбранного в ColorPropertyRG свойства в прямоугольнике CurrentShape}
end;
end;
Эксперимент. Сохраните проект. Запустите, попробуйте изменить цветовые настройки компонента Tabset. Щелчок на кнопке Установить влияет на изменение внешнего вида компонента Tabset. Происходит ли восстановление цветовых значений после щелчка на кнопке Отменить? ♦
Кнопка Сохранить предназначена для сохранения текущих цветовых значений в Ini-файле:
procedure TMainF.SaveBtnClick(Sender: TObject);
var i: 0 . . 3;
Section: string; {вспомогательная переменная,
определяющая раздел Ini-файла, в котором будет сохранены данные } begin
if Comboboxl. itemindexo-1 then
begin {если компонент выбран}
case Comboboxl.itemindex of
0 : Section: =' Tabset' ; {определяем название секции Ini-файла} end;
for i:=0 to ColorPropertyRG.items.Count-1 do IniFile.WriteString (Section,string(ColorPropertyRG.Items[i]),IntToStr(ColorArray[i].CurrentColor));
{запись данных в Ini-файл} end; end;
Эксперимент. Убедитесь, что после щелчка на кнопке Сохранить был создан файл с именем 'z:\Colors.ini'. Посмотрите структуру созданного файла. Измените значение одного из свойств. ♦
Опишем процедуру чтения из Ini-файла цветовых параметров компонента Tabset:
procedure TMainF.LoadTabsetSetting;
var IniValueList: TStringList;
i: Integer; begin
IniValueList:=TStringList.Create;
{создаем объект типа TStringList для считывания цветовых значений из Ini-файла}
try
IniFile.ReadSectionValues('Tabset1,IniValueList);
{чтение цветовых значений свойств}
for i:=0 to IniValueList. Count-1 do {заполняем массив
цветовыми значениями}
with ColorArray[i] do
begin
CurrentColor:=StrToInt
(IniValueList.Values[ColorPropertyRG.items[i]]);
OriginalColor:=CurrentColor;
end;
finally
IniValueList. Free; {освобождаем память, выделенную под объект типа TStringList}
end;
ChangeTabsetColor; {}
end;
Эксперимент. Удалите комментарии в методе NewTabset, запустите проект. Что происходит при выборе компонента Tabset? ♦
Задания для самостоятельного выполнения