Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Делфи 2-3 / 3. Delphi-3.doc
Скачиваний:
55
Добавлен:
30.03.2015
Размер:
416.26 Кб
Скачать

Delphi. Визуальное программирование – 3 1

Классы TStringList и TIniFile 1

Динамическое помещение компонентов на форму 1

Динамическое создание компонента типа TTabSet 6

Выбор элемента в ColorPropertyRG 8

Изменение значения в полосе прокрутки 9

Активация кнопки Установить (Set) 9

Сохранение текущих цветовых значений в INI-файле 10

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

Класс TDrawGrid 12

Свойства компонента DrawGrid 12

Основные свойства, доступные во время разработки 12

Свойство Options 12

Свойства, доступные во время выполнения программы 13

Методы компонента DrawGrid 14

События компонента DrawGrid 14

Задание. Символы системных шрифтов 15

Класс TStringGrid 16

Новые свойства 17

Задание. Игра «Жизнь» 17

Delphi. Визуальное программирование – 3 Классы tStringList и tIniFile Динамическое помещение компонентов на форму

Класс TStrings является абстрактным классом, определяющим все поведение, ассоциирующееся со списком строк. Однако TStrings не обеспечивает никаких механизмов для реального хранения списка строк. TStringList – это структура данных, напоминающая компонент ListBox, но не визуальная, а просто хранящая в памяти и имеющая свойства и методы для работы со строками типа TString. Класс TStringList использует объект TList для создания списков строк.

Для работы со списком строк типа TStringList его сначала необходимо создать с помощью конструктора – Create:

Список строк типа TStringList может сортировать добавляемые строки или хранить без сортировки, а также может игнорировать попытки добавления новой строки при наличии уже сохранённого дубликата:

var StrList: TStringList;

begin

  StrList:=TStringList.Create;

// Затем можно описать способ хранения строк в списке.

  StrList.Sorted:=True;   

// True - сортировать, False - не сортировать

  StrList.Duplicates:=dupIgnore;   

// dupAccept - сохранять дубликаты (значение по умолчанию), dupIgnore - игнорировать, dupError - вызвать сообщение об ошибке

// Теперь можно добавить в список строки типа TString:

  StrList.Add('Новая строка');   

//Добавление в конец списка (или в порядке сортировки). Возвращается индекс строки

  StrList.Insert(Index, 'Новая строка');   

//Строка добавляется на позицию с номером Index. Если список отсортирован, то возникает исключительная ситуация.

  StrList.Delete(Index);    // Удаление строки с номером Index

  N:=StrList.Count; //Количество строк в списке

  Str:=StrList[Index]; // Доступ к строке с номером Index

  Last:=StrList.Count-1;

// Index отсчитывается от 0, поэтому номер последней строки

  StrList.Clear; //Очищаем список строк

// Если список отсортирован, есть метод для поиска:

  StrList.Find(S, Index);

// В случае удачного поиска возвращает True, и индекс строки S в переменной Index

// Если список не отсортирован, то тоже есть функция поиска:

  I:=StrList.IndexOf(Text);

// Возвращает индекс строки с заданным текстом Text, или -1, если поиск неудачен

  StrList.Free; //В конце работы со списком его необходимо удалить из памяти

end;

Чаще всего объекты 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-файлы являются простыми текстовыми файлами с расширением .INI, обычно хранящимися в каталоге Windows. Они разработаны для запоминания информации о прикладных программах, их параметрах, конфигурации, положении окон и т.п. По мере роста популярности Windows и роста числа поддерживаемых приложений, большинство пользователей обзавелось десятками INI-файлов, засоряющих жесткий диск. К счастью, они не требуют много места и по-прежнему являются удобным способом запоминания параметров конфигурации. Таким образом, INI-файлы реально экономят время. Если вы разрабатываете большое и сложное приложение со многими конфигурируемыми пользователем параметрами, то все-таки лучше воспользоваться доступом к Windows Registry при помощи класса TRegistry, чем полагаться на INI-файлы, так распространенные в старых версиях Windows.

Примечание. Вместо INI-файлов в Win32 используется системный реестр, в котором приложения сохраняют свои установки. Для работы с реестром в Delphi используется класс TRegistrylniFile. Работа с реестром аналогична работе с классом TIniFile.

Класс TIniFile не является компонентом, поэтому создание и освобождение объектов типа TIniFile, а также вызов их методов необходимо осуществлять только программным образом.

Для использования класса TIniFile и любого его члена необходимо включить модуль IniFiles в пункт uses того модуля, который получает доступ к INI-файлам.

Для создания или обновления файла необходимо сначала создать объект типа TIniFile, например, в обработчике события OnCreate формы:

IniFile := TIniFile.Create(<имя_файла>);

После окончания работы с объектом IniFile его необходимо освободить с помощью оператора:

IniFile.Free;

Файл конфигурации (INI-файл) содержит данные настроек приложения и имеет следующую структуру:

[название_раздела1]

имя_ключа_10=значение_ключа_10

имя_ключа_11=значение_ключа_11

...

имя_ключа_1n=значение_ключа_1n

[название_раздела2]

имя_ключа_20=значение_ключа_20

имя_ключа_21=значение_ключа_21

...

имя_ключа_2n=значение ключа_2n

...

Идентификаторы отделены от своих значений знаком равенства и имеют вид идентификатор=значение.

Пример ini-файла:

;Первая секция "Windows"

[window]

visible=true

width=426

height=786

;Вторая секция "General"

[general]

pathtemp=c:\temp\

textcolor=green

backgroundcolor=black

