Опубликован: 25.06.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Учебный центр "ANIT Texno Inform"
Лекция 6:

Стандартные строковые функции и сообщения

< Лекция 5 || Лекция 6: 12 || Лекция 7 >

Преобразование символов строки в строчные и в заглавные

Иногда требуется сравнить две строки, или найти какую-то подстроку. Но не всегда известно, в каком регистре пользователь ввел текст. К примеру, нам нужно узнать, ввел ли пользователь слово "Москва", или что-то другое. Пользователь знает, что он должен ввести название нашей столицы, однако он может полениться нажать <Shift>, и в результате введет "москва". Или нажмет <Caps Lock> и введет "МОСКВА". А поскольку слово он написал без ошибок, то уверен, что все сделал правильно. Но мы-то ожидаем не просто слово, а слово со строго определенным описанием! К сожалению, пользователи далеко не всегда вводят то, что нужно, и программистам приходится идти на всевозможные хитрости, чтобы добиваться нужного результата. Например, мы можем заранее преобразовать введенное пользователем слово в верхний регистр (то есть, сделать все буквы заглавными), и сравнить его со словом "МОСКВА". И какие бы буквы пользователь первоначально не вводил, результат все равно будет верным.

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

UpperCase(Str) - Преобразует ANSI-строку Str в верхний регистр
UTF8UpperCase(Str) - Преобразует UTF8-строку Str в верхний регистр
LowerCase(Str) - Преобразует ANSI-строку Str в нижний регистр
UTF8LowerCase(Str) - Преобразует UTF8-строку Str в нижний регистр

Изменим код обработчика:

procedure TForm1.Button1Click(Sender: TObject);
var
  s1: String;
begin
  s1:= 'Москва';
  ShowMessage(UTF8UpperCase(s1));
  ShowMessage(UTF8LowerCase(s1));
end;
    

Сохраните проект и запустите его на выполнение. Мы получим два сообщения: заглавными и строчными буквами.

Функции-сообщения

Нам то и дело требуется выводить пользователю различные сообщения. И в этой лекции, и в предыдущих лекциях, мы уже неоднократно пользовались одной такой функцией - ShowMessage(). Её синтаксис очень простой:

ShowMessage('Текст сообщения');
    

В результате будет выведено окно с сообщением, которое не даст пользователю продолжать работу, пока он не нажмет кнопку "ОК":

Сообщение ShowMessage()

Рис. 6.2. Сообщение ShowMessage()

Application.MessageBox()

Еще один вариант сообщения - функция Application.MessageBox(). Данная Windows API-функция позволяет вывести сообщение с разными настройками. Синтаксис функции следующий:

Application.MessageBox(Text: PChar; Caption: PChar; Flags: LongInt): Integer;
        

В качестве аргументов мы должны указать текст сообщения Text, заголовок окна с сообщением Caption и флаги - значок сообщения и используемые кнопки. И Text, и Caption имеют тип PChar. Флаги имеют целочисленный тип, однако нам нужно запомнить только символьные обозначения этих флагов:

Таблица 6.1. Флаги функции Application.MessageBox()
Значки сообщения
MB_ICONERROR Белый крестик в красном круге. Такой значок обычно используют в сообщениях об ошибке.
MB_ICONHAND
MB_ICONSTOP

MB_ICONQUESTION

Синий знак вопроса в белой выноске. Таким способом помечают вопрос, обращенный к пользователю.
MB_ICONWARNING Черный восклицательный знак в желтом треугольнике. Таким знаком привлекают внимание пользователя к вероятной опасности, которая может последовать в результате действий пользователя.
MB_ICONEXCLAMATION
MB_ICONINFORMATION Синяя буква "i" в белой выноске. Таким способом помечают какую-то информацию для пользователя.
MB_ICONASTERISK
Кнопки сообщения
MB_OK Кнопка "OK" в середине окна.
MB_OKCANCEL Кнопки "OK" и "Cancel".
MB_ABORTRETRYIGNORE Кнопки "Abort", "Retry" и "Ignore".
MB_YESNOCANCEL Кнопки "Yes", "No" и "Cancel".
MB_YESNO Кнопки "Yes" и "No".
MB_RETRYCANCEL Кнопки "Retry" и "Cancel".

Примечание: Чтобы пользоваться функцией Application.MessageBox(), нужно в разделе uses подключить модуль LCLType.

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.MessageBox('Сообщение', 'Заголовок',
                          MB_ICONINFORMATION + MB_ABORTRETRYIGNORE);
end;
        

В результате получим такое окно сообщения:

Сообщение Application.MessageBox()

Рис. 6.3. Сообщение Application.MessageBox()

Вы заметили, что в качестве флага используется сумма значка и кнопок? И то, и другое, на самом деле, целое число. Но нам удобней запомнить эти значения в символьном варианте.

А как мы узнаем, какую кнопку нажал пользователь? Эта функция возвращает значение - кнопку, нажатую пользователем, которая может быть:

  • IDOK
  • IDCANCEL
  • IDABORT
  • IDRETRY
  • IDIGNORE
  • IDYES
  • IDNO
  • IDCLOSE
  • IDHELP

То есть, если пользователь нажал кнопку "Abort", функция вернет значение IDABORT. А раз так, мы можем делать проверку на нажатую кнопку. Снова изменим код обработчика:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Application.MessageBox('Сообщение', 'Заголовок', MB_ICONQUESTION +
     MB_YESNOCANCEL) = IDYES then ShowMessage('Вы нажали кнопку Yes');
end;
        

Логическую конструкцию if мы будем изучать в следующей лекции, здесь лишь заметим, что сообщение ShowMessage() будет выведено только в том случае, если пользователь нажал кнопку "Yes". Во всех остальных случаях это сообщение не выйдет.

MessageDlg()

Похожим образом действует Windows API-функция MessageDlg(), которая описана в модуле Dialogs. Этот модуль включается в раздел uses автоматически, поэтому нам не нужно даже что-то туда добавлять. Синтаксис этой функции несколько отличается от предыдущей:

MessageDlg(Caption, Text, MessageType, MessageButton, HelpKeyword): Integer;
        

Здесь Caption и Text соответственно, текст заголовка и самого сообщения, тип PChar. Далее идет тип сообщения MessageType, - значок сообщения, который может быть:

mtWarning - Восклицательный знак, подобен MB_ICONWARNING функции Application.MessageBox()
mtError - крестик
mtInformation - буква "i"
mtConfirmation - вопросительный знак
mtCustom - пользовательское окно без значка.

Далее следует тип кнопок MessageButton, который может быть:

mbYes
mbNo
mbOK
mbCancel
mbAbort
mbRetry
mbIgnore
mbAll
mbNoToAll
mbYesToAll
mbHelp
mbClose

Названия кнопок говорят сами за себя, комментарии тут излишни. Кнопки указывают в квадратных скобках, отделяя друг от друга запятыми, например: [mbYes, mbNo, mbIgnore].

Последний параметр HelpKeyword определяет экран контекстной справки, которая будет появляться, если пользователь нажмет <F1>. Обычно в этом параметре указывают значение 0 - нет справки.

Функция MessageDlg() возвращает значение - нажатую кнопку, которая соответствует типу кнопок, указанному выше. Возвращаемое значение вместо "mb" начинается на "mr", то есть, если пользователь нажал кнопку "Yes" (тип mbYes), то будет возвращено значение mrYes.

Снова изменим код:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if MessageDlg('Подтверждение', 'Вы действительно хотите закрыть программу?',
             mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then Close;
end;
        

В данном случае пользователю выводится запрос на подтверждение закрытия программы, и если он нажимает кнопку "Yes", программа закрывается (выполняется оператор Close). Так как функции MessageDlg() и Application.MessageBox() похожи, выбирайте любую, на свой вкус.

Функция-запрос

Иногда требуется получить от пользователя какие-то данные (вспомните программу Hello из "Анатомия проекта" ). В этом случае можно использовать компонент TEdit, но можно поступить проще - воспользоваться функцией InputQuery().

Функция InputQuery() выводит окно запроса. Синтаксис функции такой:

InputQuery(Caption, Message, StrVar);
    

Здесь, Caption и Message - соответственно, текст заголовка и текст сообщения внутри окна. StrVar - переменная строкового типа, которая должна быть объявлена заранее. Если в этой переменной есть текст, он выводится в строке редактирования как текст по умолчанию. Если переменная пуста, то пуста будет и строка. Если пользователь что-то введет в строку и нажмет кнопку "ОК", этот текст запишется в переменную StrVar, а функция вернет значение True (Истина). В противном случае функция вернет значение False (Ложь). Переделаем код обработчика:

procedure TForm1.Button1Click(Sender: TObject);
var
  YourName: String;
begin
  YourName:= 'Неизвестный';
  if InputQuery('Кто вы?', 'Укажите ваше имя', YourName) then
     ShowMessage('Привет, ' + YourName + '!');
end;
    

Напомню, что с логической конструкцией if мы познакомимся в следующей лекции, а пока разберем код. Вначале мы присваиваем строковой переменной YourName текст "Неизвестный". Затем мы вызываем функцию InputQuery(). Мы указываем заголовок окна "Кто вы?", текст сообщения "Укажите ваше имя" и текстовую переменную YourName. Текст, который мы ранее поместили в эту переменную, будет выходить в строке редактирования:

Результат работы функции InputQuery()

Рис. 6.4. Результат работы функции InputQuery()

Если пользователь введет какой-то другой текст, он попадет в переменную YourName, функция вернет True и в результате будет выведено сообщение с приветствием

     ShowMessage('Привет, ' + YourName + '!');
    

Функция InputQuery() часто бывает полезна, так что запомните её получше.

< Лекция 5 || Лекция 6: 12 || Лекция 7 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...