Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Классы TStringList и TiniRle

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

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

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

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 21.5.2024

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? ♦

Задания для самостоятельного выполнения

  1.  Допишите приложение Colorlni (упр. 5.4.1), дополнив его следующими функциями:
    1.  добавьте возможность изменения свойств компонентов ListBox и Edit;
    2.  синхронизируйте  изменение  значений  в  компонентах SpinEdit с соответствующими им компонентами Srollbar.
  2.  Напишите приложение-тест «Проверка знания английских слов». При запуске программы тестирующему предлагается ввести фамилию и имя. Далее появляется окно теста, содержащее два столбика слов: первый — английские слова, второй — русские, причем столбик с русскими словами несколько длиннее по количеству слов. Тестируемый должен перетаскивать английское слово из первого столбика на соответствующее ему русское слово во втором (после перетаскивания английское слово исчезает). Слова во второй столбик вводятся в произвольном порядке (т.е. порядок русских и английских слов произвольный). Приложение подсчитывает количество правильных ответов и после окончания теста выдает результат. Приложение генерирует файл отчета, содержащий фамилию и имя тестируемого, количество правильных ответов и общее число слов. Файл должен содержать информацию о каждом, кто проходил тест.




1. Вариант 1 Выберите один или несколько правильных вариантов ответа 1
2. мироздания не будем конкретизировать это понятие
3. тематичних наук Чернівці 2007 Дисертацією є рукопис
4. Теорії походження держави
5. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата медичних наук Київ~2001 Ди
6. Основные фонды автотранспортного предприятия и повышение эффективности их использования.html
7. по теме НДС при экспорте в тексте которых встречается слово льготы
8. Особенности возникновения и протекания беременности
9. Советы по организации сна Качество сна во многом определяет качество жизни человека
10. Зависимость рекламного текста от целевой аудитории
11. тематичних наук старший науковий співробітник Сукач Георгій Олексійович Інститут фізики напі
12. Кадры решают все вновь приобретает актуальность
13. тема маркетинговой информации постоянно действующая система взаимосвязи людей оборудования и методически
14. а Статор неподвижный и ротор вращается
15. Ситно управляющая компания она руководит несколькими предприятиями производящими продукты питания под е
16. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата економічних наук1
17. В данной главе речь пойдет о первичном анализе текстовой информации анализе полевых документов
18. Запустить FR 2Записать в отчет меню FR нижнее и верхнее F9
19. Для какого вещества фактор эквивалентности fэ равен 1-3 N2CO3 N3PO4 NNO3 COH2 l2SO43 4
20. Контрольная работа- Управляющие устройства и их виды