
- •Delphi. Визуальное программирование – 3 Классы tStringList и tIniFile Динамическое помещение компонентов на форму
- •Динамическое создание компонента типа tTabSet
- •Выбор элемента в ColorPropertyRg
- •Изменение значения в полосе прокрутки
- •Активация кнопкиУстановить(Set)
- •Сохранение текущих цветовых значений вIni-файле
- •Задания для самостоятельного выполнения
- •Класс tDrawGrid
- •Свойства компонента DrawGrid
- •Основные свойства, доступные во время разработки
- •Свойство Options
- •Свойства, доступные во время выполнения программы
- •Методы компонента DrawGrid
- •События компонента DrawGrid
- •Задание. Символы системных шрифтов
- •Класс tStringGrid
- •Новые свойства
- •Задание. Игра «Жизнь»
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 и TListBox — Color (фон), 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;