Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Работа со строками. Компоненты ListBox, ComboBox, BitBtn. Обработка событий. Примеры.




 

Компонент ListBox - это массив строк. ListBox может загружать данные с диска, и сохранять информацию в файл. Также ListBox может сортировать строки. Доступ к строкам предоставляет свойство Items этого компонента. В соответствии с этим, вот как происходит обращение к строке с номером i:

 

ListBox1.Items[i-1]; // Минус один, так как нумерация строк в компоненте начинается с нуля.

 

Прежде всего рассмотрим методы добавления строк в компонент Delphi ListBox:

 

Считывание из файла;

Добавление строки в конец списка;

Добавление строки перед строкой с номером i;

Добавление строк на этапе конструирования.

Методы добавления строк в компонент Delphi ListBox

 

Считывание из файла

 

Компонент Delphi ListBox может обращаться напрямую к текстовому файлу как для считывания информации из файла, так и для сохранения всех своих строк в текстовый файл. Каждая запись в файле будет записана в виде одной строки компонента, и при сохранении каждая строка будет сохранена в виде одной записи файла:

ListBox1.Items.LoadFromFile('Имя_Файла'); // Процедура считывания из файла

ListBox1.Items.SaveToFile('Имя_Файла'); // Процедура записи в файл

Добавление строки в конец списка

 

Программист может последовательно добавлять строки в компонент, не заботясь об их нумерации, и они будут размещаться в конец списка:

ListBox1.Items.Add('Новая_Строка'); //Добавление строк в конец списка

Так как количество строк в компоненте равно ListBox1.Items.Count, то новая (последняя) строка имеет номер ListBox1.Items.Count-1. Это объясняется тем, что нумерация строк начинается от 0.

Добавление строки перед строкой с номером i

 

Программист может разместить новую строку среди существующих строк там, где ему необходимо. Для этого нужно воспользоваться методом Insert, и указать номер строки, перед которой необходимо записать новую строку:

ListBox1.Items.Insert(i, 'Новая_Строка'); // Добавление строки перед строкой с номером i

При этом новая строка получает номер i.

Добавление строк на этапе конструирования

 

В Инспекторе Объектов зайдите на строчку Items и нажмите на появившуся кнопку. Появится окно редактора содержимого, где и можно внести нужную информацию. После нажатия кнопки OK содержимое редактора появится в компоненте ListBox на Форме.

 

 

Пользователь может выделить строку, щёлкнув по ней мышкой. Номер выделенной строки возвращает свойство компонента ListBox.ItemIndex. То есть, получить текст выделенной строки можно так:

 

S := ListBox1.Items[ListBox1.ItemIndex];

 

Не забывайте пользоваться оператором присоединения with. С его использованием это присваивание выглядит так:

 

with ListBox1 do

begin

S := Items[ItemIndex];

end;

 

При многократном использовании свойств компонента данная запись очень экономит силы. Кстати, оператор присоединения допускает работу с несколькими компонентами, которые нужно разделить запятой. Например, присваивание строки компонента ListBox ячейке таблицы StringGrid выглядит так:

 

with ListBox1, StringGrid1 do

begin

Cells[i, j] := Items[ItemIndex];

end;

 

Для удаления строк из компонента применяется метод Delete. Удаление строки с номером i:

 

ListBox1.Items.Delete(i);

 

Чтобы при добавлении каждая строка была отсортирована (сортировка идёт только по возрастанию), нужно установить:

 

ListBox1.Sorted := True;

 

Также возможно установить это свойство на этапе конструирования в Инспекторе Объектов.

 

К сожалению, компонент не обладает возможностью добавлять только уникальные данные. Один и тот же текст запишется несколько раз. Для реализации этой возможности приходится дополнительно применять невизуальный аналог компонента ListBox - объект StringList, обладающий такой возможностью:

 

procedure TForm1.Button1Click(Sender: TObject);

var SL: TStringList;

S: String;

begin

SL:=TStringList.Create; // Создаём список строк типа TStringList

SL.Sorted:=True; // Устанавливаем свойство - сортировать строки

SL.Duplicates:=dupError; // Устанавливаем свойство - дубликаты вызывают ошибку добавления

try

SL.Add(S); // Пробуем добавить строку в объект StringList

ListBox1.Items.Add(S); // Добавляем строку в компонент ListBox

except

Caption:='Попытка добавить дубликат';

// Попытка добавить дубликат вызовет ошибку в первой строке секции try/except,

// прерывание и переход к секции except/end.

// Добавления в ListBox не будет.

end;

end;

 

Компонент ListBox автоматически добавит полосу прокрутки, если количество строк не помещается по высоте компонента. Высота каждой строки равна ItemHeight. Если нужно чтобы при добавлении новой строки полоса прокрутки точно не возникла, этот размер нужно добавить к высоте компонента. Но делать это нужно только начиная с определённого количества строк. Поэтому нужно делать проверку:

 

ListBox1.Items.Add('Новая_строка');

with ListBox1 do

if (Items.Count > (Height/ItemHeight))

then Height := Height + ItemHeight;

 

Но если высота компонента не нацело делится на высоту строки, то прокрутка всё равно возникнет. Поэтому нужно отнять единичку:

 

ListBox1.Items.Add('Новая_строка');

with ListBox1 do

if (Items.Count > (Height/ItemHeight)-1)

then Height := Height + ItemHeight;

 

Однако на долю секунды полоса прокрутки всё-таки появляется. Поэтому сначала сделаем проверку, а затем уже будем добавлять строку. В этом случае уже нужно отнимать не 1, а 2:

 

with ListBox1 do

if (Items.Count > (Height/ItemHeight)-2)

then Height := Height + ItemHeight;

ListBox1.Items.Add('Новая_строка');

 

Компонент Delphi ComboBox представляет собой комбинацию списка строк ListBox со строкой вводаEdit. При этом "список строк" компонента Delphi ComboBox вначале скрыт, и раскрывается при щелчке мышкой по треугольничку раскрытия, который находится справа в строке ввода:

Таким образом, с помощью Delphi ComboBox место на Форме экономится для расмещения других элементов интерфейса программы. А при необходимости раскрытие списка строк можно вообще запретить.

Многие свойства и возможности компонента Delphi ComboBox по работе со строками (объектами Items) такие же как и у компонента Delphi ListBox, поэтому повторно описывать их не буду. Опишу отличия и дополнительные возможности.

Итак, за возможность раскрытия компонента ComboBox отвечает стиль - свойство Style:

Стиль компонента ComboBox1 равен

ComboBox1.Style = csDropDown

(список может быть раскрыт, можно писать в строке ввода)

 

Стиль компонента ComboBox2 равен

ComboBox1.Style = csSimple

(список не может быть раскрыт, можно писать в строке ввода)

 

При стиле csDropDownList компонент может быть раскрыт, но свойство Text может принимать значения только одной из строк, сохранённых в компоненте, то есть пользователь лишён возможности писать в строке ввода.

 

Количество строк, видимых при раскрытии списка, равно DropDownCount. Если реальное количество сохранённых строк больше этого количества, то автоматически появляется полоса прокрутки. Программист может заставить список раскрыться в нужный момент. Для этого нужно свойству DroppedDown присвоить значение True. Для этой же цели пользователь может использовать клавиатурную комбинацию ALT+ВНИЗ.

 

Максимально допустимое количество символов в текстовой строке задаётся параметром MaxLength, причём значение 0 означает отсутствие ограничений. Свойство CharCase управляет преобразованием вводимого текста к верхнему (значение CharCase = ecUpperCase) или нижнему (значение CharCase = ecLowerCase) регистру. Значение ecNormal означает, что текст вводится без преобразования.

 

Основными событиями компонента Delphi ComboBox являются:

 

Событие    Условие генерации

OnChange  Изменился текст в строке ввода.

OnDropDown Список раскрывается. Это событие нужно обработать, если содержимое списка может изменяться во время работы программы. Тогда в обработчике этого события можно заново сформировать содержимое списка.

 

Архитектура приложения Delphi. Компонент Mainmenu. Примеры.

 

Delphi поддерживает создание приложений, использующих одну и\или несколько форм.

Каждое приложение имеет основную форму, появляющуюся изначально, когда программа начнет выполняться.

Формы как диалоговые окна делятся на модальные и немодальные.

Модальные диалоговые окна Modal должны быть закрыты прежде, чем пользователь сможет обращаться к любому уже существующему окну приложения, так как модальные окна имеют дело с критическими данными, которые должны быть определены, прежде чем продолжится работа программы.

Немодальные диалоговые окна Modeless не обрабатывают критических данных и поэтому дают возможность обратиться к уже существующим окнам программы.

 

 

Компонент MainMenu (страницы Standart Палитры компонентов) позволяет поместить главное меню в программу в виде иконки. Иконки данного типа называют "невидимыми компонентами", поскольку они невидимы во время выполнения программы.

 

Для создания меню следует поместить MainMenu на форму, вызвать Дизайнер меню через свойств Items в Инспекторе объектов, определить пункты меню в Дизайнере Меню. Для создания новых опций необходимо выбирать строку справа, для создания подопций - снизу. Для определения символа быстрого доступа к опции перед ним ставится символ &. Для вставки разделительной черты очередной элемент называется "-", для создания разветвленных меню - Ctrl+ →.Каждый элемент меню является объектом класса TmenuItem и обладает следующими особенными свойствами:

Break: TMenuBreakпозволяет создать многоколончатый список подменю.

Checked: Booleanесли True,рядом с опцией появляется галочка.

Command: Wordиспользуется при разработке приложений, обращающихся непосредственно к API-функциям Windows.

Count: Integerсодержит количество опций в подчиненном меню, связанном с данным элементом.

Default: Booleanопределяет, является ли данная опция подменю умалчиваемой, которая выделяется цветом и выбирается двойным щелчком на родительской опции.

GroupIndex: Byteопределяет групповой индекс для зависимых опций.

Items [Index: Integer]: TMenuItemпозволяет обратиться к любой опции подчиненного меню по ее индексу.

MenuIndex: Integerопределяет индекс опции в списке в списке Items родительской опции.

RadioItem: Boolean определяет, зависит ли данная опция от выбора других опций в той же группе GroupIndex. Только одна опция группы может иметь True в свойстве Checked. Рядом с такой опцией вместо галочки изображается круг.

Shortcut: TShortcutзадает клавиши быстрого выбора данных.

       16. Компоненты OpenDialog SaveDialog.

 

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

 

Компоненты OpenDialog и SaveDialog находятся на закладке Dialogs Палитры компонентов, предназначенной для вызова стандартных диалогов Windows. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент работы программы, поэтому их можно разместить в любом удобном месте формы. Внешний вид диалогов зависит от используемой версии Windows.

 

Диалоги Windows в порядке появления на странице Dialogs: OpenDialog - открыть файл; SaveDialog - сохранить файл; FontDialog - настроить шрифт; ColorDialog - выбор цвета; PrintDialog - печать; PrinterSetupDialog - настройка принтера; FindDialog - поиск строки; ReplaceDialog - поиск с заменой.

 

Компоненты OpenDialog и SaveDialog имеют идентичные свойства и отличаются только внешним видом. После вызова компонента появляется диалоговое окно, с помощью которого выбирается имя программы и путь к ней. В случае успешного завершения диалога логическая функция (метод) Execute приобретает значение True, имя выбранного файла и маршрут поиска будут содержаться в свойстве FileName.

 

Для фильтрации файлов, отображаемых в окне просмотра, используется свойство Filter, а для задания расширения файла, в случае, если оно не задано пользователем, - свойство DefaultExt. Для изменения заголовка диалогового окна используется свойство Title.

17. Компонент Timer. Основные свойства. Тип TDataTime. Примеры.

Компонент Delphi Timer очень простой компонент, который не виден на экране, но, тем не менее, Timer Delphi выполняет очень важные функции в программе. Delphi Timer позволяет вводить необходимые задержки между выполнением тех или иных действий.

 

Компонент Timer имеет всего четыре свойства и одно событие, и работать с компонентом Delphi Timer очень просто.

 

Delphi Timer  

СВОЙСТВО НАЗНАЧЕНИЕ

Enabled      "Включение-выключение" таймера

Interval       Интервал срабатывания (в миллисекундах)

Name Имя компонента в программе

Tag Произвольный числовой параметр

 

Помещаем компонент Delphi Timer на Форму. Задаём в свойстве Interval нужный интервал времени (измеряется в миллисекундах). Переходим на вкладку Events и видим единственное событие, поддерживаемое компонентом Delphi Timer: OnTimer. Выполнив по нему двойной щелчёк, или также двойной щелчёк по самому компоненту, мы попадём в сформированный средой Delphi обработчик события, где и введём код, предусматривающий выполнение тех или иных действий.

 

Так как по умолчанию сойство Enabled установлено в True, то в программе через установленный в свойстве Interval промежуток времени таймер сработает, то есть выдаст событие OnTimer. Будут выполнены необходимые действия. Иногда же запланированные действия должны произойти не автоматически при старте программы, а при выполнении каких-либо других действий. В этом случае необходимо свойство Enabled в Инспекторе Объектов установить в False. Затем в необходимый момент нужно выполнить команду:

 

Timer1.Enabled:=True;

 

Учтите, что пока Timer1.Enabled равно True, компонент продолжит генерировать событие OnTimer по истечении каждого промежутка времени, равного значению свойcтва Interval. Поэтому, если нужно только единичное срабатывание, то таймер нужно остановить, причём сразу же:

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Timer1.Enabled:=False;

{ Необходимые действия }

end;

 

Если же запрограммировать "выключение" таймера после выполнения предусмотренных в программе действий, то при достаточно малом по сравнению с продолжительностью необходимых действий значении свойства Interval таймер вновь сработает, и это может помешать ходу программы.

 

Компонент Delphi Timer не является очень точным и не подходит для измерения малых промежутков времени. Его точность порядка 50 миллисекунд. В качестве примера приведу простую программу, отображающую текущее время.

 

На форме будут только компонент Label и собственно наш компонент Delphi Timer. Свойство Timer можно оставить равным 1000, но раньше на более медленных компьютерах приходилось отображать время несколько раз в секунду, так как из-за влияния других выполняемых компьютером процессов выводимые раз в секунду показания "плавали", что было хорошо заметно на глаз. Размер шрифта возьмём побольше - 50, и подберём более гладкий, я взял Bell MT. Растянем на всю Форму: Align=alClient. Ну и, собственно, сам код:

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Label1.Caption:=TimeToStr(Now);

end;

 

Вот и всё! Delphi Now - это системная функция, возвращающая текущую дату-время в соответствующем формате TDateTime. Если преобразовывать её в строку функцией TimeToStr, то она вернёт текущее время, если DateToStr, то текущую дату. Если мы хотим отображать в нашей программе и дату тоже, достаточно поставить ещё один компонент Label, и функцией DateToStr передавать в него дату.

 

Тип TDateTime содержит значение даты и времени.

 

Она сохраняется как переменная Double, с датой как целая часть, а время как дробная. Дата сохраняется как число дней с 30 декабря 1899. Не понятно, почему не 31 декабря. 01 января 1900 имеет значение 2.

 

Поскольку TDateTime фактически является Double, то вы можете выполнять над ним вычисления, как будто это было число. Это очень полезно для вычислений типа разницы между двумя датами.

 

Пример кода : Обнаружение различия между двумя датами

 

var

day1, day2 : TDateTime;

diff : Double;

begin

day1 := StrToDate('12/06/2002');

day2 := StrToDate('12/07/2002');

ShowMessage('day1 = '+DateToStr(day1));

ShowMessage('day2 = '+DateToStr(day2));

 

diff := day2 - day1;

ShowMessage('day2 - day1 = '+FloatToStr(diff)+' days');

end;

 

day1 = 12/06/2002

day2 = 12/07/2002

day2 - day1 = 30 days

18. Текстовые файлы. Типизированные файлы. Нетипизированные файлы.

Текстовые файлы связываются с файловыми переменными, принадлежащими к стандартному типу TextFiie. Текстовые файлы предназначены для хранения текстовой информации. Именно в такого типа файлах хранятся, например, исходные тексты программ. Компоненты (записи) текстового файла могут иметь переменную длину, что существенно влияет на характер работы с ними.

Текстовый файл трактуется в Object Pascal как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой строки ставится специальный признак eoln (End Of LiNe - конец строки), а в конце всего файла - признак eof (End Of File - конец файла). Эти признаки можно протестировать одноименными логическими функциями (см. ниже). При формировании текстовых файлов используются следующие системные соглашения:

eoln - последовательность кодов #13 (cr) и #10 (lf);

EOF -КОД #26.

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

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

Следующая программа “зависнет”, т. к. никогда не будет прочитана вторая строка файла:

procedure TfmExample.bbRunClick(Sender: TObject);

Var

F: TextFile;

S: String;

Begin

AssignFile(F,'example.pas');

Reset(F);

while- not EOF(F)do

Begin

Read(P,S); // Ошибка! Бесконечный цикл!

mmOutput.Lines.Add(S)

end;

CloseFile(F)

end;

Нетипизированные файлы объявляются как файловые переменные типа File и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой - позволяет организовать высокоскоростной обмен данными между диском и памятью.

При инициации нетипизированного файла процедурами Reset или Rewrite можно указать длину записи нетипизированного файла в байтах. Например, так:

Var

F:File;

Begin

AssignFile(F,'myfile.dat');

Reset(f,512);

End.

Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам Reset или Rewrite, в качестве которого может использоваться выражение типа Longint. Если длина записи не указана, она принимается равной 128 байтам.

Object Pascal не накладывает каких-либо ограничений на длину записи нетипизированного файла за исключением требования положительности и ограничения максимальной длины 2 Гбайт (для Delphi 1 длина записи ограничивается 65535). Для обеспечения максимальной скорости обмена данными рекомендуется задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт). Однако операции обмена данными с дисковыми устройствами в среде Windows кэшируются, т. е. осуществляются через промежуточный буфер памяти, поэтому обычно задают Recsize = 1, что позволяет обмениваться с файлом блоками любой длины начиная с одного байта.

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением Read и write, которые заменяются соответственно высокоскоростными Процедурами BlockRead И BlockWrite:

Procedure BlockRead(var F:File; var Buf; Count: Integer [;

var AmtTransferred: Integer]) ;

Procedure BlockWrite(var F:File; var Buf; Count: Integer [;

var AmtTransferred: Integer]);

 

Здесь Buf - буфер: имя переменной, которая будет участвовать в обмене данными с дисками; count - количество записей, которые должны быть прочитаны или записаны за одно обращение к диску;

AmtTransferred - необязательный параметр, содержащий при выходе из процедуры количество фактически обработанных записей.










Последнее изменение этой страницы: 2018-04-12; просмотров: 811.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...