Изучение типа TStrings и компонентов TMemo, TListBox и TComboBox.
До сих пор для предоставления пользователю возможности ввести текст мы использовали компоненты вроде TEdit, с помощью которых можно ввести только одну строку текста. Компонент TMemo - это, по сути, целый текстовый редактор! Не верите? Давайте посмотрим. Откройте Lazarus с новым проектом. Сразу же переименуйте форму в fMain (свойство Name), в свойстве Caption напишите Мой Блокнот. Сохраните проект как MyNotebook в папку 14-01, а модулю дайте имя Main. Установим некоторые другие параметры формы. Прежде всего, форма будет содержать редактор текстов, поэтому она не должна быть маленькой. Давайте сделаем следующие установки в свойствах формы:
Height = 450
Width = 750
Position = poDesktopCenter
Далее, на вкладке Standard Палитры компонентов найдите компонент TMemo:
(рис 14.1) Компонент TMemo
Установите его на форму. Теперь давайте рассмотрим, как следует, свойства компонента TMemo - уже известные по другим компонентам свойства мы рассматривать не будем, остановимся только на новых и специфичных для TMemo (компонент должен быть выделен).
BorderStyle |
- Включает/отключает обрамление вокруг компонента, и может быть:
bsNone - нет обрамленияbsSingle - есть обрамление (по умолчанию) |
CharCase |
- задает регистр выводимых в компоненте символов. Может быть:
ecLowerCase - все символы строчныеecNormal - символы такие, какими их вводит пользователь (по умолчанию)ecUppercase - все символы прописные |
Color |
- цвет текстового поля. Вы можете задавать цвет как текстового поля, так и шрифта, однако имейте в виду, что серьезные программы не делаются с яркими попугайскими расцветками, поэтому желательно компонентам оставлять их стандартные цвета. |
Font |
- шрифт текста в компоненте. Свойство имеет кнопку "…", с помощью которой его можно раскрыть и настроить шрифт: название шрифта, его размер, начертание, цвет и видоизменение. Насчет расцветок шрифта здесь справедливо то же замечание, что и для свойства Color. Начертание (простой шрифт, курсив, полужирный, полужирный курсив) тоже без нужды изменять не стоит. А вот что касается названия шрифта и его размера - их изменить можно. Дело в том, что по умолчанию в компоненте установлен мелкий шрифт, а у некоторых пользователей может быть слабое зрение. Чтобы пользователь зря не напрягал глаза, я обычно устанавливаю шрифт Times New Roman (он выглядит привлекательней) 12-го размера. Шрифт получается достаточно крупным. Вы можете поэкспериментировать с разными шрифтами и размерами и подобрать то, что нравится лично вам.
Только еще одно замечание: если вы полагаете, что ваша программа будет работать и на других компьютерах, то желательно выбирать стандартные шрифты. Если вы установите какой-то экзотический шрифт, которого у пользователя может и не быть, то программа у него не будет работать нормально. Пользователю придется дополнительно искать и устанавливать ваш шрифт, а они обычно не терпят таких неудобств, и скорее предпочтут какую-то другую, аналогичную программу. |
HideSelection |
- включает или выключает выделение текста, когда компонент теряет фокус. Если равно True, то выделение текста скрывается, когда активным становится другой компонент. При False выделение остается. Обычно оставляют значение по умолчанию - True. |
Lines |
- коллекция (массив) строк. Позволяет обращаться как ко всему тексту, так и к его отдельным строкам. Это сложное свойство, которое имеет свои свойства, методы и события. Методы - это то, что компонент умеет делать. Это те же самые процедуры и функции. Lines это свойство, но и у него есть методы, с помощью которых можно сохранять текст в файл, считывать его из файла, делать еще много других полезных вещей. Имеет тип TStrings. Мы вернемся к нему чуть позже, фактически, вся эта лекция посвящена работе с типом TStrings. |
MaxLength |
- максимальная длина вводимого пользователем текста. По умолчанию, свойство равно нулю. Это означает, что ограничений на размер текста нет. |
ReadOnly |
- переводится как "Только для чтения". По умолчанию, равно False - пользователь может как читать, так и редактировать текст. Если установить в True, пользователь не сможет изменять текст. Так делают, когда нужно вывести для пользователя многострочный текст, например, текст лицензии или описание программы в окне "О программе". Мы оставим False, так как сейчас нам нужно, чтобы пользователь мог редактировать текст. |
ScrollBars |
- полосы прокрутки компонента. Может быть:
ssNone - нет полос прокрутки.ssHorizontal - горизонтальная полоса прокрутки, располагается по нижнему краю компонента. Неактивна, пока текст строки умещается на экране. Когда он становится больше, полоса становится активной, и пользователь может прокрутить текст по горизонтали.ssVertical - вертикальная полоса прокрутки, располагается по правому краю компонента. Неактивна, пока все строки умещаются на экране. Когда строк больше, полоса прокрутки становится активной, и пользователь может прокручивать текст вверх-вниз.ssBoth - присутствуют как вертикальная, так и горизонтальная полосы прокрутки.ssAutoHorizontal - отличается от ssHorizontal тем, что пока текст умещается в окне, полоса прокрутки невидима. По крайней мере, так задумывалось разработчиками. На деле же, ssAutoHorizontal ведет себя так же, как и ssHorizontal - полоса видима, но неактивна, пока текст умещается в окне. Будем надеяться, что в будущем разработчики Lazarus исправят эту ошибку.ssAutoVertical - то же, что и ssAutoHorizontal, но для вертикальной полосы прокрутки.ssAutoBoth - то же, что и ssAutoHorizontal, но для обеих полос прокрутки. |
WantReturns |
- тоже недоработанное свойство. По идее, если его установить в False, пользователь не сможет клавишей <Enter> вставлять разрывы строк. Однако новые строки по-прежнему вставляются клавишей <Enter> вне зависимости от установок этого свойства. |
WantTabs |
- вот это свойство работает. Если оно установлено в False (по умолчанию), то пользователь не сможет клавишей <Tab> вставлять знаки табуляции - эта клавиша будет переключать фокус с TMemo на другой компонент, если он есть. Если же свойство установить в True, то пользователь сможет вставлять знаки табуляции. Разрешать ему вставку табуляции или нет, зависит от назначения компонента. Если вам нужно простое поле, чтобы пользователь мог ввести несколько строк текста, то табуляцию можно и не разрешать. Если же вам нужно сделать полноценный текстовый редактор, то табуляция необходима. |
WordWrap |
- разрешает или запрещает перенос текста на новую строку. Если установлено True (по умолчанию), то когда текст достигает края, происходит автоматический переход на новую строку. Если установлено False, то строка будет продолжаться, пока пользователь не нажмет <Enter>. Обычно свойство оставляют в True и устанавливают вертикальную полосу прокрутки. Если вам захочется установить False, позаботьтесь о том, чтобы была установлена и горизонтальная полоса прокрутки. |
В Инспекторе объектов отсутствует еще одно важное свойство: Text. Это свойство имеет тип String и содержит весь текст, все строки разом, включая символы перехода на новую строку.
Итак, займемся настройкой компонента TMemo. Имя оставим по умолчанию: Memo1. Свойства Left и Top установите в 5. Свойство Height установите равным 400, а Width - 740. Компонент занял почти всю форму, оставив небольшие бордюры и место для кнопок снизу. Теперь нам нужно привязать компонент к сторонам, чтобы он автоматически изменял размер при изменении пользователем размеров окна. Для этого разверните свойство Anchors (якоря) и установите в True все его четыре подсвойства.
Далее, нам как-то нужно убрать текст "Memo1" из компонента, который был добавлен в поле автоматически. Для этого выделите свойство Lines и щелкните по её кнопке "…". Это приведет к открытию окна диалога ввода строк. Сотрите там весь текст и нажмите "ОК" - текст в компоненте пропал.
Теперь установите вертикальную полосу прокрутки (ScrollBars = ssVertical) и убедитесь, что в WordWrap установлено True - компонент будет автоматически переносить текст на новые строки.
Вот, собственно, и все настройки. Теперь нам нужно добиться от компонента трех вещей: чтобы он сохранял текст в файл, чтобы он считывал текст из файла, и чтобы он очищал весь текст. Для этого нам придется воспользоваться некоторыми методами свойства Lines компонента. И еще нам потребуются три простых кнопки, для которых внизу как раз осталось место. Давайте первую кнопку назовем bSave (в свойстве Name), вторую - bRead, и третью - bClear. Маленькая буква b означает кнопку (button), хотя вы можете изобрести и свои правила наименования компонентов. Нам потребуется изменить и свойство Caption у этих кнопок: в первой кнопке напишите Сохранить, во второй - Читать, а в третьей - Очистить. Чтобы текст умещался на кнопках просторней, свойство Width (ширину) кнопок поставьте в 90.
Теперь вот еще что: по умолчанию, все компоненты "привязываются" к верхней и левой границам формы. Если пользователь будет изменять размеры окна, то кнопки будут находиться на таком же расстоянии от левого и верхнего края, что и при проектировании. А так как наш Memo привязан ко всем сторонам, и будет увеличиваться, то закроет собой кнопки. Чтобы этого избежать, выделите все кнопки, откройте их свойство Anchors, akTop переведите в False, а akBottom наоборот, в True. Теперь наши кнопки привязаны к левому и нижнему краю, и всегда будут на одинаковом расстоянии от Memo.
У вас должна получиться такая форма:
(рис 14.2) Форма редактора текстов
Осталось запрограммировать события OnClick для этих кнопок. Сгенерируйте их, дважды щелкая по кнопкам. Вот код этих событий:
procedure TfMain.bSaveClick(Sender: TObject);
begin
Memo1.Lines.SaveToFile('MyText.txt');
end;
procedure TfMain.bReadClick(Sender: TObject);
begin
if FileExists('MyText.txt') then
Memo1.Lines.LoadFromFile('MyText.txt')
else ShowMessage('Файл MyText.txt не существует');
end;
procedure TfMain.bClearClick(Sender: TObject);
begin
Memo1.Lines.Clear;
end;
Как видите, события очень просты, в двух из них всего по одной строке. Так, в строке
Memo1.Lines.SaveToFile('MyText.txt');
мы обращаемся к компоненту Memo1, его свойству Lines, и вызываем метод этого свойства SaveToFile().
Давайте разберемся с методами свойства Lines компонента TMemo.
SaveToFile() - сохранить текст в указанный файл, в нашем случае, это файл MyText.txt. Расширение *.txt традиционно используется для текстовых файлов, так что его лучше указывать, хоть это и не является обязательным. В примере мы указали просто имя файла, без адреса. Файл будет создан в текущей папке, там же, где и программа. Если вы хотите указать какое то конкретное место, то указывайте имя файла вместе с адресом, например:
Memo1.Lines.SaveToFile('C:\MyText.txt');
Если такого файла не было, он будет создан. Если файл был, он перезапишется. Это будет обычный текстовый файл, который можно открыть любым текстовым редактором.
LoadFromFile() - этот метод наоборот, считывает текст из указанного файла в компонент. Однако файл должен существовать на самом деле, иначе программа вызовет ошибку. Именно поэтому вначале мы делаем проверку на существование файла:
if FileExists('MyText.txt') then
Memo1.Lines.LoadFromFile('MyText.txt')
else ShowMessage('Файл MyText.txt не существует');
Если указанный файл существует, функция FileExists() вернет True. Если же файла по какой-то причине нет, то никакого чтения не будет. Вместо этого выйдет сообщение, что файл не существует, и процедура завершит работу.
Clear - очищает текст в Memo. В примере мы обратились к свойству Lines, но можно обратиться и к самому компоненту, так как у него тоже есть метод Clear. Вместо
Memo1.Lines.Clear;
можно написать просто
Memo1.Clear;
Результат будет одинаков. Сохраните проект, запустите, и опробуйте его в работе. Не забудьте поэкспериментировать с изменением размера окна, чтобы посмотреть, как будут выглядеть "привязанные" к сторонам формы компоненты.
Кроме вышеперечисленных инструментов, TMemo имеет и некоторые другие полезные методы. Сейчас мы говорим о методах именно компонента TMemo, а не его свойства Lines, имейте это в виду!
CopyToClipboard |
- копирует выделенный в компоненте текст в Буфер обмена. Пример:
Memo1.CopyToClipboard;
|
CutToClipboard |
- вырезает выделенный текст и помещает его в Буфер обмена. Пример:
Memo1.CutToClipboard;
|
PasteFromClipboard |
- вставляет в компонент текст из Буфера обмена в позицию, где находится курсор. Пример:
Memo1.PasteFromClipboard;
|
SelectAll |
- выделить весь текст. Пример:
Memo1.SelectAll;
|
Undo |
- отменить последние изменения в тексте. Пример:
Memo1.Undo;
|
Отдельно стоит сказать и о событиях компонента TMemo. Выделите его, и в Инспекторе объектов перейдите на вкладку События. Нас интересуют только основные события, которые могут нам пригодиться в работе. Примеры я приводить не буду, события генерируются так же, как OnClick, которым мы неоднократно пользовались.
OnChange |
- событие происходит, когда текст в компоненте изменен. Например, пользователь ввел или наоборот, удалил символ, загрузил текст из файла или еще каким то образом изменил содержимое Memo. |
OnClick |
- событие происходит, когда пользователь щелкает по компоненту мышью. |
OnDblClick |
- событие происходит, когда пользователь дважды щелкает по компоненту мышью. |
OnEnter |
- событие происходит, когда компонент становится активным. Или, как говорят, получает фокус ввода. |
OnExit |
- событие происходит, когда компонент теряет фокус ввода (активным становится другой компонент). |
OnKeyDown |
- событие возникает, когда пользователь нажимает, но еще не отпускает клавишу на клавиатуре. Обработчик обычно используют для распознавания нажимаемой клавиши. |
OnKeyPress |
- событие возникает, когда пользователь нажал и отпустил клавишу на клавиатуре. Обработчик обычно используют для распознавания нажатой клавиши. Если пользователь ввёл недопустимый символ, его можно запретить или заменить другим символом. |
OnKeyUp |
- событие возникает, когда пользователь отпускает клавишу на клавиатуре. Обработчик обычно используют для распознавания нажатой клавиши. |
OnUTF8KeyPress |
- то же, что и OnKeyPress, но не для ANSI-, а для UTF8-символов. При работе с русскими символами нужно использовать это событие. |
Сохраните проект, скомпилируйте и запустите его. Опробуйте редактирование, сохранение текста в файл, чтение его из файла.
В Lazarus есть еще два компонента, которые используют тип TStrings, или говоря иначе, массивы строк. Это списки выбора TListBox и TComboBox. Такие списки обычно используют в программах не для редактирования текста, а для выбора пользователем одного или нескольких строк. TListBox - это прямоугольный список, похожий на TMemo, а TComboBox - выпадающий список.
Чтобы познакомиться с ними, закроем текущий проект и создадим новый. Сразу же форму переименуем в fMain, сохраним проект в папку 14-02 под именем MyStrings, а модулю главной формы, как обычно, дадим имя Main. В свойстве Caption формы напишите Выбор города, свойство BorderStyle сделайте bsDialog, чтобы пользователь не мог изменять размеры окна. Свойство Position сделайте poDesktopCenter, чтобы окно появлялось по центру - такие мелочи нужно сразу же устанавливать, чтобы программа хорошо смотрелась. Размеры формы сделаем такими: Height = 210, Width = 340.
Свойства Name у компонентов в этом проекте мы менять не будем. Так будет наглядней при обращении к этим компонентам внутри кода. Хотя в реальных проектах рекомендуется давать компонентам соответствующие их назначению названия. Ну, вот вам пример. Если на форме всего одна кнопка, то её имя можно оставить по умолчанию - Button1. Итак понятно, о какой кнопке идет речь. А вот если их три, как в прошлом проекте, тогда разумней дать им понятные имена. bSave, bRead, и bClear - ясно, что речь идет о кнопках, раз первая b (button), и что это кнопки "Сохранить", "Читать" и "Очистить". Если у вас слабые знания английского - не беда, можете давать русские названия, но писать латиницей: kSohranit, kChitat и kOchistit (k - knopka).
Поскольку в нашем примере все компоненты будут в единственном экземпляре, менять их свойства Name мы не будем.
Вернемся к проекту. На вкладке Standard Палитры компонентов найдите компоненты TListBox и TComboBox:
(рис 14.3) Компоненты TListBox и TComboBox
В левом верхнем углу формы установите TListBox. Обратите внимание на его свойства в Инспекторе объектов. Мы затронем только некоторые, специфичные для TListBox.
Columns |
- количество столбцов в списке. Если свойство равно нулю или единице, то список выходит в один столбец. Если больше - то столько же будет и столбцов. Если все строки не умещаются в списке, полоса прокрутки будет появляться автоматически. Обычно это свойство не меняют - строки в один столбец используются чаще всего. |
ExtendedSelect |
- расширенное выделение. Подразумевает, что пользователь может выделить сразу целый диапазон строк, если, удерживая <Shift>, щелкнет сперва по первой, а потом по последней строке диапазона. По умолчанию, равно True - такое выделение разрешено. В любом случае, пользователь может выделять выборочные строки, щелкая по ним поочередно и удерживая при этом <Ctrl>. Всё вышесказанное работает, только если свойство MultiSelect = True. Не будем изменять это свойство. |
Items |
- главное свойство компонента, массив (коллекция) строк. То же самое, что и свойство Lines у компонента TMemo, имеет тот же тип TStrings, и соответственно, обладает теми же свойствами и методами. Редактор строк также открывается при нажатии на кнопку "…" справа от свойства. |
MultiSelect |
- возможность выделения нескольких строк. По умолчанию, равно False - многострочное выделение запрещено. Если вы пожелаете разрешить пользователю многострочное выделение, то вам в коде придется обходить весь список, чтобы выявить выделенные строки. |
Sorted |
- сортировка списка. Если равно True, список сортируется по алфавиту. |
Всё остальное примерно соответствует компоненту TMemo. Итак, установим у нашего ListBox1 следующие свойства:
Left, Top = 10Height, Width = 150MultiSelect = TrueТеперь в свойстве Items кнопкой "…" откройте редактор строк и внесите следующие строки (каждый город на отдельной строке):
| Москва |
| Санкт-Петербург |
| Киев |
| Вильнюс |
| Будапешт |
| Вена |
| Париж |
| Берлин |
| Лондон |
| Мехико |
| Оттава |
| Лос-Анжелес |
| Сан-Франциско |
| Нью-Йорк |
Если есть желание отсортировать список городов по алфавиту, установите Sorted = True.
Теперь займемся компонентом TComboBox. Установите его правее ListBox1. У него тоже не так много специфичных свойств:
ArrowKeysTraverseList |
- при True (по умолчанию) разрешает перемещаться по списку кнопками со стрелками. Хотя у меня и при False так можно было перемещаться, может быть, в следующих версиях Lazarus будет иначе. |
AutoComplete |
- при значении True позволяет выбирать элементы из списка, фильтруя их. То есть, если в строке списка вы ввели "А", то выйдут только те элементы, которые начинаются на "А". Если вы ввели следующую "б", останутся только те, что начинаются на "Аб". И т.д. К сожалению, в моей версии Lazarus (v1.0.10) эта возможность недоработана. Если в свойстве установить True и попытаться сделать такую фильтрацию, то выходит run-time ошибка. Я не знаю, будет ли эта ошибка проявляться у вас, ведь новые версии Lazarus выходят достаточно часто, а у вас, скорее всего, уже более новая версия. |
AutoCompleteText |
- переключатели автозавершения ввода, раскрывающее свойство с пятью переключателями. При True переключатель включен, при False - выключен. Имеются следующие переключатели:
cbactEnabled - включение опции AutoComplete.cbactEndOfLineComplete - выполняет AutoComplete, только если курсор находится в конце строки.cbactRetainPrefixCase - сохраняет те же символы, которые ввел пользователь.cbactSearchAscending - при True поиск подходящих строк ведется в восходящем порядке, при False - в нисходящем.cbactSearchCaseSensitive - при True поиск чувствителен к регистру символов (различает прописные и строчные), при False - нет. |
ItemIndex |
- это очень важное свойство - индекс выделенной строки. По умолчанию равен -1, то есть, никакая строка не выделена. Индексация строк начинается с нуля, но поскольку, мы не будем вручную заполнять ComboBox1, то оставим -1. |
Items |
- такой же массив строк, как и у TListBox. Его также можно заполнить в процессе проектирования, нажав на "…" и вызвав Редактор строк. Однако мы не будем сейчас это делать. Заполнять список и изменять ItemIndex мы будем программно, в коде, ведь нужно освоить и эту возможность! |
Sorted |
- как и у TListBox, это свойство сортирует список по алфавиту. |
Text |
- текст, который выводится в строке компонента. При изменении ItemIndex меняется и свойство Text. По умолчанию, там написано имя компонента. Но нам это не нужно, поэтому просто очистите это свойство. |
Итак, установим следующие параметры компонента ComboBox1:
Left = 177
Top = 10
Width = 150
Строки в свойстве Items мы не заполняли, другие свойства не изменяли.
Далее, нам понадобится простая кнопка TButton. Её параметры:
Left = 10
Top = 170
Width = 150
Caption = Копировать в ComboBox
И напоследок, нам понадобится TEdit, чтобы выводить в него выбранную в ComboBox1 строку. Его параметры:
Left = 177
Top = 172
Width = 150
ReadOnly = True (пользователь не может редактировать эту строку)
Text = '' (то есть, очистить это свойство)
В результате у вас должна получиться такая форма:
(рис 14.4) Форма проекта
Суть программы в следующем: пользователь выбирает в ListBox1 один или несколько городов, нажимает кнопку "Копировать в ComboBox". Мы программно обойдем весь список ListBox1, от первой до последней строки, и каждую выбранную пользователем строку добавим в список ComboBox1. Если мы что-то в него добавили, нам придется установить ItemIndex = 0, то есть, выделить первую строку списка (иначе сразу будет невидно, добавилось туда что-то или нет). Далее, если в строке ComboBox появился какой-то город, нам нужно будет продублировать его в строку Edit1.
Пример, в общем, простой, но он демонстрирует почти все возможности списков. Для реализации задуманного нам потребуется всего два события: нажатие OnClick на кнопку Button1, и изменение OnChange в компоненте ComboBox1. Сгенерируйте их, вот код этих событий:
procedure TfMain.Button1Click(Sender: TObject);
var
i: integer; //счетчик
begin
//очистим ComboBox:
ComboBox1.Clear;
//далее в цикле обходим весь ListBox, и если строка
//выделена - копируем ее в ComboBox:
for i:= 0 to ListBox1.Count -1 do
if ListBox1.Selected[i] then
ComboBox1.Items.Add(ListBox1.Items.Strings[i]);
//если ComboBox не пустой, выделим первый элемент, иначе
//не выделяем ничего:
if ComboBox1.Items.Count > 0 then begin
ComboBox1.ItemIndex:= 0;
//копируем в Edit1 выделенную строку из ComboBox:
Edit1.Text:= ComboBox1.Items.Strings[ComboBox1.ItemIndex];
end
else ComboBox1.ItemIndex:= -1;
end;
procedure TfMain.ComboBox1Change(Sender: TObject);
begin
//копируем в Edit1 выделенную строку из ComboBox:
Edit1.Text:= ComboBox1.Items.Strings[ComboBox1.ItemIndex];
end;
Комментарии достаточно подробны, но все же проясним некоторые моменты. Свойство Items у TListBox и TComboBox, а также свойство Lines у TMemo имеют тип TStrings, поэтому ведут себя похожим образом - что работает у одного компонента, будет работать и у другого. Помните, как мы очищали Memo1? То же самое можно сделать и с TListBox, и с TComboBox:
ComboBox1.Clear;
А вот, как мы реализовали обход всех строк в ListBox1:
//выделена - копируем ее в ComboBox:
for i:= 0 to ListBox1.Count -1 do
if ListBox1.Selected[i] then
ComboBox1.Items.Add(ListBox1.Items.Strings[i]);
Свойство Count компонента ListBox1 возвращает количество строк в компоненте. В Инспекторе объектов его не видно, однако все типы TStrings имеют это свойство, а значит, мы сможем таким же образом узнать количество строки ив Memo, и в ComboBox. Поскольку индексация строк начинается не с единицы, а с нуля, то у последней строки списка номер индекса будет Count - 1.
Далее, свойство Selected возвращает True, если указанная в индексе строка выделена. В принципе, мы можем посмотреть выделена ли какая-то конкретная строка, например, девятая:
if ListBox1.Selected[8] then
но гораздо удобней, конечно, обойти весь список в цикле for, как это было сделано в проекте.
Далее мы смотрим - если текущая строка выделена, то мы копируем её содержимое в список ComboBox1:
ComboBox1.Items.Add(ListBox1.Items.Strings[i]);
Содержимое каждой конкретной строки можно получить через её свойство Items, которое содержит непосредственно массив строк Strings. Указав индекс нужной нам строки, мы получим её содержимое. Например, получить содержимое третьей строки у ComboBox и Memo можно было бы так:
s:= ComboBox1.Items.Strings[2];
s:= Memo1.Lines.Strings[2];
Метод Add() типа TStrings добавляет указанную строку в конец списка. Точно также мы могли бы добавить строку в конец списка Memo или ListBox:
Memo1.Lines.Add('Новая строка');
ListBox1.Items.Add('Новая строка');
Вот таким способом мы заполняем список ComboBox1 теми строками, которые были выделены в ListBox1. Однако, поскольку пользователь мог и не выделять никаких строк, и все же нажать кнопку, мы делаем проверку:
//если ComboBox не пустой, выделим первый элемент, иначе
//не выделяем ничего:
if ComboBox1.Items.Count > 0 then begin
ComboBox1.ItemIndex:= 0;
//копируем в Edit1 выделенную строку из ComboBox:
Edit1.Text:= ComboBox1.Items.Strings[ComboBox1.ItemIndex];
end
else ComboBox1.ItemIndex:= -1;
end;
Тут все достаточно прозрачно: если список ComboBox1 пуст, то его свойство Count будет равно нулю. В этом случае, нам нужно присвоить свойству ItemIndex значение -1, то есть, никакая строка не выделена. Если попытаться установить значение 0, то есть, выделить первую строку, произойдет ошибка, ведь строк-то нет! Если все же строки есть, то мы, во-первых, выделяем в списке первую строку:
ComboBox1.ItemIndex:= 0;
и, во-вторых, мы копируем её в Edit1:
Edit1.Text:= ComboBox1.Items.Strings[ComboBox1.ItemIndex];
Тут происходит вот что: ComboBox1.ItemIndex вернет текущий индекс, то есть, индекс выделенной строки. А ComboBox1.Items.Strings[x] вернет содержимое строки под индексом x, как это происходило у ListBox1 в цикле.
И напоследок, в событии OnChange компонента ComboBox1 мы дублируем код копирования выделенного текста в Edit1 - это событие будет срабатывать, когда пользователь выберет в списке какой-то другой город.
В завершение рассмотрим основные свойства и методы типа TStrings - базового класса массива строк, широко используемого в некоторых компонентах. Это может быть как свойство Lines компонента TMemo, так и свойства Items компонентов TListBox и TComboBox. Контейнер TRadioGroup, который мы с вами изучали в лекции №7, также имеет свойство Items типа TStrings. Имеются различные свойства этого типа и у других компонентов, как стандартных, так и созданных сторонними разработчиками. К сожалению, создавать переменные такого типа нельзя, для этого служит другой класс - TStringList, который является наследником TStrings, и обладает более расширенными возможностями. Но о нем мы будем говорить уже в другой лекции. А сейчас рассмотрим основные возможности типа TStrings.
| Наименования | Описание |
|---|---|
| Свойства | |
Count |
Количество строк в списке |
Strings |
Индексированный массив строк. К отдельной строке обращаются по её индексу, например Strings[0] - первая строка массива. |
Text |
Содержит текст всех строк, включая символы перехода на новую строку, в виде единой строки. |
| Методы | |
Add |
Добавляет строку в конец списка и возвращает индекс добавленной строки. Впрочем, возвращаемое значение можно игнорировать, как это делали мы в примере. |
Append |
Добавляет строку в конец списка, но в отличие от Add, не возвращает никакого значения. |
AddStrings |
Добавляет в конец списка другой список строк, также имеющий тип TStrings. |
Clear |
Очищает список. |
Delete |
Удаляет из списка строку по её индексу. Например, удалить вторую строку из Memo можно так:
Memo1.Lines.Delete(1);
|
Insert |
Вставляет в список строку по указанному индексу. Весь остальной текст сдвигается вниз. Если текста нет, строка будет вставлена по индексу 0. |
LoadFromFile |
Считывает строки из указанного файла и заполняет ими компонент. |
SaveToFile |
Наоборот, считывает строки из компонента, и сохраняет их в указанный файл. Если файла нет, он будет создан, если есть - перезаписан. |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.