ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Программирование в системе Delphi с помощью строкЦелью данного раздела является изучение разновидностей строк, получения навыков описания, ввода, вывода и обработки строк. Типы строк Для обработки текстов в Object Pascal используются следующие типы: – короткая строка ShortString или String [N], где N <= 255; – длинная строка String или AnsiString; – широкая строка WideString; – нуль-терминальная строка PChar. Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: для ShortString – от 0 до 255; для String [N] длина строки меняется от 0 до N; для String, WideString и PChar − от 0 до 2 Гбайт. Тип String имеет разный смысл в зависимости от директивы компилятора $H. Если включена директива {$H+} (она включена по умолчанию), то String интерпретируется компилятором как тип AnsiString − длинная строка. Если же включить директиву {$H-}, то String интерпретируется компилятором как тип ShortString − короткая строка. Если в объявлении типа после ключевого слова String следует число символов в квадратных скобках (например, String [4]), то, независимо от директив компилятора, тип трактуется как короткая строка с указанным числом символов. Для объявления короткой строки максимальной длины может использоваться стандартный тип ShortString (эквивалентно String [255]). При объявлении короткой строки компилятор выделяет для ее размещения на один байт больше (добавляется нулевой байт) и помещает в нулевой байт текущую длину строки. В коротких и длинных строках используются однобайтовые символы ANSI. Однобайтный символ связан с одним из 256 возможных значений, которые трактуются в зависимости от установленной в Windows национальной страницы. 256 символов вполне достаточно для отображения национального алфавита любого европейского языка. В Delphi введены также широкие строки, объявляемые стандартным типом WideString. По своим свойствам они идентичны длинным строкам String, но отличаются от них тем, что для представления каждого символа используются не один, а два байта. Для отображения алфавита некоторых азиатских языков 256 символов недостаточно. В этом случае используются двухбайтные символы кода Unicode, в котором младший байт обычно кодируется семибитным ANSI – кодом, а старший указывает, как должен трактоваться этот код. Символ Unicode в памяти занимает одно двухбайтовое слово, которое имеет 65536 возможных значений. С помощью этого кода можно представить все символы всех языков мира. Двухбайтные символы Unicode объявляются стандартным типом WideChar, а составленные из них строки – типом WideString. Короткие, длинные и широкие строки нумеруются с 1. Нуль-терминальные строки представляют собой цепочки символов, ограниченные символом #0. Максимальная длина такой строки лимитируется только доступной памятью и может быть очень большой. Нуль-терминальные строки нумеруются с 0. В нуль-терминальных строках используются однобайтовые символы ANSI. Необходимость в нуль-терминальных строках возникает при прямом обращении к АРI -функциям ОС. При работе с компонентами Delphi в основном используются более удобные длинные строки. Примеры объявлений строковых типов: var swS:WideString; // широкая строка pcS: PChar; // нуль-терминальная строка acS: array [0..1000] of Char; // строка длиной до 1000 символов ssS: String [250]; // короткая строка длиной до 250 символов ssMax: ShortString; // короткая строка длиной до 255 символов stS: String; //длинная строка При объявлении длинной строки stS компилятор выделит для переменной 4 байта, достаточные для размещения адреса той ячейки памяти, начиная с которой будет фактически располагаться символьная строка. Говорят, что stS ссылается на строку. Такого рода переменные-ссылки называются указателями. При объявлении переменной pcS типа PChar компилятор считает эту переменную указателем и выделит для нее 4 байта. Операции над строками К строкам можно применять операцию «+» − конкатенации (сцепление или объединение) строк. Например: stS:= ‘a’ +’b’; // stS содержит "ab" stS:= stS + ‘c’; // stS содержит "abc" Операции отношения =, <>, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо, с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы более короткой строки заменяются значением Chr (0). Функция Chr (0) преобразует целочисленный аргумент к эквивалентному символу в соответствии с кодовой таблицей. Функция Chr (0) и #0обозначают один и тот же символ. Результаты операций отношения приведены ниже (табл.9.1). Таблица 9.1 Операции отношения со строками
Текущую длину строки можно получить с помощью функции Length. Со строками можно работать как с одномерными символьными массивами: n:=0; for k:=1 to Length(s) do if s[k] in [0..9] then n:=n+1; В данном примере осуществляется подсчет количества символов цифр в строке. Операция in проверяет принадлежность символа строки s[k] множеству целых чисел [0..9]. В следующем примере уничтожаются все ведомые (хвостовые) пробелы в длинной строке stS: while (Length(stS) <> 0) and (stS [Length(stS)] = ’ ‘) do SetLength (stS, Length (stS) –1); Стандартная процедура SetLength устанавливает новую длину строки stS. Многострочные окна редактирования Memo и RichEdit Компоненты Memo и RichEdit являются окнами редактирования многострочного текста. Они так же, как и компонента Edit, снабжены многими функциями, свойственными большинству редакторов. При редактировании текста можно использовать «горячие» клавиши: 1) Ctrl-C – копирование выделенного текста в буфер обмена; 2) Ctrl-X – вырезание выделенного текста в буфер обмена; 3) Ctrl-V – вставка текста из буфера обмена; 4) Ctrl-Z – отмена последней команды редактирования. В компоненте Memo текст выравнивается с помощью свойства Aligment, значения которого могут быть следующими: 1) taLeftJustify; // выравнивается по левой границе (по умолчанию); 2) taСenter; // выравнивается по центру; 3) taRightJustify;// выравнивается по правой границе. Если вы сохраните в файле текст, введенный или отредактированный пользователем, то будет создан текстовый файл, содержащий только символы и не содержащий элементов форматирования. При последующем чтении этого файла в Memo формат будет определяться текущим состоянием свойства Font компоненты Memo, а не тем, в каком формате ранее вводился текст. Для доступа ко всему содержимому Memo используется свойство Text типа TString. Для доступа к отдельным строкам используется свойство Lines типа Tstring: Memo1.Lines[5]:=’abc’; Очистить Memo можно методом Clear: Memo1.Clear; Добавить строку можно с помощью метода Add: Memo1.Lines.Add(‘abc’); Компонента Memo может реагировать на нажатие клавиши <Enter> при значении свойства WantReturns типа Boolean, равное True. Это значение установлено по умолчанию. Число строк в M emo хранится в свойстве Count (свойство только для чтения). Компонента RichEdit работает с текстом в обогащенном формате RTF. При желании изменить атрибуты вновь вводимого фрагмента текста можно задать свойство SelAttributes. Это свойство типа TTextAttributes, которое в свою очередь имеет подсвойства: Color (цвет), Name (имя шрифта), Size (размер), Style (стиль) и др. В компоненте имеется также свойство DefAttributes, содержащее атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойстве SelAttributes. Но значения атрибутов в DefAttributes сохраняются и в любой момент могут быть методом Assign присвоены атрибутам свойства SelAttributes, чтобы вернуться к прежнему стилю. За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойство Paragraph типа TParaAttributes. Этот тип в свою очередь имеет ряд свойств, которые можно задавать только в процессе выполнения приложения, например в обработчике события при щелчке на какой-нибудь кнопке. Значение подсвойств свойства Paragraph относятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответствующее выравнивание текущего абзаца: RichEdit1. Paragraph. Aligment:=taLeftJustify; // влево RichEdit1. Paragraph. Aligment:=taСenter; // по центру RichEdit1. Paragraph. Aligment:=taRightJustify; // вправо Основное свойство окон Memo и RichEdit − Lines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойства Lines в окне Инспектора объектов. Перед вами откроется окно редактирования списка строк. Вы можете редактировать и вводить текст непосредственно в этом окне либо нажать кнопку CodeEditor и работать в обычном окне Редактора кода. В этом случае, завершив работу с текстом, выберите из контекстного меню, всплывающего при щелчке правой кнопки мыши, команду Close Page и ответьте утвердительно на вопрос, хотите ли вы сохранить текст в соответствующем свойстве окна редактирования. Сохранение текста в файле осуществляется методом SaveToFile, а загрузка текста из файла – LoadFromFile: Memo1.SaveToFile (‘myfile.txt’); Memo1.LoadFromFile (‘myfile.txt’); RichEdit1.SaveToFile (‘myfile1.rtf’); RichEdit1.LoadFromFile (‘myfile1.rtf’); Справочные данные Действия над строками и символами реализуются с помощью большого набора стандартных процедур и функций. В таблицах 9.2 –9.6 приведены описания процедур и функций (в квадратных скобках указываются необязательные параметры). Таблица 9.2 Процедуры и функции для работы со строками
Таблица 9.3 Подпрограммы преобразования строк в другие типы
Окончание табл. 9.3
Таблица 9.4 Подпрограммы обратного преобразования
Окончание табл. 9.4
В примерах таблицы 9.5 показаны строки для времени 19 ч 45 мин и даты 8 июня 2009 г. Таблица 9.5 Спецификаторы формата даты/времени
Окончание табл. 9.5
Любые другие символы, указанные в строке Format, а также заключенные в апострофы или кавычки специальные символы-спецификаторы помещаются в выходную строку без преобразования, поэтому спецификаторы ‘h час n мин' дадут строку 19 час 45 мин, а 'h час «n мин» − 19 час n мин. Таблица 9.6 Подпрограммы для работы с нуль-терминальными строками
Продолжение табл. 9.6
Окончание табл. 9.6
Пример программирования с использованием строк Задание. Дана последовательность из 50 литер (строчных латинских букв, цифр). Напечатать этот текст, заменяя все цифры «9» – русской «x», а остальные входящие в него цифры – звездочкой. Значения используемых компонент для программного интерфейса показаны ниже (табл. 9.7). Таблица 9.7 Используемые компоненты
1. Разработка алгоритма (рис. 9.1): а) исходные данные: str – строка символов; б) промежуточные данные: i – переменная целого типа, счетчик цикла; в) результат: str – преобразованная строка. Рис. 9.1. Схема алгоритма решения задачи 2. Текст программы: Unit Unit1; Interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls type TForm1=class (TForm) Label1: TLabel; //комментарий к полю ввода Edit1: TEdit; //поле ввода строки Label2: TLabel; //комментарий к полю вывода Edit2: TEdit; //поле вывода измененной строки Button1: TButton; //кнопка «выполнить» Button2: TButton; //кнопка «выход» Procedure Button2Click(Sender: TObject); //процедура, вызываемая при щелчке на Button2 Procedure Button1Click(Sender: TObject); // процедура, вызываемая при щелчке на Button1 private {Private declarations} public {Public declarations }; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin Close end; procedure TForm1.Button1Click(Sender: TObject); { процедура, заменяющая цифры '9' буквой 'х', а остальные символы – на '*'} var str: string; i: integer; begin str:= Edit1.Text; while pos (‘9’, str) > 0 do str[pos(‘9’, str)]:= ’х’; for i=1 to Length(str) do if str[i] in [‘0’..’8’] then str[i]:= ’*’; Edit2.Text:= str; end; end. Контрольные вопросы к главе 9 1. Какие виды строк существуют в Delphi? 2. Опишите короткую строку, состоящую из 10 символов. 3. Можно ли работать со строкой как с одномерным символьным массивом? 4. Каким образом можно преобразовать строковый тип в вещественный? 5. Каким образом можно преобразовать числовой тип в строковый? 6. С помощью какой функции можно найти подстроку в строке? 7. С помощью какой функции можно найти текущую длину строки? 8. Как можно передать короткие строки в качестве параметров подпрограмм? 9. Как можно передать длинные строки в качестве параметров подпрограмм? 10. Как можно использовать широкие строки в качестве параметров подпрограмм? 11. Как можно передать нуль-терминальные строки в качестве параметров подпрограмм? 12. Чем отличаются кодировки длинных и широких строк? 13. При помощи каких компонент можно ввести строку? 14. При помощи каких компонент можно вывести на форму строку? 15. Какие основные свойства у компонента Memo? 16. Какие основные свойства у компонента RichEdit? 17. Найдите ошибки в описаниях: а) Const adres:=’ул. Дейнеки,5’; max=string; б) Type tf=string[125]; var fstr.ft; st2, st1,string[50]; nazv: string[280]; Не нашли, что искали? Воспользуйтесь поиском:
|