Каждый ini-файл содержит хотя бы один раздел. В разделе описываются переменные и их значения. Значением считается все, что после знака "=". В ini-файле можно хранить массивы, а также присваивать переменным несколько значений. Комментарии в ini-файлах пишутся после знака";".

Для работы с Ini-файлами используются следующие методы:

function SectionExists

(const Section: string):

boolean;

определяет существование раздела, заданного параметром Section, в INI-файле;

function ValueExists (const

Section, Ident: string):

boolean;

определяет, существует ли заданное значение ключа Ident в разделе Section Ini-файла;

procedure ReadSection (const

Section: string; strings:

TStrings);

читает все имена ключей из раздела Section Ini-файла в переменную Strings;

procedure ReadSectionValues

(const Section: string;

strings: TStrings);

читает значения всех ключей из раздела Section Ini-файла в переменную Strings;

function ReadString (const

Section, Ident, Default:

string) : string;

извлекает значение типа string из раздела Section, значение ключа Ident. Параметр Default определяет значение по умолчанию в том случае, если○ заданный в Section раздел существует, заданный в Ident ключ не существует, значение ключа не задано;

Подобные функции:

ReadBool

ReadDate, ReadDateTime,

ReadTime

ReadFloat

Readlnteger

procedure WriteString (const

Section, Ident, Value:

string) ;

используется для записи значения типа string в INI-файл. Параметр Section определяет секцию, a Ident — имя ключа, для которого устанавливается значение. Параметра Value задает значение строки для записи.

Подобные процедуры:

WriteBool

WriteDate, WriteDateTime,

WriteTime

WriteFloat

Writelnteger

Задание. Напишите приложение, которое позволяет настраивать цвет компонентов ListBox, TabSet, Edit.

Решение

Создайте новый проект. Сохраните новое приложение в папке Colorlni — файл модуля под именем Main.pas, файл проекта — Colorlni. dpr.

1-й этап. Создадим визуальный интерфейс приложения (см. рисунок).

Для выбора компонента воспользуемся компонентом ComboBox (комбинированный список), RadioGroup (группа радиокнопок)— для выбора изменяемого свойства, Shape (фигура) — для отображения значения выбранного свойства.

Для подбора цветовых значений используются полосы прокрутки ScrollBar, RedSB, GreenSB, BlueSB, или строки ввода (SpinEdit), в которые можно ввести целые значения от 0 до 255.

Для передачи выбранного цвета компоненту служит кнопка Установить (Set), для возвращения первоначального значения — кнопка Отменить (Reset). Для сохранения текущих цветовых установок выбранного компонента в файле Colors.ini используется кнопка Сохранить (Save). Для завершения работы приложения — кнопка Закрыть (Close).

Поместите на форму 4 компонента Label (вкладка Standard), ComboBox(вкладка Standart), RadioGroup (вкладка Standard), Shape (вкладка Additional), по 3 компонента ScrollBar (вкладка Standard) и SpinEdit (вкладка Samples или Edit+UpDownвкладка Win32), 4 компонента Button (вкладка Standard).

Установите значения Caption компонента, в соответствии с рисунком, измените значения других свойств следующим образом:

Компонент

Свойство

Значение

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

ComboBox1

Items.Strings

TabSet

ListBox

Edit

RadioGroup

Name

ColorPropertyRG

SpinEdit1

Name

RedSE

Tag

0

SpinEdit2

Name

GreenSE

Tag

1

SpinEdit3

Name

BlueSE

Tag

2

RedSE, GreenSE, BlueSE

AutoSelect

False

MaxValue

255

Value

0

Расположите компоненты на форме в соответствии с рисунком, сохраните проект.

2-й этап. Разработка программного кода

Выбранные цветовые параметры компонента TabSet1 будем хранить в файле Colors.ini. Для работы с INI-файлом создадим экземпляр класса TIniFile2, в разделе Private описания класса формы опишите переменную

IniFile: TIniFile;

Кроме этого необходимо задать имя INI-файла. Для этого в разделе Interface модуля опишите константу – полное имя INI-файла:

IniFileName='c:\Colors.ini';

Для синхронизации выбранных цветовых значений в компонентах ScrollBar и SpinEdit введем вспомогательные массивы:

EditControls: array[0..2] of TSpinEdit; // или … of TUpDown;

ScrollBars: array[0..2] of TScrollBar;

Опишите эти переменные в разделе Private описания класса формы.

При запуске приложения необходимо инициализировать значения элементов массивов и создать экземпляр класса TIniFile. Создайте обработчик события OnCreate формы:

procedure TMainF.FormCreate(Sender: TObject);

begin

editcontrols [0] :=redSE; // …redUD

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;

Компонент ComboBox1 служит для выбора компонента, цветовые настройки которого нужно изменить. Для обработки события выбора элемента из списка Items используется обработчик OnChange.

В компонентах типа TTabSet для изменения цветового отображения служат свойства BackGroundColor (фон), SelectedColor (выбранная закладка), UnSelectedColor (невыделенные закладки), FontColor (текст), в компонентах типа TEdit и TListBoxColor (фон), FontColor (текст).

При событии OnChange компонента Comboboxl в ColorPropertyRG (типа 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('Fontcolor’);

end;

NewTabset;

end;

1: with ColorPropertyRG.Items do

begin {выбран Edit}

Add (Color’) ;

Add('Fontcolor');

end;

2: with ColorPropertyRG.Items do

begin {выбран ListBox}

Add('Color’);

Add('Fontcolor');

end;

end;

ColorPropertyRG.Height:=35*(ColorPropertyRG.items.Count)

{изменение высоты компонента ColorPropertyRG в зависимости от количества свойств}

end;