logo
Шпора по информатике / 002

18.4 Пример запроса, ввода, вывода для Win -программы

При выполнении лабораторной работы в системе Builder во многих задачах нужен запрос, ввод строки из окна и вывод результата в другое окно.

Запрос должен появиться на форме до нажатия кнопки и поэтому он записывается в одной из функций, связанных с формой, например, в конструкторе TForm1 или функции FormCreate. Обычно для запросов используют надписи, т.е. компоненты TLabel. Пример запроса:

Label1 -> Caption = " Введите строку в окно и нажмите кнопку";

По запросу вводится строка в окно, например, в Edit1, и только после этого

нажимается кнопка для запуска метода Button1Click.

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

В первом примере не будем использовать строковые функции

для изменения строки ss и поэтому будет работать следующий простой вариант

void _ _fastcall TForm1:: Button1Click (TObject * Sender) {

String ss = Edit1-> Text ; ss[1] = ' * '; ss [2] = ' # ' ; Edit2->Text = ss ; }

Во втором примере полагаем, что нужны обычные строковые функции для строки ss и для этого объявим новую строку с указателем Mci. Указатель Mci позволяет работать со String-строкой как с обычной символьной строкой (char *), т.к. метод c_str( ) выполняет преобразование строки ss в Mci. Для строки Мсi можно применять обычные строковые функции языка С с заголовочным файлом string.h .

void _ _fastcall TForm1:: Button1Click (TObject * Sender) {

String ss ; ss = Edit1->Text ;

char * Mci ; Mci = ss .c_str ( ) ; / / далее любые функции для C

Mci[0] = ' * '; Mci [1]= ' # ' ; / / пример обработки строки Mci

Edit2->Text = Mci ;

}

Память для строки выделяет конструктор класса String при создании объекта ss.

Результаты работы обеих программ совпадают - будет выведена изменённая строка.

18.5 Преобразование строк

Для получения строк класса AnsiString из других типов можно использовать конструкторы класса AnsiString. Их много и они перегружены. Например,

int m =25; String st (m ); Edit1 ->Text = st;

float x = 1.45; String st2 (x ); Edit2 ->Text = st2;

Здесь объявляются объекты st, st2 c инициализацией их, и для этого автоматически вызываются конструкторы, см. раздел 15.4.

Для преобразования чисел в строки и обратно можно использовать функции

StrToInt (String ), StrToFloat (String ), IntToStr (int ), FloatToStr (float )

Например, оператор

m= StrToInt (Edit1 ->Text) ;

выполнит ввод значения m из окна Edit1, а оператор

Edit2 ->Text= IntToStr(m+100) ;

выведет значение ( m+100) в окно Edit2.

В старших версиях можно последний оператор записать как Edit2 ->Text = m+100;

Для строк класса АnsiString можно использовать различные перегруженные операции, например, при выводе соединять в одной строке несколько строк

знаком плюс . Пример:

Label1-> Caption = "Students: " + Edit1->Text + " " + Edit2->Text ;

Edit3-> Text = String (_ _DATA_ _) + " " + String (_ _TIME_ _) ;

Последний оператор выводит дату и время.

Рассмотрим другие способы получения строк.

Преобразование целого числа j в обычную строку ss выполняет

часто применяемая функция itoa c прототипом в <stdlib.h>:

char * itoa ( int j, char *ss, 10);

где 10 - это основание десятичной системы счисления, т.к. возможны и другие.

Для преобразования строк классов string и AnsiString в обычные строки

можно использовать метод c_str ( ):

string a ; Edit3 -> Text = a . c_str ( );

18.6 Применение функций ShowMessage, MessageBox для ввода-вывода

Eсть очень простая функция ShowMessage для вывода строки str в окно, заголовком которого является имя выполняемого приложения:

ShowMessage ( str);

Для вывода текста можно также вызвать метод MessageBox, который имеет 3 аргумента:

Application -> MessageBox ( “ текст ”, “заголовок окна ”, 0 );

Здесь текст и заголовок могут быть любыми. Имя Application является

указателем на объект, которым является вся ваша программа. Последний параметр определяет вид окна сообщений и при его нулевом значении в окне есть кнопка ОК. Возможны и другие значения этого параметра, например, 1, 2, 3, 4, 5. Пример:

Application -> MessageBox ( “ Значения: ”, “ REZ-T from vst.cpp ” ,0 );

Эту функцию можно использовать и для вывода чисел, но числа должны быть преобразованы в строку, например, с помощью функции sprintf из языка С. Эта функция выполняет преобразование с учетом формата. Она уже рассматривалась в разделе 13.2 и использовалась в С-программе построения графика. Её вызов таков:

sprintf ( str, “ упр.инф. “, значения );

например, sprintf ( str, “ k= % i x=%5.2f \n“ , k , x );

Здесь str – это строка символов, т.е. это либо символьный массив, либо указатель. Для функции sprintf нужно подключить заголовочный файл <stdio.h> . После такого преобразования можно в одно окно MessageBox выводить несколько чисел:

Application -> MessageBox ( str, “ Получено: ” , 0 );

Рассмотренный метод MessageBox c тремя аргументами входит в библиотеку VCL системы Builder. В библиотеке Windows API есть такая же функция, но у неё четыре аргумента.

//---------------------------------------------------------------------------

Многие из операторов уже рассматривались ранее, и здесь рассмотрим

только новые и сложные.

Имя TForm1 – это имя класса, для которого создаются конструктор

TForm1 :: TForm1 и метод TForm1 :: Button1Click.

Модификатор _fastcall показывает, что аргументы передаются в функцию

через процессорные регистры, что ускоряет вызов.

TObject - базовый класс для всех классов библиотеки VCL.

*Sender – это указатель на объект - «отправитель» вызова.

Имя потока cout используется в этой программе для вывода в файл.

Свойство Position определяет положение ползунка в объекте ScrollBar1:

ScrollBar1->Position = jpolz;

здесь jpolz – это целая переменная с диапазоном изменения от 1 до 100.

При запуске программы первым выполнится конструктор, т.е. функция

TForm1 :: TForm1( …..) , т.к. он связан с главной формой. Конструктор выведет

в окна Edit1, Edit2 указанные тексты ( свойство Text), которые заменят

те тексты, которые были в этих окнах при проектировании.

После нажатия кнопки появится небольшое окно-сообщение ShowMessage

с именем проекта в верхней части, словом "Gratis!" ниже и с кнопкой ОК.

Нажав OK, получим следующее сообщение от программы. Если подключение файла myz1.txt произойдет нормально, то следующим сообщением будет окно с заголовком

From Вutton1Click”. В нём появятся два числа nend, secDelay и кнопка ОК.

Значения nend, secDelay определяют количество шагов ползунка для отображения на линейке и время задержки для каждого его положения.

Далее нажать ОК и на экране в полосе прокрутки будет двигаться ползунок вправо. В его конечном положении текст в окнах Edit1, Edit2 изменится.

Используя свойства Font кнопок и окон, можно изменить вид

всех выводимых на экран текстов.

Перейдём к заключительным операторам программы, в которых используется

свойство Canvas. Этим свойством обладают многие компоненты, например, TForm, TImage, TPaintBox, и оно соответствует поверхности (канве, холсту) для рисования

на ней. Рисовать можно пером (Pen) или кистью (Brush). Это сложное свойство,

которое само обладает рядом свойств. Обращение к конкретным свойствам

требует использования указателя на указатель, т.е. двух или более стрелок.

Примерами такого обращения являются операторы установки цветов пера и кисти

Form1-> Canvas->Pen->Color = clBlack; Canvas->Brush->Color = clRed;

Здесь выбраны черный и красный цвета. Следует обратить внимание, что имя объекта

Form1 ( это основная форма) можно здесь опускать.

Метод Ellipse( . . .) позволяет нарисовать эллипс с указанными координатами в пикселах. Контур эллипса рисуется пером выбранного цвета, а закрашивается кистью.

В классе ТCanvas есть много других методов для получения графических изображений, например, Draw, LineTo, MoveTo, Pie, Rectangle, TextOut.

Для получения помощи в системе нужно указать слово или объект

и нажать клавишу F1. Для указания нужного окна можно использовать клавишу TAB.

Исполняемый exe-файл, полученный после завершения работы,

- это Windows-приложение, и его можно переносить на любые ПК без системы Builder.

В заключение этого раздела ещё несколько слов о функции sleep.

Эта стандартная функция реализует задержку в сек. Для миллисекунд аналогичная функция имеет имя delay. Обе функции в Builder C++ считаются устаревшими ( англ. obsolete ) и выбраны здесь для упрощения программы. В системе Builder для интервалов времени используется класс TTimer из раздела System палитры компонентов. Здесь его рассматривать не будем, но рекомендую вам попытаться самостоятельно модернизировать рассмотренную программу с применением компонента Timer. Этот таймер, если он включён, отсчитывает время независимо от логики приложения и процессов в ОС.

19.2 О выполнении лабораторной работы 5

34