AnsiLowerCase — Функция Delphi
Работа со строками Delphi позволяет извлечь из строки необходимую информацию и представить её в нужном виде. Система предоставляет весь спектр необходимых функций для работы со строками Delphi и преобразования строк Delphi в необходимые форматы:
- числовой формат, целый и дробный с плавающей точкой;
- формат времени, даты, даты-времени;
- преобразование символов к верхнему или нижнему регистру;
- сравнение строк, поиск в строке и копирование подстроки;
и многие другие.
Непосредственно сами строки Delphi поддерживают единственную операцию, так называемую операцию конкатенации, то есть присоединения. Несмотря на «научное» название, операция конкатенации выполняет очень простую процедуру. С помощью операции конкатенации одна строка присоединяется к другой:
Результирующая строка S будет суммой двух слагаемых строк. Длина строки, то есть количество символов в строке, возвращается встроенной функцией
function Length(S: String): Integer;
Delphi работает со строками типа String, в котором длина строки записывается в начале строки, перед первым символом. Поэтому индекс первого символа в строке не 0, а 1. То есть, если:
S:=’Строка типа String’;
то S[1] — символ ‘С’, S[2] — символ ‘т’ , последний символ в строке — S[Length(S)], равный ‘g’.
Однако часто приходится иметь дело со строками типа PChar, которые использует операционая система Windows. В строках типа PChar длина строки определяется специальным символом конца строки — #0. Поэтому для использования функций Windows тип String необходимо предварительно переводить в тип PChar. Преобразование типа String в тип PChar выполняет функция
function PChar(S: String): PChar;
Для полноценной работы со строками Delphi используются следующие стандартные процедуры и функции:
Функции преобразования в числовой формат и обратно
Выполняя вычисления, используем для ввода данных и отображения результатов следующие функции, работающие со строками Delphi:
функция IntToStr(N: Integer): String Преобразует целое число N в строку. |
функция StrToInt(S: String): Integer Преобразует строку S в целое число. |
функция FloatToStr(X: Extended): String Преобразует число с плавающей точкой X в строку. |
функция StrToFloat(S: String): Extended Преобразует строку S в число с плавающей точкой. |
Процедуры и функции преобразования дат и времени
Сначала собственно функции, предоставляющие информацию о текущих дате и времени:
функция Now: TDateTime Возвращает текущую дату и время. |
функция Date: TDateTime Возвращает текущую дату. |
функция Time: TDateTime Возвращает текущее время. |
Далее, функции, работающие с составляющими даты и времени (год, месяц, число, день недели, часы, минуты, секунды и даже миллисекунды):
функция DayOfWeek(Date: TDateTime): Integer Возвращает текущий номер дня недели: 1 — воскресенье, 7 — суббота. |
процедура DecodeDate(Date: TDateTime; var Year, Month, Day: Word) Разбивает дату Date на год — Year, месяц — Month и день — Day. |
процедура DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word) Разбивает время Time на час — Hour, минуты — Min, секунды — Sec и миллисекунды — MSec. |
функция EncodeDate(Year, Month, Day: Word): TDateTime Объединяет год — Year, месяц — Month и день — Day в значение типа TDateTime. |
функция EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime Объединяет час — Hour, минуты — Min, секунды — Sec и миллисекунды — MSec в значение типа TDateTime. |
Наконец, собственно, функции, переводящие дату и время из формата TDateTime в строчный формат:
функция DateTimeToStr(DateTime: TDateTime): String Преобразует дату и время DateTime в строку. |
функция DateToStr(Date: TDateTime): String Преобразует дату Date в строку. |
функция TimeToStr(Time: TDateTime): String Преобразует время Time в строку. |
Следующие функции работают с параметрами возвращаемой строки. Функции с приставкой Ansi работают в том числе и с кириллическими символами. Если символы в строках предполагаются исключительно латинские, то можно использовать аналогичные функции, но без приставки Ansi:
функция AnsiLowerCase(const S: String): String Возвращает строку S, преобразованную к нижнему регистру. |
функция AnsiUpperCase(const S: String): String Возвращает строку S, преобразованную к верхнему регистру. |
функция Length(const S: String): Integer Возвращает количество символов в строке S. |
функция Trim(const S: String): String Удаляет из строки S начальные и завершающие пробелы и управляющие символы. |
функция TrimLeft(const S: String): String Удаляет из строки S начальные пробелы и управляющие символы. |
функция TrimRight(const S: String): String Удаляет из строки S завершающие пробелы и управляющие символы. |
Следующие функции сравнивают две строки между собой:
функция AnsiCompareStr(const S1, S2: String): Integer Сравнивает две строки S1 и S2 с учётом регистра символов. Возвращает значение 0 если S1>S2 |
функция AnsiCompareText(const S1, S2: String): Integer Сравнивает две строки S1 и S2 без учёта регистра символов. Возвращает значение 0 если S1>S2 |
Следующие функции осуществляют поиск в текущей строке подстроки, вставляют, удаляют или заменяют подстроку:
функция Pos(Substr: String; Str: String): Integer Возвращает позицию (индекс) первого вхождения Substr в строке Str. Если Substr нет в Str, возвращает 0. |
функция Insert(Source: String; var S: String; Index: Integer): Integer Вставляет строку Source в строку S, начиная с номера символа, равного Index |
процедура Delete(var S: String; Index, Count: Integer) Удаляет из строки S подстроку, начинающуюся с номера символа, равного Index, и содержащую до Count символов. |
функция StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): String Заменяет в строке S подстроку OldPattern на строку NewPattern с учётом флага TReplaceFlags. Для работы с этой функцией нужно создать переменную типа TReplaceFlags — это множество, и включить в него одно или оба значения из следующих: rfReplaceAll — будут заменены все вхождения. Если это значение не будет включено во множество, то будет заменено только первое вхождение; rfIgnoreCase — замена будет без учёта регистра символов. Если это значение не будет включено во множество, то замена будет чувствительна к регистру символов. |
Наконец, функция копирования части строки:
функция Copy(S: String; Index, Count: Integer): String Возвращает подстроку строки S, начиная с номера символа, равного Index и содержащую до Count символов. |
Помимо прочего, эту функцию можно использовать для вывода нецелого числа с нужным количеством цифр после запятой. Для этого, сначала получаем строку из числа формата Real, затем находим функцией Pos позицию запятой в этой строке, прибавляем нужное количество и копируем в результат это количество символов. Вот готовая функция:
function RealToStr(X: Real; Count: Integer): String; //Count — количество цифр после запятой
var S: String;
N: Integer;
begin
S:=FloatToStr(X); //после запятой — длинная последовательность цифр
//DecimalSeparator — константа, содержащая истинный разделитель целой и дробной частей числа N:=Pos(DecimalSeparator, S); //позиция запятой в строке
//вычисляем длину строки с нужным количеством знаков после запятой:
if N=0 //если в строке нет запятой — это целое число, и
then N:=Length(S) //тогда просто выводим это число
else N:=N+Count; //иначе вычисляем длину строки
Result:=Copy(S, 1, N); //копируем часть строки в результат
end;
Или вот, к примеру, текст модуля, обеспечивающего ввод в компонент Edit только чисел.
delphi — Как ускорить функцию AnsiLowerCase?
Возможно сделать, как то быстрее, работу функции AnsiLowerCase :
Работает в три раза медленней нежели без этой функции:
Кто может посоветовать?
-
4 1
- 18 янв 2020 2020-01-18 11:42:48
- Татьяна
1 ответ
Если данные и алгоритм позволяют, то приведите весь обрабатываемый текст и все ключевые слова (например, Zapros) к нижнему регистру один раз при старте алгоритма.
функция lowercase с индексом
Lowercase or uppercase
var: mes:array of string; begin for i:=1 to 11 do begin if LowerCase(trim(mes))=.
Функция с нижним индексом
Помогите написать функцию Ei(x)=P(x)+ci, где i-нижний индекс
DataGrid: удалить строку с индексом 1, если строка с индексом 2 получает фокус
Мне нужно удалить строку с индексом 1 если если строка с индексом 2 получает фокус. делаю так.
Как присвоить значению X:= F с верхним индексом n и нижним индексом 2 (см. вложение)
Как присвоить значению X:= F с верхним индексом n и нижним индексом 2 (см. вложение)
а что с char’ ом не так?
Добавлено через 2 минуты
а если вам надо выдернуть второй символ из стринга, то тогда вот так это делать:
24.08.2010, 07:54 |
24.08.2010, 07:54 |
Удалите из списка элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k Удалить из массива элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходникиПроцедуры и функции для работы со строками в DelphiСтроки очень часто используются в программах — хотя бы для вывода различных сообщений пользователю, чтобы он не заблудился в интерфейсе. Ну, для таких простых случаев вполне достаточно тех сведений, которые вы получили на уроке, посвящённом строкам. Если же у вас более серьёзные намерения и вы хотите манипулировать строками по своему желанию (например, вы пишете какую-нибудь словесную игру вроде Балды или Логогрифов), то в Delphi найдётся всё нужное и для таких любителей словесности и жонглирования приставками и суффиксами. Для определённости в примерах будем считать, что Когда мы изучали простые операции со строками, то рассматривали конкатенацию строк с помощью оператора +. Но объединить две строки можно и функцией которая возвращает «сумму» двух строк: Для сравнения строк вместо операторов отношения можно использовать следующие функции. Обе функции сравнивают строки s1 и s2. Первая — с учётом регистра букв (прописные/строчные), вторая — без учёта. Эти функции возвращают значение 0, если строки равны; Их нельзя применять к русским словам, поэтому лучше пользоваться функциями: которые одинаково хорошо работают и с латинскими, и с русскими буквами. Теперь перейдём к процедурам и функциям, которые выполняют со словами более сложные действия. Довольно часто нужно преобразовать все буквы слова либо к верхнему, либо к нижнему регистру. Если слова состоят только из латинских букв, то можно использовать функции: Первая переводит слова в нижний регистр (строчные буквы), вторая — в верхний (прописные буквы). Для русских ( и для латинских ) букв годятся функции : Функция AnsiLowerCase (S1) вернёт строку «смородина». Функция AnsiUpperCase (’смородина’) вернёт строку «СМОРОДИНА». Процедуры вывода сообщений на экран (обычно в метку или список) требуют в качестве параметра строку, а что делать, если нужно предъявить пользователю число? — Преобразовать число в строку! Это можно сделать и самостоятельно, но гораздо удобнее воспользоваться встроенными функциями Delphi. Чаще других в программах применяют функции для преобразования целых чисел в строку: Например, IntToStr (1234) вернёт строку «1234». Для действительных чисел тоже имеется подобная функция Если вы хотите узнать, как десятичное число записывается в 16-ричной системе счисления, примените к нему функции: Например, IntToHex (12 34, Второй параметр — Digits — задаёт число цифр в 16-ричном числе. При вводе данных из файла или некоторых компонентов вместо числа мы получаем строку символов. И хотя она состоит из цифр, это не число. В этом случае поможет функция Причём строка S может содержать не только десятичное, но и 16-ричное число. Например, функции StrToInt(’$07D9’) и StrToInt(’2009’) вернут одно и то же число 2009. Однако эта функция «опасна»: если в строке обнаружится хотя бы один неверный символ, возникнет ошибка. Если у вас есть обоснованные сомнения в правильности строки, лучше обратиться к надёжной функции Она возвращает TRUE, если строка преобразована в число без ошибок, и FALSE, если с ошибками. Переменная Value (в нашем примере i) хранит число. В примере строка ‘$07D9s’ содержит неверный символ «s», поэтому функция вернёт FALSE и строку печатать не нужно (на самом деле значение переменной i будет равно 2009, так как функция успеет конвертировать первые символы строки — до первой «нецифры»). Так же можно использовать и процедуру: V — переменная целого или действительного типа. Code — переменная целого типа, в которой возвращается номер ошибочного символа в строке. Если таких символов нет, то значение этой переменной будет равно нулю. В результате выполнения этого примера будет напечатано число 2009. Этот код также напечатает число 2009, но значение переменной i будет равно не нулю, как в первом случае, а 6, так как шестой символ строки не является 16-ричной цифрой. Аналогичные функции для вещественных чисел: В начале и/или конце строки могут присутствовать ненужные пробелы. От них легко избавиться , применив функции Первая удаляет начальные пробелы, вторая — конечные, третья — и те, и другие. Эти функции возвращают новую строку — уже без пробелов. Узнать длину строки (число символов в ней) можно с помощью функции Например , Length (S1) вернёт 9, а Length(S2) — 7. Ну, а теперь — самые интересные процедуры и функции! Удаляем часть строки S от символа номер Index: Здесь Count — число удаляемых символов. Например, после выполнения процедуры: строка si будет иметь значение «РОДИНА». А после процедуры delete(s2,5,3); строка s2 будет урезана до «ПАРА». Если значение переменной Index меньше единицы или больше длины строки, то строка останется без изменений. Ничего не случится со строкой и если Count меньше единицы. Если же Count больше, чем число символов в строке, начиная с Index, то будут удалены все символы до конца строки. Процедура Insert действует противоположно — она вставляет подстроку Substr в строку Dest после символа номер Index: Например, после выполнения процедуры insert (’З’, s1,6); строка s1 превратится в смешное слово «СМОРОЗДИНА». А процедура insert (’КА’, s2,8); позволит нам насладиться неологизнеологизмом «ПАРАШЮТКА». Если же мы не хотим портить исходную строку, как это делает процедура Delete, то можем создать новую строку, вырезав из любой строки нужный нам кусок: Например, строка s примет значение «ПАРА» после выполнения функции s:=copy(s2,1,4); Обратите внимание: чтобы получить то же самое слово, что и в примере с delete(s2,5,3);, мы указали другие значение параметров в вызове функции! Функция copy (s1,4,9) вернёт в переменную s слово «РОДИНА». И последняя функция находит позицию подстроки substr в строке str. function Pos(const substr: string; const str: string): Integer; Если в строке искомая подстрока встречается несколько раз, то первый вызов функции Pos вернёт позицию первого вхождения, после чего поиск нужно продолжить со следующей позиции. Например, в слове ФЕЛЬДФЕБЕЛЬ так можно найти обе «ели». Если же подстроки в строке нет, то вернётся безнадёжный ноль! Компоненты Delphi для работы с файламиЧитайте также:
|
В приложениях часто приходится выполнять стандартные действия: открывать и сохранять файлы, задавать атрибуты шрифтов, выбирать цвета палитры, производить контекстный поиск и замену и т.п.
Разработчики Delphi позаботились о том, чтобы включить в библиотеку простые для использования компоненты, реализующие соответствующие диалоговые окна. Они размещены на странице Dialogs. В таблице приведен перечень этих диалогов.
Компонент | Страница | Описание |
OpenDialog «Открыть файл» | Dialogs | Предназначен для создания окна диалога «Открыть файл». |
SaveDialog «Сохранить файл» | Dialogs | Предназначен для создания окна диалога «Сохранить файл как». |
OpenPictureDialog «Открыть рисунок» | Dialogs | Предназначен для создания окна диалога «Открыть рисунок», открывающего графический файл. Начиная с Delphi 3. |
SavePictureDialog «Сохранить рисунок» | Dialogs | Предназначен для создания окна диалога «Сохранить рисунок» — сохранение изображения в графическом файле. Начиная с Delphi 3. |
FontDialog «Шрифты» | Dialogs | Предназначен для создания окна диалога «Шрифты» — выбор атрибутов шрифта. |
ColorDialog «Цвет» | Dialogs | Предназначен для создания окна диалога «Цвет» — выбор цвета. |
PrintDialog «Печать» | Dialogs | Предназначен для создания окна диалога «Печать». |
PrinterSetupDialog «Установка принтера» | Dialogs | Предназначен для создания окна диалога «Установка принтера». |
FindDialog «Найти» | Dialogs | Предназначен для создания окна диалога «Найти» — контекстный поиск в тексте. |
ReplaceDialog «Заменить» | Dialogs | Предназначен для создания окна диалога «Заменить» — контекстная замена фрагментов текста. |
FileListBox (список файлов) | Win3.1 | Отображает список всех файлов каталога. |
DirectoryListBox (структура каталогов) | Win3.1 | Отображает структуру каталогов диска. |
DriveComboBox (список дисков) | Win3.1 | Выпадающий список доступных дисков. |
FilterComboBox (список фильтров) | Win3.1 | Выпадающий список фильтров для поиска файлов. |
DirectoryOutline (дерево каталогов) | Samples | Пример компонента, используемого для отображения структуры каталогов выбранного диска. |
Последние четыре компонента в таблице являются не законченными диалогами, а их фрагментами, позволяющими строить свои собственные диалоговые окна.
Все диалоги являются невизуальными компонентами, так что место их размещения на форме не имеет значения. При обращении к этим компонентам вызываются стандартные диалоги, вид которых зависит от версии Windows и настройки системы. Так что при запуске одного и того же приложения на компьютерах с разными системами диалоги будут выглядеть по-разному. Например, при русифицированной версии Windows все их надписи будут русскими, а при англоязычной версии надписи будут на английском языке.
Основной метод, которым производится обращение к любому диалогу, — Execute. Эта функция открывает диалоговое окно и, если пользователь произвел в нем какой-то выбор, то функция возвращает true. При этом в свойствах компонента-диалога запоминается выбор пользователя, который можно прочитать и использовать в дальнейших операциях. Если же пользователь в диалоге нажал кнопку Отмена или клавишу Esc, то функция Execute возвращает false. Поэтому стандартное обращение к диалогу имеет вид:
if .Execute then ;
Компоненты OpenDialog — диалог «Открыть файл» и SaveDialog — диалог «Сохранить файл как. », пожалуй, используются чаще всего, в большинстве приложений.
Все свойства этих компонентов одинаковы, только их смысл несколько различен для открытия и закрытия файлов. Основное свойство, в котором возвращается в виде строки выбранный пользователем файл, — FileName. Значение этого свойства можно задать и перед обращением к диалогу. Тогда оно появится в диалоге как значение по умолчанию в окне Имя файла
Типы искомых файлов, появляющиеся в диалоге в выпадающем списке Тип файла, задаются свойством Filter. В процессе проектирования это свойство проще всего задать с помощью редактора фильтров, который вызывается нажатием кнопки с многоточием около имени этого свойства в Инспекторе Объектов. При этом открывается окно редактора В его левой панели Filter Name вы записываете тот текст, который увидит пользователь в выпадающем списке Тип файла диалога. А в правой панели Filter записываются разделенные точками с запятой шаблоны фильтра.
После выхода из окна редактирования фильтров заданные вами шаблоны появятся в свойстве Filter в виде строки вида:
текстовые (*.txt, *.doc)|*.txt; *.doc|все файлы|*.*
В этой строке тексты и шаблоны разделяются вертикальными линиями. В аналогичном виде, если требуется, можно задавать свойство Filter программно во время выполнения приложения.
Свойство FilterIndex определяет номер фильтра, который будет по умолчанию показан пользователю в момент открытия диалога. Например, значение FilterIndex = 1 задает по умолчанию первый фильтр.
Свойство InitialDir определяет начальный каталог, который будет открыт в момент начала работы пользователя с диалогом. Если значение этого свойства не задано, то открывается текущий каталог или тот, который был открыт при последнем обращении пользователя к соответствующему диалогу в процессе выполнения данного приложения.
Свойство DefaultExt определяет значение расширения файла по умолчанию. Если значение этого свойства не задано, пользователь должен указать в диалоге полное имя файла с расширением. Если же задать значение DefaultExt, то пользователь может писать в диалоге имя без расширения. В этом случае будет принято заданное расширение.
Свойство Title позволяет вам задать заголовок диалогового окна. Если это свойство не задано, окно открывается с заголовком, определенным в системе. Но вы можете задать и свой заголовок, подсказывающий пользователю ожидаемые действия. Например, «Укажите имя открываемого файла».
Свойство Options определяет условия выбора файла. Множество опций, которые вы можете установить программно или во время проектирования, включает:
ofAllowMultiSelect | Позволяет пользователю выбирать несколько файлов |
ofCreatePrompt | В случае, если пользователь написал имя несуществующего файла, появляется замечание и запрос, надо ли создать файл с заданным именем |
ofEnableIncludeNotify | Разрешает посылать в диалог сообщения |
ofEnableSizing | Разрешает пользователю изменять размер диалогового окна |
ofExtensionDifferent | Этот флаг, который можно прочитать после выполнения диалога, показывает, что расширение файла, выбранного пользователем, отличается от DefaultExt |
ofFileMustExist | В случае, если пользователь написал имя несуществующего файла, появляется сообщение об ошибке |
ofHideReadOnly | Удаляет из диалога индикатор Открыть только для чтения |
ofNoChangeDir | После щелчка пользователя на кнопке OK восстанавливает текущий каталог, независимо от того, какой каталог был открыт при поиске файла |
ofNoDereferenceLinks | Запрещает переназначать клавиши быстрого доступа в диалоговом окне |
ofNoLongNames | Отображаются только не более 8 символов имени и трех символов расширения |
ofNoNetworkButton | Убирает из диалогового окна кнопку поиска в сети. Действует только если флаг ofOldStyleDialog включен |
ofNoReadOnlyReturn | Если пользователь выбрал файл только для чтения, то генерируется сообщение об ошибке |
ofNoTestFileCreate | Запрещает выбор в сети защищенных файлов и не доступных дисков при сохранении файла |
ofNoValidate | Не позволяет писать в именах файлов неразрешенные символы, но не мешает выбирать файлы с неразрешенными символами |
ofOldStyleDialog | Создает диалог выбора файла в старом стиле (см. рис. 8.4) |
ofOverwritePrompt | В случае, если при сохранении файла пользователь написал имя существующего файла, появляется замечание, что файл с таким именем существует, и запрашивается желание пользователя переписать существующий файл |
ofPathMustExist | Генерирует сообщение об ошибке, если пользователь указал в имени файла несуществующий каталог |
ofReadOnly | По умолчанию устанавливает индикатор Открыть только для чтения при открытии диалога |
ofShareAware | Игнорирует ошибки нарушения условий коллективного доступа и разрешает, несмотря на них, производить выбор файла |
ofShowHelp | Отображает в диалоговом окне кнопку Справка |
По умолчанию все перечисленные опции, кроме ofHideReadOnly, выключены. Но, как видно из их описания, многие из них полезно включить перед вызовом диалогов.
Если вы разрешаете с помощью опции ofAllowMultiSelect множественный выбор файлов, то список выбранных файлов можно прочитать в свойстве Files типа TStrings.
В приведенной таблице даны опции, используемые в 32-разрядных версиях Delphi. В Delphi 1 диалоговое окно имеет вид, представленный на рис. 8.4. Аналогичный вид имеет диалог и в 32-разрядных версиях Delphi при включении опции ofOldStyleDialog.
В компонентах диалогов открытия и сохранения файлов предусмотрена возможность обработки ряда событий. Такая обработка может потребоваться, если рассмотренных опций, несмотря на их количество, не хватает, чтобы установить все диктуемые конкретным приложением ограничения на выбор файлов. Событие OnCanClose возникает при нормальном закрытии пользователем диалогового окна после выбора файла. При отказе пользователя от диалога — нажатии кнопки Отмена, клавиши Esc и т.д. событие OnCanClose не наступает. В обработке события OnCanClose вы можете произвести дополнительные проверки выбранного пользователем файла и, если по условиям вашей задачи этот выбор недопустим, вы можете известить об этом пользователя и задать значение false передаваемому в обработчик параметру CanClose. Это не позволит пользователю закрыть диалоговое окно.
Можно также написать обработчики событий OnFolderChange — изменение каталога, OnSelectionChange — изменение имени файла, OnTypeChange — изменение типа файла. В этих обработчиках вы можете предусмотреть какие-то сообщения пользователю.
Теперь приведем примеры использования диалогов OpenDialog и SaveDialog. Пусть ваше приложение включает окно редактирования Memo1, в которое по команде меню Открыть вы хотите загружать текстовый файл, а после каких-то изменений, сделанных пользователем, — сохранять по команде Сохранить текст в том же файле, а по команде Сохранить как. — в файле с другим именем.
Введите на форму компоненты — диалоги OpenDialog и SaveDialog. Предположим, что вы оставили их имена по умолчанию — OpenDialog1 и SaveDialog1. Поскольку после чтения файла вам надо запомнить его имя, чтобы знать под каким именем потом его сохранять, вы можете определить для этого имени переменную, назвав ее, например, FName:
var FName: string;
Тогда обработка команды Открыть может сводиться к следующему оператору:
if OpenDialog1.Execute then begin FName := OpenDialog1.FileName; Memo1.Lines.LoadFromFile(FName); end;
Этот оператор вызывает диалог, проверяет, выбрал ли пользователь файл (если выбрал, то функция Execute возвращает true), после чего имя выбранного файла (OpenDialog1.FileName) сохраняется в переменной FName и файл загружается в текст Memo1 методом LoadFromFile.
Обработка команды Сохранить выполняется оператором
В данном случае нет необходимости обращаться к какому-то диалогу, поскольку имя файла известно: оно хранится в переменной FName.
Обработка команды Сохранить как. выполняется операторами:
SaveDialog1.FileName := FName;if SaveDialog1.Execute then begin FName := SaveDialog1.FileName; Memo1.Lines.SaveToFile(FName); end;
Первый из этих операторов присваивает свойству FileName компонента SaveDialog1 запомненное имя файла. Это имя по умолчанию будет предложено пользователю при открытии диалога Сохранить как. Следующий оператор открывает диалог и, если пользователь выбрал в нем файл, запоминает новое имя файла и сохраняет в файле с этим именем текст компонента Memo1.
Мы рассмотрели диалоги открытия и сохранения файлов произвольного типа. Начиная с Delphi 3 в библиотеке имеются специализированные диалоги открытия и закрытия графических файлов: OpenPictureDialog и SavePictureDialog. Диалоговые окна, открываемые этими файлами. От окон, открываемых компонентами OpenDialog и SaveDialog, они отличаются удобной возможностью просматривать изображения в процессе выбора файла.
Свойства компонентов OpenPictureDialog и SavePictureDialog ничем не отличаются от свойств компонентов OpenDialog и SaveDialog. Единственное отличие — заданное значение по умолчанию свойства Filter в OpenPictureDialog и SavePictureDialog. В этих компонентах заданы следующие фильтры:
All (*.jpg; *.jpeg; *.bmp; *.ico; *.emf; *.wmf) | *.jpg; *.jpeg; *.bmp; *.ico; *.emf; *.wmf |
JPEG Image File (*.jpg) | *.jpg |
JPEG Image File (*.jpeg) | *.jpeg |
Bitmaps (*.bmp) | *.bmp |
Icons (*.ico) | *.ico |
Enhanced Metafiles (*.emf) | *.emf |
Metafiles (*.wmf) | *.wmf |
В этих фильтрах перечислены все типы графических файлов, с которыми может работать диалог. Так что вам остается удалить, если хотите, фильтры тех файлов, с которыми вы не хотите работать, добавить, может быть, фильтр «Все файлы (*.*)» и перевести на русский язык названия типов.
Компонент FontDialog вызывает диалоговое окно выбора атрибутов шрифта. В нем пользователь может выбрать имя шрифта, его стиль (начертание), размер и другие атрибуты.
Основное свойство компонента — Font типа TFont, в котором вы можете задать при желании начальные установки атрибутов шрифта и в котором вы можете прочесть значения атрибутов, выбранные пользователем в процессе диалога.
Свойства MaxFontSize и MinFontSize устанавливают ограничения на максимальный и минимальный размеры шрифта. Если значения этих свойств равны 0 (по умолчанию), то никакие ограничения на размер не накладываются. Если же значения свойств заданы (обычно это целесообразно делать исходя из размеров компонента приложения, для которого выбирается шрифт), то в списке Размер диалогового окна появляются только размеры, укладывающиеся в заданный диапазон. При попытке пользователя задать недопустимый размер ему будет выдано предупреждение вида «Размер должен лежать в интервале . » и выбор пользователя отменится. Свойства MaxFontSize и MinFontSize действуют только при включенной опции fdLimitSize (см. ниже).
Свойство Device определяет, из какого списка возможных шрифтов будет предложен выбор в диалоговом окне: fdScreen — из списка экрана (по умолчанию), fdPrinter — из списка принтера, fdBoth — из обоих.
Свойство Options содержит множество опций:
fdAnsiOnly | Отображать только множество шрифтов символов Windows, не отображать шрифтов со специальными символами |
fdApplyButton | Отображать в диалоге кнопку Применить независимо от того, предусмотрен ли обработчик события OnApply |
fdEffects | Отображать в диалоге индикаторы специальных эффектов (подчеркивание и др.) и список Цвет |
fdFixedPitchOnly | Отображать только шрифты с постоянной шириной символов |
fdForceFontExist | Позволять пользователю выбирать шрифты только из списка, запрещать ему вводить другие имена |
fdLimitSize | Разрешить использовать свойства MaxFontSize и MinFontSize, ограничивающие размеры шрифта |
fdNoFaceSel | Открывать диалоговое окно без предварительно установленного имени шрифта |
fdNoOEMFonts | Удалять из списка шрифтов шрифты OEM |
fdScalableOnly | Отображать только масштабируемые шрифты, удалять из списка не масштабируемые (шрифты bitmap) |
fdNoSimulations | Отображать только шрифты и их начертания, напрямую поддерживаемые файлами, не отображая шрифты, в которых жирный стиль и курсив синтезируется |
fdNoSizeSel | Открывать диалоговое окно без предварительно установленного размера шрифта |
fdNoStyleSel | Открывать диалоговое окно без предварительно установленного начертания шрифта |
fdNoVectorFonts | Удалять из списка векторные шрифты (типа Roman или Script для Windows 1.0) |
fdShowHelp | Отображать в диалоговом окне кнопку Справка |
fdTrueTypeOnly | Предлагать в списке только шрифты TrueType |
fdWysiwyg | Предлагать в списке только шрифты, доступные и для экрана, и для принтера, удаляя из него аппаратно зависимые шрифты |
По умолчанию все эти опции, кроме fdEffects, отключены.
Если установить опцию fdApplyButton, то при нажатии пользователем кнопки. Применить возникает событие OnApply, в обработчике которого вы можете написать код, который применит выбранные пользователем атрибуты, не закрывая диалогового окна.
Приведем примеры применения компонента FontDialog. Пусть ваше приложение включает окно редактирования Memo1, шрифт в котором пользователь может выбирать командой меню Шрифт. Вы ввели в приложение компонент FontDialog, имя которого по умолчанию FontDialog1. Тогда обработчик команды Шрифт может иметь вид:
if FontDialog1.Execute then Memo1.Font.Assign(FontDialog1.Font);
Приведенный оператор вызывает диалог выбора атрибутов шрифта и, если пользователь произвел выбор, то значения всех выбранных атрибутов, содержащиеся в свойстве FontDialog1.Font, присваиваются атрибутам окна редактирования, содержащимся в свойстве Memo1.Font. Шрифт в окне редактирования немедленно изменится.
Если вы установите в компоненте FontDialog1 опцию fdApplyButton, то можете написать обработчик события OnApply:
Тогда пользователь может наблюдать изменения в окне Memo1, нажимая в диалоговом окне кнопку Применить и не прерывая диалога. Это очень удобно, так как позволяет пользователю правильно подобрать атрибуты шрифта.
Если в качестве окна редактирования в вашем приложении вы используете RichEdit, то можете предоставить пользователю выбирать атрибуты шрифта для выделенного фрагмента текста или для вновь вводимого текста. Тогда выполнение команды меню Шрифт может осуществляться операторами:
if FontDialog1.Execute then RichEdit1.SelAttributes.Assign(FontDialog1.Font);
Вы можете разрешить пользователю изменять шрифт не только отдельных компонентов, но и всех компонентов и надписей на форме. Это осуществляется оператором:
if FontDialog1.Execute then Font.Assign(FontDialog1.Font);
В этом операторе свойство Font без ссылки на компонент подразумевает шрифт формы.
Компонент ColorDialog вызывает диалоговое окно выбора цвета. В нем пользователь может выбрать цвет из базовой палитры или, нажав кнопку. Определить цвет, раскрыть дополнительную панель, позволяющую синтезировать цвет, отличный от базовых. Синтезированный цвет можно добавить кнопкой. Добавить в набор в палитру дополнительных цветов на левой панели и использовать его в дальнейшем.
Основное свойство компонента ColorDialog — Color. Это свойство соответствует тому цвету, который выбрал в диалоге пользователь. Если при вызове диалога желательно установить некоторое начальное приближение цвета, это можно сделать, установив Color предварительно во время проектирования или программно. Свойство CustomColors типа TStrings позволяет задать заказные цвета дополнительной палитры. Каждый цвет определяется строкой вида
Имена цветов задаются от ColorA (первый цвет) до ColorP (шестнадцатый, последний). Например, строка
задает первый заказной цвет. При задании цвета 2 младших разряда описывают интенсивность красного цвета, следующие 2 — зеленого, старшие — синего.
Свойство Options содержит множество следующих опций:
cdFullOpen | Отображать сразу при открытии диалогового окна панель определения заказных цветов |
cdPreventFullOpen | Запретить появление в диалоговом окне кнопки Определить цвет, так что пользователь не сможет определять новые цвета |
cdShowHelp | Добавить в диалоговое окно кнопку Справка |
cdSolidColor | Указать Windows использовать сплошной цвет, ближайший к выбранному (это обедняет палитру) |
cdAnyColor | Разрешать пользователю выбирать любые не сплошные цвета (такие цвета могут быть не ровными) |
По умолчанию все опции выключены.
Приведем пример применения компонента ColorDialog. Если вы хотите, чтобы пользователь мог задать цвет какого-то объекта, например, цвет фона компонента Memo1, то это можно реализовать оператором
if ColorDialog1.Execute then Memo1.Color := ColorDialog1.Color;
Компонент PrintDialog вызывает диалоговое окно печати, представленное на рис. 8.10. В нем пользователь может выбрать принтер и установить его свойства, указать число копий и последователъность их печати, печатать в файл или непосредственно на принтер, выбрать печатаемые страницы или печатать только выделенный фрагмент.
Компонент PrintDialog не осуществляет печать. Он только позволяет пользователю задать атрибуты печати. А сама печать должна осуществляться программно с помощью объекта Printer или иным путем.
Рассмотренные ранее диалоговые компоненты возвращали одно свойство — имя файла, цвет, или один объект — Font, содержащий множество свойств. В отличие от них компонент PrintDialog возвращает ряд свойств, характеризующих выбранные пользователем установки. Это следующие свойства:
PrintRange | Показывает выбранную пользователем радиокнопку из группы Печатать: prAllPages — выбрана кнопка Все страницы, prSelection — выбрана кнопка Страницы с . по . prPageNums — выбрана кнопка Страницы |
FromPage | Показывает установленную пользователем начальную страницу в окне Страницы с . по . |
ToPage | Показывает установленную пользователем конечную страницу в окне Страницы с . по . |
PrintToFile | Показывает, выбран ли пользователем индикатор Печать в файл |
Copies | Показывает установленное пользователем число копий |
Collate | Показывает, выбран ли пользователем индикатор Разобрать |
Перед вызовом диалога желательно определить, сколько страниц в печатаемом тексте, и задать параметры MaxPage и MinPage — максимальный и минимальный номера страниц. В противном случае пользователю в диалоговом окне не будет доступна кнопка Страницы с . по . Кроме того следует определить множество опций в свойстве Options:
poDisablePrintToFile | Запретить доступ к индикатору Печать в файл. Эта опция работает только при включенной опции poPrintToFile |
poHelp | Отображать в диалоговом окне кнопку Справка. Опция может не работать для некоторых версий Windows 95/98 |
poPageNums | Сделать доступной радиокнопку Страницы, позволяющую пользователю задавать диапазон печатаемых страниц |
poPrintToFile | Отображать в диалоговом окне кнопку Печать в файл |
poSelection | Сделать доступной кнопку Выделение, позволяющую пользователю печатать только выделенный текст |
poWarning | Выдавать замечания, если пользователь пытается послать задачу на неустановленный принтер |
Теперь остановимся на компоненте PrinterSetupDialog, вызывающем диалоговое окно установки принтера. Это единственный диалоговый компонент, не имеющий никаких специфических свойств, которые надо было бы устанавливать или читать. Диалог выполняет операции по установке принтера, на котором будет производиться печать, и задании его свойств. Этот диалог не возвращает никаких параметров.
Компоненты FindDialog и ReplaceDialog, вызывающие диалоги поиска и замены фрагментов текста, очень похожи и имеют одинаковые свойства, кроме одного, задающего заменяющий текст в компоненте ReplaceDialog. Такое сходство не удивительно, поскольку ReplaceDialog — производный класс от FindDialog.
Компоненты имеют следующие основные свойства:
FindText | Текст, заданный пользователем для поиска или замены. Программно может быть установлен как начальное значение, предлагаемое пользователю |
ReplaceText | Только в компоненте ReplaceDialog — текст, который должен заменять FindText |
Position | Позиция левого верхнего угла диалогового окна, заданная типом TPoint — записью, содержащей поля X (экранная координата по горизонтали) и Y (экранная координата по вертикали) |
Left | Координата левого края диалогового окна, то же, что Position.X |
Top | Координата верхнего края диалогового окна, то же, что Position.Y |
Options | Множество опций |
Последний параметр Options — может содержать следующие свойства:
frDisableMatchCase | Делает недоступным индикатор С учетом регистра в диалоговом окне |
frDisableUpDown | Делает недоступными в диалоговом окне кнопки Вверх и Вниз группы Направление, определяющие направление поиска |
frDisableWholeWord | Делает недоступным индикатор Только слово целиком в диалоговом окне |
frDown | Выбирает кнопку Вниз группы Направление при открытии диалогового окна. Если эта опция не установлена, то выбирается кнопка Вверх |
frFindNext | Эта опция включается автоматически, когда пользователь в диалоговом окне щелкает на кнопке Найти далее, и выключается при закрытии диалога |
frHideMatchCase | Удаляет индикатор С учетом регистра из диалогового окна |
frHideWholeWord | Удаляет индикатор Только слово целиком из диалогового окна |
frHideUpDown | Удаляет кнопки Вверх и Вниз из диалогового окна |
frMatchCase | Этот флаг включается и выключается, если пользователь включает и выключает опцию С учетом регистра в диалоговом окне. Можно установить эту опцию по умолчанию во время проектирования, чтобы при открытии диалога она была включена |
frReplace | Применяется только для ReplaceDialog. Этот флаг устанавливается системой, чтобы показать, что текущее (и только текущее) найденное значение FindText должно быть заменено значением ReplaceText |
frReplaceAll | Применяется только для ReplaceDialog. Этот флаг устанавливается системой, чтобы показать, что все найденные значения FindText должны быть заменены значениями ReplaceText |
frShowHelp | Задает отображение кнопки Справка в диалоговом окне |
frWholeWord | Этот флаг включается и выключается, если пользователь включает и выключает опцию Только слово целиком в диалоговом окне. Можно установить эту опцию по умолчанию во время проектирования, чтобы при открытии диалога она была включена |
Сами по себе компоненты FindDialog и ReplaceDialog не осуществляют ни поиска, ни замены. Они только обеспечивают интерфейс с пользователем. А поиск и замену надо осуществлять программно. Для этого можно пользоваться событием OnFind, происходящим, когда пользователь нажал в диалоге кнопку Найти далее, и событием OnReplace, возникающим, если пользователь нажал кнопку Заменить или Заменить все. В событии OnReplace узнать, какую именно кнопку нажал пользователь, можно но значениям флагов frReplace и frReplaceAll.
Поиск заданного фрагмента легко проводить, пользуясь функцией Object Pascal Pos, которая определена в модуле System следующим образом:
function Pos(Substr: string; S: string): Byte;
где S — строка, в которой ищется фрагмент текста, a Substr — искомый фрагмент. Функция возвращает позицию первого символа первого вхождения искомого фрагмента в строку. Если Substr в S не найден, возвращается 0.
Для организации поиска нам потребуется еще две функции: Сору и AnsiLowerCase. Первая из них определена как:
function Copy(S: string; Index, Count: Integer): string;
Она возвращает фрагмент строки S, начинающийся с позиции Index и содержащий число символов, не превышающее Count. Функция AnsiLowerCase, определенная как
function AnsiLowerCase(const S: string): string;
возвращает строку символов S, переведенную в нижний регистр.
Теперь мы можем рассмотреть пример организации поиска. Пусть в вашем приложении имеется компонент Memo1 и при выборе раздела меню MFind вы хотите организовать поиск в тексте, содержащемся в Memo1. Для упрощения задачи исключим опцию поиска только целых слов и опцию поиска вверх от положения курсора.
Программа, реализующая поиск, может иметь следующий вид:
var SPos: integer;procedure TForm1.MFindClick(Sender: TObject);begin SPos := Memo1.SelStart; with FindDialog1 do begin <начальное значение текста поиска — текст, выделенный в Memo1> FindText := Memo1.SelText; Position := Point(Form1.Left, Form1.Top + Memo1.Top + Memo1.Height); <удаление из диалога кнопок «Вверх», «Вниз»,«Только слово целиком»> Options := Options + [frH >= Spos then begin Memo1.SelLength := Length(FindText); SPos := Memo1.SelStart + Memo1.SelLength + 1; end else if MessageDlg( ‘Текст «‘+FindText+'» не найден. Продолжать диалог?’, mtConfirmation, mbYesNoCancel, 0) <> mrYes then CloseDialog; end; Memo1.SetFocus;end;
В программе вводится переменная SPos, сохраняющая позицию, начиная с которой надо проводить поиск.
Процедура MFindClick вызывает диалог, процедура FindDialog1Find обеспечивает поиск с учетом или без учета регистра в зависимости от флага frMatchCase. После нахождения очередного вхождения искомого текста этот текст выделяется в окне Memo1 и управление передается этому окну редактирования. Затем при нажатии пользователем в диалоговом окне кнопки Найти далее, поиск продолжается в оставшейся части текста. Если искомый текст не найден, делается запрос пользователю о продолжении диалога. Если пользователь не ответил на этот запрос положительно, то диалог закрывается методом CloseDialog.
В дополнение к приведенному тексту полезно в обработчики событий OnClick и OnKeyUp компонента Memo1 ввести операторы
Это позволяет пользователю во время диалога изменить положение курсора в окне Memo1. Это новое положение сохранится в переменной SPos и будет использовано при продолжении поиска.
При реализации команды Заменить приведенные выше процедуры можно оставить теми же самыми, заменив в них FindDialog1 на ReplaceDialog1. Дополнительно можно написать процедуру обработки события OnReplace компонента ReplaceDialog1:
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);begin if Memo1.SelText <> » then Memo1.SelText := ReplaceDialog1.ReplaceText; if frReplaceAll in ReplaceDialog1.Options then ReplaceDialog1Find(Self);end;
Этот код производит замену выделенного текста и, если пользователь нажал кнопку Заменить все, то продолжается поиск вызовом уже имеющейся процедуры поиска ReplaceDialog1Find * . Если же пользователь нажал кнопку Заменить, то производится только одна замена и для продолжения поиска пользователь должен нажать кнопку Найти далее.
Предлагаемый алгоритм при нажатии на кнопку Заменить все заменяет только одно значение и находит следующее. На наш взгляд такие действия более логично было бы задать кнопке Заменить, а для Заменить все организовать цикл. Причем такой цикл проще осуществить в процедуре ReplaceDialog1Find. В приведенном ниже коде кроме того введена локальная переменная ss, так как свойству SelStart нельзя присваивать отрицательные значения.
| | следующая лекция ==> | |
Пожарная профилактика при проектировании и строительстве зданий | | | Процесс планирования состоит из |
Дата добавления: 2014-01-07 ; Просмотров: 1764 ; Нарушение авторских прав? ;
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
AnsiLowerCase Routine
Unit Edit
Description Edit
Definition (Delphi 6):
Definition (Delphi 2009, 2010, XE):
Technical Comments Edit
(Known issues / Documentation clarifications / Things to be aware of)
Examples Edit
(Please provide links to articles/source code that show how to use this item.)
See Also Edit
(Please provide links to items specifically related to this item.)
User Comments/Tips Edit
(Please leave your name with your comment.)
Функции Delphi модуля SysUtils
Модуль SysUtils
Предлагаем список функций модуля SysUtils, используемого в среде разработки Delphi.
AnsiCompareStr Сравнение двух строк на равенство
AnsiCompareText Сравнение двух строк на равенство
AnsiLowerCase Символы верхнего регистра изменяются в строку со строчными буквамм
AnsiPos Находит позицию одной строки в другой
ChangeFileExt Изменяет расширение имени файла
CompareStr Сравнивает две строки, чтобы увидеть, какая из них больше
CompareText Сравнивает две строки, игнорируя регистр
CreateDir Создаёт директорию
CurrToStr Преобразует денежную величину в строку
CurrToStrF Преобразует денежную величину в строку с форматированием
Date Возвращает текущую дату
DateTimeToFileDate Преобразует значение TDateTime в формат date/time формат файла
DateTimeToStr Конвертирует значение даты и времени TDateTime в строку
DateToStr Преобразует значение даты TDateTime в строку
DayOfWeek Выдает индекс дня недели для значения TDateTime
DeleteFile Удаляет файл, указанный в параметре
DirectoryExists Возвращает true, если указанная директория существует
DiskFree Выдает число свободных байтов на указанном диске
DiskSize Выдает размер указанного диска в байтах
EncodeDate Формирует значение TDateTime из значений года, месяца и дня
EncodeTime Формирует значение TDateTime из значений часа, минуты, секунды и миллисеккунды
ExtractFileDir Извлекает из полного имени файла название папки
ExtractFileDrive Извлекает из полного имени файла название диска
ExtractFileExt Извлекает из полного имени файла его расширение
ExtractFileName Извлекает из полного имени файла краткое имя файла
ExtractFilePath Извлекает из полного имени файла название патча
FileAge Получение дата/время последнего изменения файла, не открывая его
FileDateToDateTime Конвертирует формат даты/времени файла в значение TDateTime
FileExists Возвращает True если указанный файл существует
FileGetAttr Выдаёт атрибуты файла
FileSearch Поиск файла в одной или более папках
FileSetAttr Устанавливает атрибуты файла
FindClose Закрывает успешный FindFirst поиск файла
FindCmdLineSwitch Определяет, был передан некоторый параметр выключатель
FindFirst Находит все файлы, соответствующие маске файла и атрибутов
FindNext Находит следующий файл после успешного FindFirst
FloatToStr Преобразует значение с плавающей запятой в строку
FloatToStrF Преобразует значение с плавающей запятой в строку с форматированием
ForceDirectories Создаёт новый путь каталогов
Format Богатое форматирование чисел и текста в строке
FormatCurr Богатое форматирование значений валюты в строку
FormatDateTime Богатое форматирование переменной TDateTime в строку
FormatFloat Богатое форматирование числа с плавающей запятой в строку
GetCurrentDir Возвращает текущий каталог (диск плюс каталог)
IncMonth Увеличивает TDateTime переменную на некоторое число месяцев
IntToHex Преобразует целое число в шестнадцатеричную строку
IntToStr Конвертирует целое число в строку
IsLeapYear Возвращает True, если данный календарный год високосный
LastDelimiter Находит последнюю позицию указанных символов в строке
LowerCase Изменяет символы верхнего регистра в строке в строчные буквы
Now Выдает текущую дату и время
RemoveDir Позволяет удалить директорию
Rename Переименовка фала
RenameFile Переименование файла или директории
SetCurrentDir Изменяет текущую директорию
StrScan Ищет заданные символы в строке
StrToCurr Преобразует числовую строку в денежное выражение
StrToDate Конвертирует строку с датой в значение типа TDateTime
StrToDateTime Конвертирует строку с датой и временем в значение типа TDateTime
StrToFloat Преобразует числовую строку в значение с плавающей запятой
StrToInt Преобразует строку с целым значением в Integer
StrToInt64 Преобразует строку с целым значением в Int64
StrToInt64Def Преобразует строку с целым значением в Int64, учитывая значение по умолчанию
StrToIntDef Преобразует строку с значение с типом Integer, учитывая значение по умолчанию
Time Возвращает текущее время
TimeToStr Конвертирует значение времени типа TDateTime в строку
Trim Удаляет начальные и конечные пробелы в строке
TrimLeft Удаляет начальные пробелы в строке
TrimRight Удаляет конечные пробелы в строке
UpperCase Изменяет символы в строке из нижнего регистра в верхний
WrapText Добавьте перенос строки в строку, чтобы имитировать перенос слов
Abort Прерывает обработку команд и выходит к последнему исключительному блоку
AppendStr Конкатенация одной строки в конец другой
Beep Делает звук гудка
DateTimeToString Огромные возможности форматирования даты в строку
DecodeDate Извлекает значения года, месяца, дня из TDateTime переменной
DecodeDateTime Разбивает TDateTime переменную на ее части даты/времени
DecodeTime Разбивает значение TDateTime на отдельные значения времени
FreeAndNil Освобождение памяти объекта и установка его в nil
FreeMem Освобождает память, используемую переменной
GetLocaleFormatSettings Получает региональные значения для безопасных потоков функций.
ReplaceDate Изменяет только часть даты TDateTime переменной
ReplaceTime Изменяет только часть времени TDateTime переменной
AnsiLowerCase — Функция Delphi
Полную версию библиотеки KOL и MCK можно скачать здесь.
function AnsiEq( const S1, S2: String ): Boolean;
Возвращает true, если AnsiLowerCase(S1) = AnsiLowerCase(S2) т.е сравнивает 2 строки без учета регистра. Данная функция подойдет только для русских символов. function DelimiterLast( const Str, Delimiters: String ): Integer;
Функция ищет в строке Str последнее вхождение строки Delimiters и возвращает номер символа с которого он идет. Если Delimiters не найден возвращается длина Str.
function AnsiUpperCase( const S: string ): string;
Преобразует символы в строке S к верхнему регистру.
function AnsiLowerCase( const S: string ): string;
Преобразует символы в строке S к нижнему регистру.
function AnsiCompareStr( const S1, S2: string ): Integer;
Сравнивает две строки ANSI S1 и S2 без учета регистра. Возвращает значение 0, если S1 > S2.
function _AnsiCompareStr( S1, S2: PChar ): Integer;
Аналог AnsiCompareStr только для PChar.
function CopyEnd( const S: String; Idx: Integer ): String;
Копирует строку из строки S с Idx символа до последнего
function CopyTail( const S: String; Len: Integer ): String;
Возвращает последние Len символа из строки S. Если Len > Length( S ), возвращается вся строка S.
procedure DeleteTail( var S: String; Len: Integer );
Удаляет последние Len символа из строки.
function LowerCase( const S: string ): string;
Преобразует символы в строке S к нижнему регистру. Только для латинских символов.
procedure NormalizeUnixText( var S: String );
В строке S происходит замена всех символов #10 на символ #13
function IndexOfChar( const S: String; Chr: Char ): Integer;
Возвращает положение символа Chr в строке S. Возвращаемое значение может быть то 1 до Length(S), если возвращается -1 то символ не найден.
function IndexOfCharsMin( const S, Chars: String ): Integer;
Возвращает положение ближайшего от начала(строки) символа Chr в строке S. Если возвращается -1 то символ не найден.
function IndexOfStr( const S, Sub: String ): Integer;
Возвращает положение строки Sub в строке S. Возвращаемое значение может быть то 1 до Length(S)-Length(Sub), если возвращается -1 то строка не найдена.
function Parse( var S: String; const Separators: String ): String;
Функция ищет в строке S строку Separators и возвращает все что шло до этого разделителя (т.е. до Separators). В строке S удаляется возвращаемая часть и найденный Separators.
Т.е. если S= ‘1-2-3’,а Separators= ‘-‘ то при первом вызове на выходе ‘1’ , а S=’2-3′
Если в S нет Separators то возвращаемое значение рано S, а сама S становится пуcтой.
function StrEq( const S1, S2: String ): Boolean;
Возвращает true, если LowerCase(S1) = LowerCase(S2) т.е сравнивает 2 строки без учета регистра. Данная функция подойдет только для латинских символов.
function StrIn( const S: String; A: array of String ): Boolean;
Функция возвращает True если в одна из строк массива А равна строке S. Спавнение идет с помощью функции StrEq поэтому оно не чуствительно к регистру букв.
function StrSatisfy( const S, Mask: String ): Boolean;
Возвращает True если строка S соответствует маске Mask. Строка Mask может содержать символ ‘*’ (любое количество любых символов) и ‘?’ (один любой символ). Например чтобы проверить содержит ли S адрес почты надо :
StrSatisfy(S,’*@*.*’);
function StrReplace( var S: String; const From, ReplTo: String ): Boolean;
Производит замену в строке S первой встреченной строки From на строку ReplTo. Если замена произошла успешно возвращает True.
function StrPCopy( Dest: PChar; const Source: string ): PChar;
Копирует паскалевскую строку в строку типа PChar
function StrLCopy( Dest: PChar; const Source: PChar; MaxLen: Cardinal ): PChar;
Копирует первые MaxLen символов из паскалевсокой строки в строку типа PChar.
function StrComp( const Str1, Str2: PChar ): Integer;
Быстрое сравнение 2-х строк. На выходе -1: Str1 Str2
function StrLComp( const Str1, Str2: PChar; MaxLen: Cardinal ): Integer;
Сравнивает до MaxLen символов двух строк Str1 и Str2 с учетом регистра. Возвращает значение 0, если Str1 > Str2.
function StrCopy( Dest, Source: PChar ): PChar;
Функция производит быстрое копирование строки Source в Dest и возвращает Dest.
function StrLen( const Str: PChar ): Cardinal;
Функция возвращает число символов в строке Str, не учитывая конечного нулевого символа.
function StrScanLen( Str: PChar; Chr: Char; Len: Integer ): PChar;
Быстрое сканирование строки Str длиной Len на нахождение в нем первого символа Chr . Если Chr не входит в Str, возвращается nil.
function StrScan( Str: PChar; Chr: Char ): PChar;
Полный аналог предыдущей функции только сканирование происходит всей строки Str до последнего символа.
function StrRScan( const Str: PChar; Chr: Char ): PChar;
Возвращает указатель на последнее вхождение символа Chr в строку Str. Если Chr не входит в Str, возвращается nil.
function StrIsStartingFrom( Str, Pattern: PChar ): Boolean;
Возвращает True если строка Str начинается со строки Pattern, то есть если Copy( Str, 1, StrLen( Pattern ) ) = Pattern
procedure Str2LowerCase( S: PChar );
Переводит символы в нуль-терминальной строке в верхней регистр.
function TrimLeft( const S: string ): string;
Удаляет из начала строки S пробелы и управляющие символы
function TrimRight( const S: string ): string;
Удаляет в конца строки S пробелы и управляющие символы.
function Trim( const S: string ): string;
Удаляет в конца и в начале строки S пробелы и управляющие символы.
function UpperCase( const S: string ): string;
Преобразует символы в строке S к верхнему регистру. Только для латинских символов.
function WStrReplace( var S: WideString; const From, ReplTo: WideString ): Boolean;
Производит замену в строке S первой встреченной строки From на строку ReplTo. Если замена произошла успешно возвращает True. Анналог функции StrReplace только для WideString (поэтому в Delphi 2 не будет)
function WStrLen( W: PWideChar ): Integer;
Возвращает длину строки типа PWideChar.
procedure WStrCopy( Dest, Src: PWideChar );
Копирует строку Dest тип PWideChar в Src
function WStrCmp( W1, W2: PWideChar ): Integer;
Сравнивает 2-е строки тип PWideChar. На выходе тоже что и у StrComp
function Clipboard2Text: String;
Возвращает из буфера обмена текст.
function Text2Clipboard( const S: String ): Boolean;
Помещает в буфер обмена текст
DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники
Процедуры и функции для работы со строками в Delphi
Строки очень часто используются в программах — хотя бы для вывода различных сообщений пользователю, чтобы он не заблудился в интерфейсе. Ну, для таких простых случаев вполне достаточно тех сведений, которые вы получили на уроке, посвящённом строкам. Если же у вас более серьёзные намерения и вы хотите манипулировать строками по своему желанию (например, вы пишете какую-нибудь словесную игру вроде Балды или Логогрифов), то в Delphi найдётся всё нужное и для таких любителей словесности и жонглирования приставками и суффиксами.
Для определённости в примерах будем считать, что
Когда мы изучали простые операции со строками, то рассматривали конкатенацию строк с помощью оператора +. Но объединить две строки можно и функцией
которая возвращает «сумму» двух строк:
Для сравнения строк вместо операторов отношения можно использовать следующие функции.
Обе функции сравнивают строки s1 и s2. Первая — с учётом регистра букв (прописные/строчные), вторая — без учёта.
Эти функции возвращают значение
0, если строки равны;
Их нельзя применять к русским словам, поэтому лучше пользоваться функциями:
которые одинаково хорошо работают и с латинскими, и с русскими буквами.
Теперь перейдём к процедурам и функциям, которые выполняют со словами более сложные действия.
Довольно часто нужно преобразовать все буквы слова либо к верхнему, либо к нижнему регистру. Если слова состоят только из латинских букв, то можно использовать функции:
Первая переводит слова в нижний регистр (строчные буквы), вторая — в верхний (прописные буквы). Для русских ( и для латинских ) букв годятся функции :
Функция AnsiLowerCase (S1) вернёт строку «смородина».
Функция AnsiUpperCase (’смородина’) вернёт строку «СМОРОДИНА».
Процедуры вывода сообщений на экран (обычно в метку или список) требуют в качестве параметра строку, а что делать, если нужно предъявить пользователю число? — Преобразовать число в строку! Это можно сделать и самостоятельно, но гораздо удобнее воспользоваться встроенными функциями Delphi.
Чаще других в программах применяют функции для преобразования целых чисел в строку:
Например, IntToStr (1234) вернёт строку «1234».
Для действительных чисел тоже имеется подобная функция
Если вы хотите узнать, как десятичное число записывается в 16-ричной системе счисления, примените к нему функции:
Например, IntToHex (12 34, вернёт строку «000004D2», а IntToHex (2009, 4) — строку «07D9».
Второй параметр — Digits — задаёт число цифр в 16-ричном числе.
При вводе данных из файла или некоторых компонентов вместо числа мы получаем строку символов. И хотя она состоит из цифр, это не число. В этом случае поможет функция
Причём строка S может содержать не только десятичное, но и 16-ричное число.
Например, функции StrToInt(’$07D9’) и StrToInt(’2009’) вернут одно и то же число 2009.
Однако эта функция «опасна»: если в строке обнаружится хотя бы один неверный символ, возникнет ошибка. Если у вас есть обоснованные сомнения в правильности строки, лучше обратиться к надёжной функции
Она возвращает TRUE, если строка преобразована в число без ошибок, и FALSE, если с ошибками. Переменная Value (в нашем примере i) хранит число.
В примере строка ‘$07D9s’ содержит неверный символ «s», поэтому функция вернёт FALSE и строку печатать не нужно (на самом деле значение переменной i будет равно 2009, так как функция успеет конвертировать первые символы строки — до первой «нецифры»).
Так же можно использовать и процедуру:
V — переменная целого или действительного типа.
Code — переменная целого типа, в которой возвращается номер ошибочного символа в строке. Если таких символов нет, то значение этой переменной будет равно нулю.
В результате выполнения этого примера будет напечатано число 2009.
Этот код также напечатает число 2009, но значение переменной i будет равно не нулю, как в первом случае, а 6, так как шестой символ строки не является 16-ричной цифрой.
Аналогичные функции для вещественных чисел:
В начале и/или конце строки могут присутствовать ненужные пробелы. От них легко избавиться , применив функции
Первая удаляет начальные пробелы, вторая — конечные, третья — и те, и другие. Эти функции возвращают новую строку — уже без пробелов.
Узнать длину строки (число символов в ней) можно с помощью функции
Например , Length (S1) вернёт 9, а Length(S2) — 7.
Ну, а теперь — самые интересные процедуры и функции!
Удаляем часть строки S от символа номер Index:
Здесь Count — число удаляемых символов.
Например, после выполнения процедуры:
строка si будет иметь значение «РОДИНА».
А после процедуры delete(s2,5,3); строка s2 будет урезана до «ПАРА».
Если значение переменной Index меньше единицы или больше длины строки, то строка останется без изменений. Ничего не случится со строкой и если Count меньше единицы.
Если же Count больше, чем число символов в строке, начиная с Index, то будут удалены все символы до конца строки.
Процедура Insert действует противоположно — она вставляет подстроку Substr в строку Dest после символа номер Index:
Например, после выполнения процедуры insert (’З’, s1,6); строка s1 превратится в смешное слово «СМОРОЗДИНА».
А процедура insert (’КА’, s2,8); позволит нам насладиться неологизнеологизмом «ПАРАШЮТКА».
Если же мы не хотим портить исходную строку, как это делает процедура Delete, то можем создать новую строку, вырезав из любой строки нужный нам кусок:
Например, строка s примет значение «ПАРА» после выполнения функции s:=copy(s2,1,4);
Обратите внимание: чтобы получить то же самое слово, что и в примере с delete(s2,5,3);, мы указали другие значение параметров в вызове функции!
Функция copy (s1,4,9) вернёт в переменную s слово «РОДИНА».
И последняя функция находит позицию подстроки substr в строке str. function Pos(const substr: string; const str: string): Integer;
Если в строке искомая подстрока встречается несколько раз, то первый вызов функции Pos вернёт позицию первого вхождения, после чего поиск нужно продолжить со следующей позиции. Например, в слове ФЕЛЬДФЕБЕЛЬ так можно найти обе «ели».
Если же подстроки в строке нет, то вернётся безнадёжный ноль!
Компоненты Delphi для работы с файлами
Читайте также:
- II. Основные направления социально-медицинской работы с семьями детей ограниченными возможностями
- III. Лекционный материал по теме: ПРАВИЛА РАБОТЫ НА ЛЕКЦИИ
- IX. Лекционный материал: ОРГАНИЗАЦИЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
- N В условиях интенсивной мышечной работы, при гипоксии (например, интенсивный бег на 200м в течении 30 с) распад углеводов временно протекает в анаэробных условиях
- VIII. Принципы работы вычислительной системы
- XIII. Файловая структура ОС. Операции с файлами
- Автоматизация группы работы приточных систем
- Алгоритм работы при соединении двух FTP-серверов, ни один из которых не расположен на локальном хосте пользователя.
- Алгоритм работы с группами общественности.
- Алюминиевые сплавы, их свойства и особенности работы
- Анализ ритмичности и сезонности работы предприятия
- Анализ стратегий работы с сопротивлением
В приложениях часто приходится выполнять стандартные действия: открывать и сохранять файлы, задавать атрибуты шрифтов, выбирать цвета палитры, производить контекстный поиск и замену и т.п.
Разработчики Delphi позаботились о том, чтобы включить в библиотеку простые для использования компоненты, реализующие соответствующие диалоговые окна. Они размещены на странице Dialogs. В таблице приведен перечень этих диалогов.
Компонент | Страница | Описание |
OpenDialog «Открыть файл» | Dialogs | Предназначен для создания окна диалога «Открыть файл». |
SaveDialog «Сохранить файл» | Dialogs | Предназначен для создания окна диалога «Сохранить файл как». |
OpenPictureDialog «Открыть рисунок» | Dialogs | Предназначен для создания окна диалога «Открыть рисунок», открывающего графический файл. Начиная с Delphi 3. |
SavePictureDialog «Сохранить рисунок» | Dialogs | Предназначен для создания окна диалога «Сохранить рисунок» — сохранение изображения в графическом файле. Начиная с Delphi 3. |
FontDialog «Шрифты» | Dialogs | Предназначен для создания окна диалога «Шрифты» — выбор атрибутов шрифта. |
ColorDialog «Цвет» | Dialogs | Предназначен для создания окна диалога «Цвет» — выбор цвета. |
PrintDialog «Печать» | Dialogs | Предназначен для создания окна диалога «Печать». |
PrinterSetupDialog «Установка принтера» | Dialogs | Предназначен для создания окна диалога «Установка принтера». |
FindDialog «Найти» | Dialogs | Предназначен для создания окна диалога «Найти» — контекстный поиск в тексте. |
ReplaceDialog «Заменить» | Dialogs | Предназначен для создания окна диалога «Заменить» — контекстная замена фрагментов текста. |
FileListBox (список файлов) | Win3.1 | Отображает список всех файлов каталога. |
DirectoryListBox (структура каталогов) | Win3.1 | Отображает структуру каталогов диска. |
DriveComboBox (список дисков) | Win3.1 | Выпадающий список доступных дисков. |
FilterComboBox (список фильтров) | Win3.1 | Выпадающий список фильтров для поиска файлов. |
DirectoryOutline (дерево каталогов) | Samples | Пример компонента, используемого для отображения структуры каталогов выбранного диска. |
Последние четыре компонента в таблице являются не законченными диалогами, а их фрагментами, позволяющими строить свои собственные диалоговые окна.
Все диалоги являются невизуальными компонентами, так что место их размещения на форме не имеет значения. При обращении к этим компонентам вызываются стандартные диалоги, вид которых зависит от версии Windows и настройки системы. Так что при запуске одного и того же приложения на компьютерах с разными системами диалоги будут выглядеть по-разному. Например, при русифицированной версии Windows все их надписи будут русскими, а при англоязычной версии надписи будут на английском языке.
Основной метод, которым производится обращение к любому диалогу, — Execute. Эта функция открывает диалоговое окно и, если пользователь произвел в нем какой-то выбор, то функция возвращает true. При этом в свойствах компонента-диалога запоминается выбор пользователя, который можно прочитать и использовать в дальнейших операциях. Если же пользователь в диалоге нажал кнопку Отмена или клавишу Esc, то функция Execute возвращает false. Поэтому стандартное обращение к диалогу имеет вид:
if .Execute then ;
Компоненты OpenDialog — диалог «Открыть файл» и SaveDialog — диалог «Сохранить файл как. », пожалуй, используются чаще всего, в большинстве приложений.
Все свойства этих компонентов одинаковы, только их смысл несколько различен для открытия и закрытия файлов. Основное свойство, в котором возвращается в виде строки выбранный пользователем файл, — FileName. Значение этого свойства можно задать и перед обращением к диалогу. Тогда оно появится в диалоге как значение по умолчанию в окне Имя файла
Типы искомых файлов, появляющиеся в диалоге в выпадающем списке Тип файла, задаются свойством Filter. В процессе проектирования это свойство проще всего задать с помощью редактора фильтров, который вызывается нажатием кнопки с многоточием около имени этого свойства в Инспекторе Объектов. При этом открывается окно редактора В его левой панели Filter Name вы записываете тот текст, который увидит пользователь в выпадающем списке Тип файла диалога. А в правой панели Filter записываются разделенные точками с запятой шаблоны фильтра.
После выхода из окна редактирования фильтров заданные вами шаблоны появятся в свойстве Filter в виде строки вида:
текстовые (*.txt, *.doc)|*.txt; *.doc|все файлы|*.*
В этой строке тексты и шаблоны разделяются вертикальными линиями. В аналогичном виде, если требуется, можно задавать свойство Filter программно во время выполнения приложения.
Свойство FilterIndex определяет номер фильтра, который будет по умолчанию показан пользователю в момент открытия диалога. Например, значение FilterIndex = 1 задает по умолчанию первый фильтр.
Свойство InitialDir определяет начальный каталог, который будет открыт в момент начала работы пользователя с диалогом. Если значение этого свойства не задано, то открывается текущий каталог или тот, который был открыт при последнем обращении пользователя к соответствующему диалогу в процессе выполнения данного приложения.
Свойство DefaultExt определяет значение расширения файла по умолчанию. Если значение этого свойства не задано, пользователь должен указать в диалоге полное имя файла с расширением. Если же задать значение DefaultExt, то пользователь может писать в диалоге имя без расширения. В этом случае будет принято заданное расширение.
Свойство Title позволяет вам задать заголовок диалогового окна. Если это свойство не задано, окно открывается с заголовком, определенным в системе. Но вы можете задать и свой заголовок, подсказывающий пользователю ожидаемые действия. Например, «Укажите имя открываемого файла».
Свойство Options определяет условия выбора файла. Множество опций, которые вы можете установить программно или во время проектирования, включает:
ofAllowMultiSelect | Позволяет пользователю выбирать несколько файлов |
ofCreatePrompt | В случае, если пользователь написал имя несуществующего файла, появляется замечание и запрос, надо ли создать файл с заданным именем |
ofEnableIncludeNotify | Разрешает посылать в диалог сообщения |
ofEnableSizing | Разрешает пользователю изменять размер диалогового окна |
ofExtensionDifferent | Этот флаг, который можно прочитать после выполнения диалога, показывает, что расширение файла, выбранного пользователем, отличается от DefaultExt |
ofFileMustExist | В случае, если пользователь написал имя несуществующего файла, появляется сообщение об ошибке |
ofHideReadOnly | Удаляет из диалога индикатор Открыть только для чтения |
ofNoChangeDir | После щелчка пользователя на кнопке OK восстанавливает текущий каталог, независимо от того, какой каталог был открыт при поиске файла |
ofNoDereferenceLinks | Запрещает переназначать клавиши быстрого доступа в диалоговом окне |
ofNoLongNames | Отображаются только не более 8 символов имени и трех символов расширения |
ofNoNetworkButton | Убирает из диалогового окна кнопку поиска в сети. Действует только если флаг ofOldStyleDialog включен |
ofNoReadOnlyReturn | Если пользователь выбрал файл только для чтения, то генерируется сообщение об ошибке |
ofNoTestFileCreate | Запрещает выбор в сети защищенных файлов и не доступных дисков при сохранении файла |
ofNoValidate | Не позволяет писать в именах файлов неразрешенные символы, но не мешает выбирать файлы с неразрешенными символами |
ofOldStyleDialog | Создает диалог выбора файла в старом стиле (см. рис. 8.4) |
ofOverwritePrompt | В случае, если при сохранении файла пользователь написал имя существующего файла, появляется замечание, что файл с таким именем существует, и запрашивается желание пользователя переписать существующий файл |
ofPathMustExist | Генерирует сообщение об ошибке, если пользователь указал в имени файла несуществующий каталог |
ofReadOnly | По умолчанию устанавливает индикатор Открыть только для чтения при открытии диалога |
ofShareAware | Игнорирует ошибки нарушения условий коллективного доступа и разрешает, несмотря на них, производить выбор файла |
ofShowHelp | Отображает в диалоговом окне кнопку Справка |
По умолчанию все перечисленные опции, кроме ofHideReadOnly, выключены. Но, как видно из их описания, многие из них полезно включить перед вызовом диалогов.
Если вы разрешаете с помощью опции ofAllowMultiSelect множественный выбор файлов, то список выбранных файлов можно прочитать в свойстве Files типа TStrings.
В приведенной таблице даны опции, используемые в 32-разрядных версиях Delphi. В Delphi 1 диалоговое окно имеет вид, представленный на рис. 8.4. Аналогичный вид имеет диалог и в 32-разрядных версиях Delphi при включении опции ofOldStyleDialog.
В компонентах диалогов открытия и сохранения файлов предусмотрена возможность обработки ряда событий. Такая обработка может потребоваться, если рассмотренных опций, несмотря на их количество, не хватает, чтобы установить все диктуемые конкретным приложением ограничения на выбор файлов. Событие OnCanClose возникает при нормальном закрытии пользователем диалогового окна после выбора файла. При отказе пользователя от диалога — нажатии кнопки Отмена, клавиши Esc и т.д. событие OnCanClose не наступает. В обработке события OnCanClose вы можете произвести дополнительные проверки выбранного пользователем файла и, если по условиям вашей задачи этот выбор недопустим, вы можете известить об этом пользователя и задать значение false передаваемому в обработчик параметру CanClose. Это не позволит пользователю закрыть диалоговое окно.
Можно также написать обработчики событий OnFolderChange — изменение каталога, OnSelectionChange — изменение имени файла, OnTypeChange — изменение типа файла. В этих обработчиках вы можете предусмотреть какие-то сообщения пользователю.
Теперь приведем примеры использования диалогов OpenDialog и SaveDialog. Пусть ваше приложение включает окно редактирования Memo1, в которое по команде меню Открыть вы хотите загружать текстовый файл, а после каких-то изменений, сделанных пользователем, — сохранять по команде Сохранить текст в том же файле, а по команде Сохранить как. — в файле с другим именем.
Введите на форму компоненты — диалоги OpenDialog и SaveDialog. Предположим, что вы оставили их имена по умолчанию — OpenDialog1 и SaveDialog1. Поскольку после чтения файла вам надо запомнить его имя, чтобы знать под каким именем потом его сохранять, вы можете определить для этого имени переменную, назвав ее, например, FName:
var FName: string;
Тогда обработка команды Открыть может сводиться к следующему оператору:
if OpenDialog1.Execute then begin FName := OpenDialog1.FileName; Memo1.Lines.LoadFromFile(FName); end;
Этот оператор вызывает диалог, проверяет, выбрал ли пользователь файл (если выбрал, то функция Execute возвращает true), после чего имя выбранного файла (OpenDialog1.FileName) сохраняется в переменной FName и файл загружается в текст Memo1 методом LoadFromFile.
Обработка команды Сохранить выполняется оператором
В данном случае нет необходимости обращаться к какому-то диалогу, поскольку имя файла известно: оно хранится в переменной FName.
Обработка команды Сохранить как. выполняется операторами:
SaveDialog1.FileName := FName;if SaveDialog1.Execute then begin FName := SaveDialog1.FileName; Memo1.Lines.SaveToFile(FName); end;
Первый из этих операторов присваивает свойству FileName компонента SaveDialog1 запомненное имя файла. Это имя по умолчанию будет предложено пользователю при открытии диалога Сохранить как. Следующий оператор открывает диалог и, если пользователь выбрал в нем файл, запоминает новое имя файла и сохраняет в файле с этим именем текст компонента Memo1.
Мы рассмотрели диалоги открытия и сохранения файлов произвольного типа. Начиная с Delphi 3 в библиотеке имеются специализированные диалоги открытия и закрытия графических файлов: OpenPictureDialog и SavePictureDialog. Диалоговые окна, открываемые этими файлами. От окон, открываемых компонентами OpenDialog и SaveDialog, они отличаются удобной возможностью просматривать изображения в процессе выбора файла.
Свойства компонентов OpenPictureDialog и SavePictureDialog ничем не отличаются от свойств компонентов OpenDialog и SaveDialog. Единственное отличие — заданное значение по умолчанию свойства Filter в OpenPictureDialog и SavePictureDialog. В этих компонентах заданы следующие фильтры:
All (*.jpg; *.jpeg; *.bmp; *.ico; *.emf; *.wmf) | *.jpg; *.jpeg; *.bmp; *.ico; *.emf; *.wmf |
JPEG Image File (*.jpg) | *.jpg |
JPEG Image File (*.jpeg) | *.jpeg |
Bitmaps (*.bmp) | *.bmp |
Icons (*.ico) | *.ico |
Enhanced Metafiles (*.emf) | *.emf |
Metafiles (*.wmf) | *.wmf |
В этих фильтрах перечислены все типы графических файлов, с которыми может работать диалог. Так что вам остается удалить, если хотите, фильтры тех файлов, с которыми вы не хотите работать, добавить, может быть, фильтр «Все файлы (*.*)» и перевести на русский язык названия типов.
Компонент FontDialog вызывает диалоговое окно выбора атрибутов шрифта. В нем пользователь может выбрать имя шрифта, его стиль (начертание), размер и другие атрибуты.
Основное свойство компонента — Font типа TFont, в котором вы можете задать при желании начальные установки атрибутов шрифта и в котором вы можете прочесть значения атрибутов, выбранные пользователем в процессе диалога.
Свойства MaxFontSize и MinFontSize устанавливают ограничения на максимальный и минимальный размеры шрифта. Если значения этих свойств равны 0 (по умолчанию), то никакие ограничения на размер не накладываются. Если же значения свойств заданы (обычно это целесообразно делать исходя из размеров компонента приложения, для которого выбирается шрифт), то в списке Размер диалогового окна появляются только размеры, укладывающиеся в заданный диапазон. При попытке пользователя задать недопустимый размер ему будет выдано предупреждение вида «Размер должен лежать в интервале . » и выбор пользователя отменится. Свойства MaxFontSize и MinFontSize действуют только при включенной опции fdLimitSize (см. ниже).
Свойство Device определяет, из какого списка возможных шрифтов будет предложен выбор в диалоговом окне: fdScreen — из списка экрана (по умолчанию), fdPrinter — из списка принтера, fdBoth — из обоих.
Свойство Options содержит множество опций:
fdAnsiOnly | Отображать только множество шрифтов символов Windows, не отображать шрифтов со специальными символами |
fdApplyButton | Отображать в диалоге кнопку Применить независимо от того, предусмотрен ли обработчик события OnApply |
fdEffects | Отображать в диалоге индикаторы специальных эффектов (подчеркивание и др.) и список Цвет |
fdFixedPitchOnly | Отображать только шрифты с постоянной шириной символов |
fdForceFontExist | Позволять пользователю выбирать шрифты только из списка, запрещать ему вводить другие имена |
fdLimitSize | Разрешить использовать свойства MaxFontSize и MinFontSize, ограничивающие размеры шрифта |
fdNoFaceSel | Открывать диалоговое окно без предварительно установленного имени шрифта |
fdNoOEMFonts | Удалять из списка шрифтов шрифты OEM |
fdScalableOnly | Отображать только масштабируемые шрифты, удалять из списка не масштабируемые (шрифты bitmap) |
fdNoSimulations | Отображать только шрифты и их начертания, напрямую поддерживаемые файлами, не отображая шрифты, в которых жирный стиль и курсив синтезируется |
fdNoSizeSel | Открывать диалоговое окно без предварительно установленного размера шрифта |
fdNoStyleSel | Открывать диалоговое окно без предварительно установленного начертания шрифта |
fdNoVectorFonts | Удалять из списка векторные шрифты (типа Roman или Script для Windows 1.0) |
fdShowHelp | Отображать в диалоговом окне кнопку Справка |
fdTrueTypeOnly | Предлагать в списке только шрифты TrueType |
fdWysiwyg | Предлагать в списке только шрифты, доступные и для экрана, и для принтера, удаляя из него аппаратно зависимые шрифты |
По умолчанию все эти опции, кроме fdEffects, отключены.
Если установить опцию fdApplyButton, то при нажатии пользователем кнопки. Применить возникает событие OnApply, в обработчике которого вы можете написать код, который применит выбранные пользователем атрибуты, не закрывая диалогового окна.
Приведем примеры применения компонента FontDialog. Пусть ваше приложение включает окно редактирования Memo1, шрифт в котором пользователь может выбирать командой меню Шрифт. Вы ввели в приложение компонент FontDialog, имя которого по умолчанию FontDialog1. Тогда обработчик команды Шрифт может иметь вид:
if FontDialog1.Execute then Memo1.Font.Assign(FontDialog1.Font);
Приведенный оператор вызывает диалог выбора атрибутов шрифта и, если пользователь произвел выбор, то значения всех выбранных атрибутов, содержащиеся в свойстве FontDialog1.Font, присваиваются атрибутам окна редактирования, содержащимся в свойстве Memo1.Font. Шрифт в окне редактирования немедленно изменится.
Если вы установите в компоненте FontDialog1 опцию fdApplyButton, то можете написать обработчик события OnApply:
Тогда пользователь может наблюдать изменения в окне Memo1, нажимая в диалоговом окне кнопку Применить и не прерывая диалога. Это очень удобно, так как позволяет пользователю правильно подобрать атрибуты шрифта.
Если в качестве окна редактирования в вашем приложении вы используете RichEdit, то можете предоставить пользователю выбирать атрибуты шрифта для выделенного фрагмента текста или для вновь вводимого текста. Тогда выполнение команды меню Шрифт может осуществляться операторами:
if FontDialog1.Execute then RichEdit1.SelAttributes.Assign(FontDialog1.Font);
Вы можете разрешить пользователю изменять шрифт не только отдельных компонентов, но и всех компонентов и надписей на форме. Это осуществляется оператором:
if FontDialog1.Execute then Font.Assign(FontDialog1.Font);
В этом операторе свойство Font без ссылки на компонент подразумевает шрифт формы.
Компонент ColorDialog вызывает диалоговое окно выбора цвета. В нем пользователь может выбрать цвет из базовой палитры или, нажав кнопку. Определить цвет, раскрыть дополнительную панель, позволяющую синтезировать цвет, отличный от базовых. Синтезированный цвет можно добавить кнопкой. Добавить в набор в палитру дополнительных цветов на левой панели и использовать его в дальнейшем.
Основное свойство компонента ColorDialog — Color. Это свойство соответствует тому цвету, который выбрал в диалоге пользователь. Если при вызове диалога желательно установить некоторое начальное приближение цвета, это можно сделать, установив Color предварительно во время проектирования или программно. Свойство CustomColors типа TStrings позволяет задать заказные цвета дополнительной палитры. Каждый цвет определяется строкой вида
Имена цветов задаются от ColorA (первый цвет) до ColorP (шестнадцатый, последний). Например, строка
задает первый заказной цвет. При задании цвета 2 младших разряда описывают интенсивность красного цвета, следующие 2 — зеленого, старшие — синего.
Свойство Options содержит множество следующих опций:
cdFullOpen | Отображать сразу при открытии диалогового окна панель определения заказных цветов |
cdPreventFullOpen | Запретить появление в диалоговом окне кнопки Определить цвет, так что пользователь не сможет определять новые цвета |
cdShowHelp | Добавить в диалоговое окно кнопку Справка |
cdSolidColor | Указать Windows использовать сплошной цвет, ближайший к выбранному (это обедняет палитру) |
cdAnyColor | Разрешать пользователю выбирать любые не сплошные цвета (такие цвета могут быть не ровными) |
По умолчанию все опции выключены.
Приведем пример применения компонента ColorDialog. Если вы хотите, чтобы пользователь мог задать цвет какого-то объекта, например, цвет фона компонента Memo1, то это можно реализовать оператором
if ColorDialog1.Execute then Memo1.Color := ColorDialog1.Color;
Компонент PrintDialog вызывает диалоговое окно печати, представленное на рис. 8.10. В нем пользователь может выбрать принтер и установить его свойства, указать число копий и последователъность их печати, печатать в файл или непосредственно на принтер, выбрать печатаемые страницы или печатать только выделенный фрагмент.
Компонент PrintDialog не осуществляет печать. Он только позволяет пользователю задать атрибуты печати. А сама печать должна осуществляться программно с помощью объекта Printer или иным путем.
Рассмотренные ранее диалоговые компоненты возвращали одно свойство — имя файла, цвет, или один объект — Font, содержащий множество свойств. В отличие от них компонент PrintDialog возвращает ряд свойств, характеризующих выбранные пользователем установки. Это следующие свойства:
PrintRange | Показывает выбранную пользователем радиокнопку из группы Печатать: prAllPages — выбрана кнопка Все страницы, prSelection — выбрана кнопка Страницы с . по . prPageNums — выбрана кнопка Страницы |
FromPage | Показывает установленную пользователем начальную страницу в окне Страницы с . по . |
ToPage | Показывает установленную пользователем конечную страницу в окне Страницы с . по . |
PrintToFile | Показывает, выбран ли пользователем индикатор Печать в файл |
Copies | Показывает установленное пользователем число копий |
Collate | Показывает, выбран ли пользователем индикатор Разобрать |
Перед вызовом диалога желательно определить, сколько страниц в печатаемом тексте, и задать параметры MaxPage и MinPage — максимальный и минимальный номера страниц. В противном случае пользователю в диалоговом окне не будет доступна кнопка Страницы с . по . Кроме того следует определить множество опций в свойстве Options:
poDisablePrintToFile | Запретить доступ к индикатору Печать в файл. Эта опция работает только при включенной опции poPrintToFile |
poHelp | Отображать в диалоговом окне кнопку Справка. Опция может не работать для некоторых версий Windows 95/98 |
poPageNums | Сделать доступной радиокнопку Страницы, позволяющую пользователю задавать диапазон печатаемых страниц |
poPrintToFile | Отображать в диалоговом окне кнопку Печать в файл |
poSelection | Сделать доступной кнопку Выделение, позволяющую пользователю печатать только выделенный текст |
poWarning | Выдавать замечания, если пользователь пытается послать задачу на неустановленный принтер |
Теперь остановимся на компоненте PrinterSetupDialog, вызывающем диалоговое окно установки принтера. Это единственный диалоговый компонент, не имеющий никаких специфических свойств, которые надо было бы устанавливать или читать. Диалог выполняет операции по установке принтера, на котором будет производиться печать, и задании его свойств. Этот диалог не возвращает никаких параметров.
Компоненты FindDialog и ReplaceDialog, вызывающие диалоги поиска и замены фрагментов текста, очень похожи и имеют одинаковые свойства, кроме одного, задающего заменяющий текст в компоненте ReplaceDialog. Такое сходство не удивительно, поскольку ReplaceDialog — производный класс от FindDialog.
Компоненты имеют следующие основные свойства:
FindText | Текст, заданный пользователем для поиска или замены. Программно может быть установлен как начальное значение, предлагаемое пользователю |
ReplaceText | Только в компоненте ReplaceDialog — текст, который должен заменять FindText |
Position | Позиция левого верхнего угла диалогового окна, заданная типом TPoint — записью, содержащей поля X (экранная координата по горизонтали) и Y (экранная координата по вертикали) |
Left | Координата левого края диалогового окна, то же, что Position.X |
Top | Координата верхнего края диалогового окна, то же, что Position.Y |
Options | Множество опций |
Последний параметр Options — может содержать следующие свойства:
frDisableMatchCase | Делает недоступным индикатор С учетом регистра в диалоговом окне |
frDisableUpDown | Делает недоступными в диалоговом окне кнопки Вверх и Вниз группы Направление, определяющие направление поиска |
frDisableWholeWord | Делает недоступным индикатор Только слово целиком в диалоговом окне |
frDown | Выбирает кнопку Вниз группы Направление при открытии диалогового окна. Если эта опция не установлена, то выбирается кнопка Вверх |
frFindNext | Эта опция включается автоматически, когда пользователь в диалоговом окне щелкает на кнопке Найти далее, и выключается при закрытии диалога |
frHideMatchCase | Удаляет индикатор С учетом регистра из диалогового окна |
frHideWholeWord | Удаляет индикатор Только слово целиком из диалогового окна |
frHideUpDown | Удаляет кнопки Вверх и Вниз из диалогового окна |
frMatchCase | Этот флаг включается и выключается, если пользователь включает и выключает опцию С учетом регистра в диалоговом окне. Можно установить эту опцию по умолчанию во время проектирования, чтобы при открытии диалога она была включена |
frReplace | Применяется только для ReplaceDialog. Этот флаг устанавливается системой, чтобы показать, что текущее (и только текущее) найденное значение FindText должно быть заменено значением ReplaceText |
frReplaceAll | Применяется только для ReplaceDialog. Этот флаг устанавливается системой, чтобы показать, что все найденные значения FindText должны быть заменены значениями ReplaceText |
frShowHelp | Задает отображение кнопки Справка в диалоговом окне |
frWholeWord | Этот флаг включается и выключается, если пользователь включает и выключает опцию Только слово целиком в диалоговом окне. Можно установить эту опцию по умолчанию во время проектирования, чтобы при открытии диалога она была включена |
Сами по себе компоненты FindDialog и ReplaceDialog не осуществляют ни поиска, ни замены. Они только обеспечивают интерфейс с пользователем. А поиск и замену надо осуществлять программно. Для этого можно пользоваться событием OnFind, происходящим, когда пользователь нажал в диалоге кнопку Найти далее, и событием OnReplace, возникающим, если пользователь нажал кнопку Заменить или Заменить все. В событии OnReplace узнать, какую именно кнопку нажал пользователь, можно но значениям флагов frReplace и frReplaceAll.
Поиск заданного фрагмента легко проводить, пользуясь функцией Object Pascal Pos, которая определена в модуле System следующим образом:
function Pos(Substr: string; S: string): Byte;
где S — строка, в которой ищется фрагмент текста, a Substr — искомый фрагмент. Функция возвращает позицию первого символа первого вхождения искомого фрагмента в строку. Если Substr в S не найден, возвращается 0.
Для организации поиска нам потребуется еще две функции: Сору и AnsiLowerCase. Первая из них определена как:
function Copy(S: string; Index, Count: Integer): string;
Она возвращает фрагмент строки S, начинающийся с позиции Index и содержащий число символов, не превышающее Count. Функция AnsiLowerCase, определенная как
function AnsiLowerCase(const S: string): string;
возвращает строку символов S, переведенную в нижний регистр.
Теперь мы можем рассмотреть пример организации поиска. Пусть в вашем приложении имеется компонент Memo1 и при выборе раздела меню MFind вы хотите организовать поиск в тексте, содержащемся в Memo1. Для упрощения задачи исключим опцию поиска только целых слов и опцию поиска вверх от положения курсора.
Программа, реализующая поиск, может иметь следующий вид:
var SPos: integer;procedure TForm1.MFindClick(Sender: TObject);begin SPos := Memo1.SelStart; with FindDialog1 do begin <начальное значение текста поиска — текст, выделенный в Memo1> FindText := Memo1.SelText; Position := Point(Form1.Left, Form1.Top + Memo1.Top + Memo1.Height); <удаление из диалога кнопок «Вверх», «Вниз»,«Только слово целиком»> Options := Options + [frH >= Spos then begin Memo1.SelLength := Length(FindText); SPos := Memo1.SelStart + Memo1.SelLength + 1; end else if MessageDlg( ‘Текст «‘+FindText+'» не найден. Продолжать диалог?’, mtConfirmation, mbYesNoCancel, 0) <> mrYes then CloseDialog; end; Memo1.SetFocus;end;
В программе вводится переменная SPos, сохраняющая позицию, начиная с которой надо проводить поиск.
Процедура MFindClick вызывает диалог, процедура FindDialog1Find обеспечивает поиск с учетом или без учета регистра в зависимости от флага frMatchCase. После нахождения очередного вхождения искомого текста этот текст выделяется в окне Memo1 и управление передается этому окну редактирования. Затем при нажатии пользователем в диалоговом окне кнопки Найти далее, поиск продолжается в оставшейся части текста. Если искомый текст не найден, делается запрос пользователю о продолжении диалога. Если пользователь не ответил на этот запрос положительно, то диалог закрывается методом CloseDialog.
В дополнение к приведенному тексту полезно в обработчики событий OnClick и OnKeyUp компонента Memo1 ввести операторы
Это позволяет пользователю во время диалога изменить положение курсора в окне Memo1. Это новое положение сохранится в переменной SPos и будет использовано при продолжении поиска.
При реализации команды Заменить приведенные выше процедуры можно оставить теми же самыми, заменив в них FindDialog1 на ReplaceDialog1. Дополнительно можно написать процедуру обработки события OnReplace компонента ReplaceDialog1:
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);begin if Memo1.SelText <> » then Memo1.SelText := ReplaceDialog1.ReplaceText; if frReplaceAll in ReplaceDialog1.Options then ReplaceDialog1Find(Self);end;
Этот код производит замену выделенного текста и, если пользователь нажал кнопку Заменить все, то продолжается поиск вызовом уже имеющейся процедуры поиска ReplaceDialog1Find * . Если же пользователь нажал кнопку Заменить, то производится только одна замена и для продолжения поиска пользователь должен нажать кнопку Найти далее.
Предлагаемый алгоритм при нажатии на кнопку Заменить все заменяет только одно значение и находит следующее. На наш взгляд такие действия более логично было бы задать кнопке Заменить, а для Заменить все организовать цикл. Причем такой цикл проще осуществить в процедуре ReplaceDialog1Find. В приведенном ниже коде кроме того введена локальная переменная ss, так как свойству SelStart нельзя присваивать отрицательные значения.
| | следующая лекция ==> | |
Пожарная профилактика при проектировании и строительстве зданий | | | Процесс планирования состоит из |
Дата добавления: 2014-01-07 ; Просмотров: 1765 ; Нарушение авторских прав? ;
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет