Listbox – список выбора

Перечни выбора хранят в себе какие-то перечни, и дают пользователю возможность выбирать одну из указанных строчков. Довольно часто их используют в окнах с заданными параметрами, дабы пользователь имел возможность выбрать один из параметров.

Чтобы получить доступ к строчкам перечня, необходимо воспользоваться свойством Items компонента ListBox. Это свойство имеет тип TStrings (строки), с таким типом мы сталкивались, в то время, когда обрабатывали компонент Memo.

взглянуть на практике, как трудиться с данным компонентом. Создайте новое приложение, установите на него один компонент ListBox, и под ним – один Edit для вывода той строки, которую выбрал пользователь:

Listbox – список выбора

Рис. 12.1. Внешний вид формы

После этого два раза щелкните по свойству Items компонента ListBox. Перед вами откроется уже привычный редактор строчков. Соберите заглавия операционных совокупностей:

MS-DOSWindows 3.10Windows 95Windows 98Windows MEWindows 2000Windows XPWindows VistaUnixLinuxOS/2

Каждое наименование ОС должно быть на отдельной строчке. Надавите ОК, дабы сохранить итог. Сейчас создайте для компонента ListBox обработчик события onClick. Мы уже знаем, что это событие срабатывает всегда, в то время, когда пользователь выберет одну из строчков в указанном перечне.

В обработчике событий напишите лишь одну строчок:

Edit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];

Эта строка присваивает свойству Text компонента Edit тот текст, что хранится в выбранной строчке перечня ListBox. Свойство Items имеет собственный свойство Strings, которое является массивом из строчков перечня. Указав индекс массива, мы можем получить доступ к нужной строчку. В примере в качестве индекса указано свойство ListBox1.ItemIndex, которое имеет тип Integer и возвращает элемент выбранной строки в массиве строчков. Кстати, в то время, когда вы поставите точку и откроется перечень, в том месте вы этого свойства не найдёте, так что нужно будет писать его вручную.

Сохраните пример в новую папку, откомпилируйте и посмотрите, как он трудится.

Помимо этого, мы имеем возможность программно додавать в ListBox новую строчок либо удалять выбранную. Киньте на форму еще две кнопки и напишите на них – Добавить строчок, Удалить строчок. Додавать будем строчок, написанную в компоненте Edit, а удалять – выделенную.

Для кнопки Добавить впишите:

ListBox1.Items.Add(Edit1.Text);

а для кнопки Удалить:

ListBox1.Items.Delete(ListBox1.ItemIndex);

Сохраните проект, откомпилируйте и посмотрите, как он трудится.

Часто бывает нужным дать пользователю возможность множественного выбора. Пользователь, удерживая клавишу , щелкает по строчкам и выбирает необходимые. Для этого у ListBox имеется свойство MultiSelect (множественный выбор). По умолчанию оно равняется False, другими словами запрещает пользователю выбрать пара строчков. Создадим еще одно приложение, в котором покажем возможность множественного выбора.

Установите на форму один ListBox и один Memo, ниже – кнопку с надписью Копировать. При нажатии на кнопку будем искать у ListBox выделенные строчки и копировать их в Memo. На рисунке 12.2 в левой части установлен компонент ListBox, а в правой – Memo.

Listbox – список выбора

Рис. 12.2. Внешний вид приложения

Войдите в редактор строчков ListBox и напишите в том месте

Строка № 1Строка № 2

и без того потом, пока не заполните ListBox так, дабы его не требуется было прокручивать. Установите свойство MultiSelect у ListBox в True. Не забудьте очистить Memo. Сейчас для кнопки напишем следующий код:

procedure TForm1.Button1Click(Sender:TObject);vari : Integer;begin Memo1.Clear;for i := 0 to ListBox1.Items.Count — 1 doif ListBox1.Selected[i] thenMemo1.Lines.Add(ListBox1.Items.Strings[i]);end;

Сначала мы очистили Memo, дабы пользователь имел возможность пара раз опробовать копирование и выбор строчков, и строки в Memo не скапливались.

После этого мы создаем цикл, дабы обрабатывать ListBox построчно. Первая строка постоянно имеет нулевой индекс, а свойство Count во всех объектах TStrings возвращает количество строчков в объекте. Нам приходится вычесть единицу, поскольку индексы начинаются не с 1, а с 0. Потом в цикл мы поместили условный оператор if – в случае если условие правильно (другими словами строка выделена), то производим добавление строчка в Memo. За это отвечает свойство Selected (Выделено) с указанием индекса строчка. Если оно равняется True, то строка выделена.

ComboBox – выпадающий перечень Такие перечни вы довольно часто встречаете при работе с Windows и разными программами. Действуют и трудятся они кроме этого как ListBox, с той лишь отличием, что выглядят по-второму, и не разрешают выбрать пара элементов сходу. Создайте новое приложение, добавьте в том направлении лишь один ComboBox и один Edit:

Listbox – список выбора

Рис. 12.3. Внешний вид приложения Позовите редактор строчков ComboBox (свойство Items) Впишите пара городов: МоскваСанкт-ПетербургКиевМинскТашкентДушанбе Свойство ItemIndex, которое, как мы знаем, показывает индекс выделенной строки, по умолчанию установлено в -1. Это указывает, что ни одна строка не выбрана. В случае если установить его в 0, то в поле ввода текста покажется первая строка перечня. Покинем -1, дабы строчков не было видно. Создадим обработчик события OnChange для компонента ComboBox, и в том месте напишем лишь одну строчок: Edit1.Text := ComboBox1.Items.Strings[ComboBox1.ItemIndex]; Как видите, это практически правильная копия работы с ListBox. Сохраните пример в новую папку, откомпилируйте и попытайтесь как он трудится. Управление циклами Вы понимаете уже фактически все циклы – for..do, while..do, repeat..until. Но этими циклами возможно еще и руководить. Для этого помогают директивы break и continue. Break – прерывание цикла. В случае если в цикла встретится таковой оператор, происходит немедленный выход из цикла. В большинстве случаев, данный оператор применяют совместно с управляющей структурой if, к примеру: if a b then break; Следовательно, в случае если появится какое-то недопустимое для цикла условие, вы постоянно имеете возможность прервать цикл досрочно. Continue – прерывание текущего шага цикла. В отличие от break, continue не прекращает цикл вовсе, а только прерывает предстоящую обработку этого шага цикла, по окончании чего цикл сходу начинается со следующего шага. Метод применения такой же, как у break. Разглядим работу continue на практическом примере. Нам необходимо поделить число 10 на число от -3 до 3 включительно, и итог вывести в ListBox. Потому, что выводить будем кроме этого целые числа, нам окажет помощь функция Round(), которая принимает вещественное число, округляет его до ближайшего целого и это целое возвращает. Кроме этого мы знаем, что на ноль дробить запрещено, это неточность. Чтобы не допустить это деление, мы прервем данный ход цикла посредством директивы continue. Создайте новое приложение. Установите на форму ListBox, а под ним – кнопку:

Listbox – список выбора

Рис. 12.4. Внешний вид приложения При нажатии на кнопку, напишите следующий код: procedure TForm1.Button1Click(Sender: TObject);var i, r : Integer;begin for i := -3 to 3 do begin if i = 0 then beginListBox1.Items.Add(‘Нанольделитьнельзя!’); Continue; end; //if r := Round(10/i); ListBox1.Items.Add(’10/’+IntToStr(i)+’=’+IntToStr(r));end; //for end; В тот момент, в то время, когда счетчик i станет равным 0, выполнится тело условия if, и по окончании оператора Continue цикл сходу перейдет на новый виток, пропустив деление. Занятие 13 Независимое задание В примере мы жестко задали условия: дробить как раз число 10 на диапазон чисел от -3 до 3. Измените пример так, дабы пользователь имел возможность сам указать какое число необходимо дробить, и на какой диапазон. Это несложное задание, но, нужно будет подключить к работе мозги.

Listbox – список выбора
Диалоги Что такое диалоги в Delphi? Это невизуальные, другими словами, невидимые пользователю компоненты, каковые делают стандартные для Windowsдиалоги программы и пользователя. К примеру, диалог открытия либо сохранения файла, диалог выбора шрифта либо цвета, и т.п. Каждая важная программа содержит такие диалоги. Работа с ними несложная, любой диалог содержит практически по два свойства, каковые нам будут необходимы. Изучим работу диалогов на примере. Открываем новый проект. Сразу же форму переименовываем в fMain, в свойстве Caption пишем Мой блокнот. Сохраните проект под именем Editor. Это будет более опытная версия редактора текстов, какой мы уже делали. Вычисляйте, что это вторая версия программы, что и напишете в окне fAbout. Установите на форму компонент Memo, удалите целый текст из его свойства Lines. Поверх Memo установите MainMenu и PopupMenu. Перейдите на вкладку Dialogs в палитре компонентов, и кроме этого поверх Memo установите OpenDialog, SaveDialog, FontDialog и ColorDialog. Все эти компоненты не визуальные, пользователь их видеть не сможет. У Memo сразу же укажите свойство Align=alClient, а свойство ScrollBar=ssVertical. Советую для лучшего вида выбрать шрифт (свойство Font) Times New Roman, а размер = 12. На всех компьютерах с русской Windows имеется данный шрифт, но если вы станете писать программу для продажи в Интернет, лучше покинуть шрифт по умолчанию, это гарантирует, что он будет читаться на всех компьютерах в мире. Во всех диалогах имеется один способ, что нас интересует – Execute. Это способ логического типа, он возвращает True, в случае если диалог с пользователем случился удачно (к примеру, пользователь выбрал открываемый файл), и False в другом случае (к примеру, пользователь отказался от выбора файла). Вследствие этого, диалоги в большинстве случаев используют вместе с проверкой: if OpenDialog1.Execute then… В диалогах, которые связаны с файлами (OpenDialog – открыть файл, и SaveDialog – сохранить файл), имеется свойство FileName, которое возвращает строчок – имя и адрес выбранного файла. Вот, фактически, и все, что нам необходимо от этих диалогов! ДиалогFontDialog в свойстве Font возвращает выбранный шрифт. Это свойство непростое, оно имеет тип TFont, и присвоить его возможно лишь второму шрифту, к примеру: Memo1.Font := FontDialog1.Font; Совершенно верно кроме этого, диалогColorDialog возвращает свойство Color – цвет, имеющее тип TColor, и это свойство возможно присвоить лишь объекту, имеющему такой же тип: Memo1.Color := ColorDialog1.Color; Продолжимнашпроект. Откройте редактор главного меню. Создайте раздел Файл и подразделы Открыть, Сохранить, Закрыть, — и Выход. Создайте раздел Параметры и подразделы Выбрать шрифт и Выбрать цвет. Создайте раздел Справка и подраздел О программе. Сейчас открываем редактор PopupMenu и вписываем разделы Открыть, Сохранить, Закрыть, — и Выход. Сразу же на форме выделяем саму форму (это возможно сделать в окне Object – TreeView), и в свойстве PopupMenu выбираем отечественное меню. Сейчас это меню откроется, в случае если пользователь щелкнет правой кнопкой по любому месту на форме. Сейчас нам необходимо настроить фильтры в диалогахOpenDialog (Открыть) и SaveDialog (Сохранить). Фильтры разрешают отображать в этих диалогах лишь необходимые форматы файлов, и для этого выбора употребляется маска файла. К примеру, маска *.* будет отображать файлы всех типов! Два раза щелкнув по свойству FilterдиалогаOpenDialog, откройте редактор фильтров. В первой колонке напишите Текстовые документы, во второй – *.txt. В строке ниже укажите Все файлы, а во второй колонке – *.*. Также самое сделайте для направляться:

Listbox – список выбора

Рис. 13.1. Настройка фильтра файловых диалогов Сейчас, открывая файл, вы заметите лишь эти два типа файлов. Подумаем о том, что программа обязана знать – изменился ли текст в Memo. Так как пользователь может закрыть программу и не сохранить текст, а позже будет ругать программиста за то, что он этого не предусмотрел. Наряду с этим имеем в виду, что у нас имеется большое количество команд меню, значит, будет большое количество процедур. А дабы дать программе знать, изменился ли текст, разумнее всего создать переменную логического типа – изменился текст, присваиваем ей True, в противном случае False. Дабы с данной переменной возможно было трудиться из всех процедур, она должна быть глобальной. Делаем глобальную переменную перед словом implementation: izmen : Boolean; //изменился ли текст в Memo Событию onChange компонента Memo присвойте строчок: izmen := True; Когда изменится текст в Memo, переменная тут же будет выдавать истину. Сейчас еще один момент – программа обязана знать адрес и имя открытого файла. В случае если имени файла нет, то программа будет выводить диалоговое окно, а вдруг мы файл открывали и имя имеется, то программа перезаписывать тот файл без вывода диалогового окна. Значит, делаем еще одну глобальную переменную: myfile : String; //имя и Адрес открытого файла Я намерено не беру обширно распространенные слова File либо FileName, так как они смогут быть зарезервированными либо в компонентах смогут быть свойства с этими именами, в следствии окажется конфликт названий. Соображаем дальше. Открыть файл возможно будет командой меню Файл – Открыть, или командой PopupMenu Открыть. Значит, нам придется два раза писать одинаковый код? А если он будет громадным и сложным? Возможно само собой разумеется и скопировать его, компилятор это выдержит, и программа будет трудиться нормально. А как же оптимизация кода? Два однообразных кода в программе будут занимать вдвое больше места в памяти и на диске! Для этого мы имеем процедуры и пользовательские функции. Вспоминаем – функцию либо процедуру мы должны обрисовать ВЫШЕ того места, где будем ее применять, значит, первую отечественную процедуру мы должны обрисовать в разделе implementation, прямо под строчкой {$R *.dfm}. на данный момент вы определите еще кое-что новенькое. В таких вот функциях и пользовательских процедурах вы не имеете возможность напрямую обращаться к компонентам формы, потому, что функции и Ваши процедуры самой форме не принадлежат. Если Вы введете Memo1. то компилятор сходу выдаст неточность. Обращаться к компоненту необходимо, указав сперва имя формы, на которой он находится: fMain.Memo1. Но таковой код будет не через чур эргономичен – любой раз нужно будет обращаться к компонентам через форму. Лишний комплект кода, излишне долгий текст. Решение нашлось – функция with (с). Эта функция имеет форму: with fMain do begin … end; где fMain – имя формы с нужными нам компонентами. Сейчас между скобок begin…end данной конструкции мы можем обращаться к компонентам формы напрямую. Пишем неспециализированную для всех процедуру открытия файла: {Процедура открытия файла} procedure Otkrivaem; begin with fMain do begin //делатьвместесформой if OpenDialog1.Execute then begin //еслидиалогвыполнен //присваиваем переменной myfile имя и адрес выбранного файла: myfile := OpenDialog1.FileName; //читаемэтотфайлв Memo: Memo1.Lines.LoadFromFile(myfile); izmen := False; //файлтолькооткрыт, измененийещенет end; //if end; //with end; Сейчас создаем обработчик событий для команды меню Файл – Открыть. В том месте приводим к нашей процедуре: Otkrivaem; Также самое делаем для команды PopupMenu Открыть.

Listbox – список выбора
Listbox – список выбора
Дальше – сложней. Открыть файл легко, но вот при сохранении нам нужно будет учитывать большое количество вещей:

  1. Пользователь может сохранять новый файл, что он только что собрал. Другими словами, переменная myfile безлюдна и не содержит имя файла. При таких условиях нужно будет выводить диалогSaveDialog1, дабы пользователь указал имя файла. В то время, когда он укажет имя, присвоить его переменной myfile и сохранить Memo в указанный файл.
  2. Пользователь может сохранять новый файл, как в прошлом примере. Мы выведем диалог, но он его не завершит – надавит кнопку отмена либо красный крестик в верхней части окна справа. Значит, сохранять ничего не требуется, мы так как не знаем, куда сохранять! Но придется его поставить в известность, что файл не сохранен!
  3. Пользователь может сперва открыть файл и поменять его, а позже сохранять. В переменной myfile это имя уже имеется, диалог не нужен, данный файл.
  4. Пользователь может сохранять файл, текст которого не изменялся. При таких условиях, его команду!

Видите? Пользоваться диалогами несложно, но как много приходится учитывать на протяжении испытаний действий пользователя! Необходимо учитывать каждую мелочь, в противном случае вам сообщат, что ваша программа полна багов — небольших неисправностей. Итак, пишем процедуру сохранения, сходу под процедурой открытия: {Процедура сохранения файла} procedure Sohranyaem; begin with fMain do begin //в случае если трансформаций не было, выходим из процедуры, //ничегонеделая: if not izmen then Exit; //В случае если файл уже раскрывался, и в переменной myfile //имеется его имя и адрес, данный файл: if myfile » then begin Memo1.Lines.SaveToFile(myfile); izmen := False; Exit; //выходим по окончании сохранения end; //if {Файл новый, переменная myfile еще безлюдна. Дальше имеется два варианта: пользователь выберет либо укажет файл в диалоге, либо не сделает этого} //есливыбралфайл: if SaveDialog1.Execute then begin //прописываем имя и адрес файла в переменную: myfile := SaveDialog1.FileName; //в случае если нет расширения *.txt то добавляем его: if copy(myfile, length(myfile)-4, 4) ‘.txt’ then myfile := myfile + ‘.txt’; //сохраняем Memo вуказанныйфайл: Memo1.Lines.SaveToFile(myfile); //файл сохранен, трансформаций нет: izmen := False; end //if //если не выбрал файл: else ShowMessage(‘Вы не указали имени файла, файл не сохранен!’); end; //with end; Вышеприведенный код имеет достаточно подробные комментарии, так что все должно быть ясно. Новое, что вы имели возможность заметить – директива Exit. Эта директива досрочно завершает работу процедуры (либо функции). Другими словами, в случае если выполнено условие и отработан необходимый код, Exit заставляет процедуру завершить работу. Другой код, что имеется в данной процедуре, не выполняется. Сейчас мы можем создать обработчик главного меню Файл – Сохранить, и в том месте прописать вызов данной процедуры: Sohranyaem; Также самое делаем для команды PopupMenu Сохранить. Потом идет команда главного и всплывающего меню Выход. Тут все легко, и в том и другом случае пишем команду Close; Потом идет раздел Параметры. Создаем обработчик Выбрать шрифт, в том месте все легко: if FontDialog1.Execute then Memo1.Font := FontDialog1.Font; Совершенно верно кроме этого и с подразделом Выбрать цвет: if ColorDialog1.Execute then Memo1.Color := ColorDialog1.Color; Потом возвратимся в раздел Файл. Тут у нас остался подраздел Закрыть. Создаем для него обработчик, и запишем текст: {в случае если файл не сохранен, предупреждаем пользователя об этом. Если он хочет сохранить, то приводим к процедуре сохранения:} if izmen then if Application.MessageBox(‘Файлизменен. Сохранить?’, ‘Внимание!’, MB_YESNO+MB_ICONQUESTION) = IDYES then Sohranyaem; //сейчас закрываем текущий файл: Memo1.Clear; //очищаем Мемо myfile := »; //нет имени текущего файла izmen := False; //нет трансформаций Тут не так много текста, и он ясен, исходя из этого не будем для него делать отдельную процедуру. Легко скопируйте текст, создайте обработчик событий для Закрыть PopupMenu и засуньте данный же текст в том направлении. Приблизительно также самое нам нужно будет сделать и для события формы onClose – так как мы заблаговременно не можем знать, как пользователь закроет форму, через команду главного меню Файл – Закрыть, через команду всплывающего меню Закрыть, надавит ли он красный крестик наверху либо надавит тёплые клавиши ! Исходя из этого для проверки – имеется ли в программе несохраненный текст, мы используем событие onClose, которое случается при попытке закрыть форму, другими словами в этом случае всю программу. Тут код будет таким же, как и в прошлом примере, но раз мы закрываем всю программу, нам не требуется делать блок закрытия файла. Легко удостоверимся в надежности, имеется ли трансформации, и если они имеется, выведем запрос – сохранить ли их. В случае если пользователь ответит Да, значит, приведём к процедуре сохранения: {в случае если файл не сохранен, предупреждаем пользователя об этом. Если он хочет сохранить, то приводим к процедуре сохранения:} if izmen then if Application.MessageBox(‘Файлизменен. Сохранить?’, ‘Внимание!’, MB_YESNO+MB_ICONQUESTION) = IDYES then Sohranyaem; Сейчас введем еще одну команду для обоих меню – Очистить. Она будет предназначена на случай, в случае если пользователь введет нелепость, а позже примет решение очистить текст. Я намеренно покинул это воздействие на конец, дабы вы имели возможность усвоить, что в ходе работы над программой меню может изменяться! Откройте редактор MainMenu, в разделе Файл в самом низу добавьте подраздел Очистить. После этого мышкой перетащите его на место линии разделов, наряду с этим линия опустится вниз, а новый подраздел поднимется на ее место:

Listbox – список выбора

Рис. 13.2. Вид главного меню Создайте для команды Очистить обработчик, и впишите в том направлении текст: {MainMenu — Файл — Очистить} procedure TfMain.N17Click(Sender: TObject); begin //очищаемМемо: Memo1.Clear; //в случае если открытого файла нет, то нет и трансформаций: if myfile = » then izmen := false //в противном случае текст поменян: else izmen := true; end; Сделайте то же самое для всплывающего меню – создайте раздел Очистить, а в его обработчик скопируйте тот же текст. Осталось создать модальное окно fAbout, где Вы укажете, что это текстовый процессор, второй версии. Сделайте это самостоятельно и привяжите вызов данной формы к команде главного меню Справка – О программе. Все, сохраняйте, компилируйте и контролируйте, как трудится программа! У нас оказался несложный, но в полной мере опытный редактор текстов. Одно замечание: текст мы сохраняем, но вот выбранный цвет и шрифт окна Вы сохранить не имеете возможность, об этом мы будем говорить на вторых лекциях, в то время, когда обучимся сохранять параметры. Обработка исключений в Delphi

Select Items from Excel Worksheet List Box

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector