Как написать программу на делфи

Глава 7. Примеры написания программ. Компактный словарь.

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

Скачать образец программы

Это был интерфейс данной программы. Скачать готовую программу для словаря по прямой ссылке вы можете здесь. Вместе с исходниками. А сейчас мы начнем разбирать по порядку что к чему.

На интерфейсе вы видите поля для поиска и ввода - Edit 1 и Edit2. Ниже идут кнопки и два поля Memo. Пометки Label ко всему этому. И, самое главное - ListBox с самим словарем.

В прошлой главе я рассказывал как текст из txt файла можно перенести в редактор строк ListBox или Memo. Дважды щелкнув на форме, создаем обработчик событий FormOnCreate. И вписываем в него следующее:

ListBox1.Items.LoadFromFile('Slovar.txt');

j:=-1;

И сразу же после открытия вашего экзешника в ListBox будет загружаться содержимое txt файла Slovar. Это и есть наш словарь, в который мы будем заносить слова. В комплекте с прогой идет небольшой файл с английскими словами. Содержимое этого файла вы можете видеть на скриншоте. Это далеко не полный словарь, просто понабирал некоторых слов специально для проги, чтоб было с чем работать.

Что делает присвоение переменной j:=-1 - об этом читайте ниже. Это понадобиться для поиска слов.

Итак, кнопка для поиска слов. На ButtonClick пишем следующее:

Циклическая операция - поиск слов по всем строкам ListBox1. Нумерация строк идет не от единицы, а от нуля. Изначально j=-1. Присвоилось вначале работы экзешника. j - это будет номер строки. И потом, при очередном цикле j увеличивается на единицу. И уже с первым циклом j=0, т.е. отсчет идет с нулевой (самой первой) строки.

Цикл While работает до тех пор, пока условие остается истинным. Наше условие - j 0, это значит искомый текст был найден. Если p=0, это значит текст не был найден. Любой арифметической переменной по умолчанию присваивается нулевое значение, и если не было присвоено никакого другого значения, то нулем и остается.

Итак, если мы нашли нужное нам слово, то следующие действия - очистить Memo1 от предыдущего текста, если такой был, и добавить туда j-ую строку из ListBox1. Break - остановка поиска. Зачем искать, если уже найдено. Если пользователь захочет найти еще что-нибудь, если его не устроит результат поиска, то j сохраняет свое прежнее значение, и можно продолжить поиск с текущей позиции. Обратите внимание, в третьей главе при рассмотрении циклов, а также и в следующих главах, я присваиваю начальные значения прямо перед циклом, в одном обработчике событий с ним. Нажал кнопку, присвоились начальные значения, и пошел работать цикл. А здесь я специально присвоил j:=-1 на самое начало работы приложения, на FormOnCreate. Специально для того, чтоб можно было продолжать поиск с текущей позиции.

Когда j доходит до последней строки, но так и не находит нашего текста, p так и остается нулем, то с помощью функции ShowMessage выводится сообщение о том, что искомый текст не был найден.

Последняя строка ListBox1.ItemIndex:=J выделяет j-ую строку в ListBox. Кроме выведения информации в Memo, пусть еще и в самом словаре выделится данное слово. Такое свойство считаю весьма полезным. Ведь чем хороши бумажные словари - глянул слово, и еще краем глаза глянул на рядом стоящие слова. Что-то в памяти отложилось, а может и любопытное слово увидел,

которое давно искал. Этого нет в он-лайн переводчиках. Там только введенное слово, и ничего больше.

Также и наоборот. При клике на определенную строку в ListBox, Memo1 заполняется текстом из выделенной строки. Это делается так: на ListBox стоит обработчик событий OnClick, как обычно ставится на Button, и в нем пишется такое:

Как только вы, кликнув на ListBox1, выделили какую-то строку, Memo1 очищается от предыдущих записей, и в него, на смену предыдущему, вписывается новый текст. Текст этот из выделенной строки, т.е. из строки, идущей под номером ListBox1.ItemIndex .

Рядом с кнопкой "Искать" идет кнопка "Очистить". В ней выполняется следующий код:

Чистится Edit1 и Memo1, и j:=-1. Для того чтоб следующий поиск начать "с нуля", а не с текущей позиции.

Есть также кнопка для введения новых слов. На ней стоит следующий код:

Итак, мы перед самим циклом присвоили начальные значения некоторым переменным. Обратите внимания, здесь начальные значения присваиваются именно перед циклом, а не как в предыдущем случае, на FormOnCreate. NovSlovo и NovPerevod - новое слово, которое мы введем словарь, и перевод этого нового слова. Изначально им присваивается "нулевое" значение - ни одного знака. i:=-1. Напоминаю, нумерация строк идет от нуля, и прибавляя единицу с каждым циклом мы уже на первом цикле получим ноль, что даст нам возможность начать с самой первой строки.

Дальше циклом проходимся по строкам Memo2, собирая в одну строку все написанное там. Пока i меньше общего числа строк в Memo2, выполняется следующий код. (Здесь ставим не Memo2.Lines.Count-1, а Memo2.Lines.Count, работает корректно, проверено).

С каждым циклом число i увеличиваем на единицу, и прибавляем к переменной NovPerevod i-ую строку Memo2. Таким образом проходимся до последней строки под номером Memo2.Lines.Count .

И далее, когда цикл закончился, и все строки Memo2 собраны, складываем в одну строку само слово (NovSlovo) и перевод этого слова (NovPerevod). Пишем через тире и с пробелами, поэтому между ними (словом и переводом) вставляем ' - ' .

И наконец, полученную переменную свтавляем в ListBox. У этой компоненты, ListBox, есть такое свойство - Sorted. Принимает значения true или false. И в зависимости от принятого значения выстраивает или не выстраивает строки в алфавитном порядке. У нас, разумеется, должно стоять false.

И есть еще кнопка "Сохранить". Когда вы внесли новое слово, то оно внесено только в ListBox, но не в txt файл. А при новой загрузке вашего приложения открывается содержимое именно файла. Поэтому содержимое ListBox переносим в txt файл следующим образом:

ListBox1.Items.SaveToFile('Slovar.txt');

Если файл с таким названием уже существует, то он заменится на новый.

И под конец можно сделать напоминание на случай, если пользователь забыл сохранить изменения. Выделяете форму, и ищете в колонке Evens (события) событие OnClose. Т.е. как только вы закроете ваше приложение, произойдет то, что вы впишите в этот обработчик. Для начала, следует ввести еще две арифметических переменных. Например:

На FormOnCreate, т.е. как только включается ваш экзешник, присваиваем h1 общему количеству строк в ListBox.

h1:=ListBox1.Items.Count;

А на OnClose пишем следующее:

Итак, h1 - это количество строк вначале работы программы, а h2 - в конце, перед закрытием. И если они не совпадают, и h2>h1, то выскакивает сообщение - "Внесены новые слова. Сохранить ли их?". И две кнопки - "Yes" и "No". Если нажать "Yes", то изменения сохраняются (ListBox1.Items.SaveToFile('Slovar.txt');) и с через ShowMessage выводится сообщение о том, что изменения сохранены. На нажатие кнопки "No" не предусмотрено ничего. Ничего не произойдет, и прога просто закроется. А то в одном источнике в интернете вычитал, что на случай нажатия кнопки "No" пишем "Close", т.е. закрыть. Не нужно так делать, иначе будет завис - при нажатии кнопки "No" выполняется Close, а на OnClose, в свою очередь, выскакивает сообщение. И так до бесконечности, и экзешник вы тогда вообще не закроете.

Источник: delphi-vsem.ru

Категория: Программное обеспечение

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