CurrToStrF — Функция Delphi

CurrToStrF — Функция 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 только чисел.

Илон Маск рекомендует:  Сжатие javascript, js файлов

StringGr >11.02.2013, 10:26. Просмотров 429. Ответов 4

11.02.2013, 10:26

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы.

StringGrid: проверить, имеется ли строка с ключевым полем во втором StringGrid-е
Имеются два StringGrid’a, у каждого есть ключевое поле. В первом sg значения ключевого поля могут.

Необходимо сложить ячейки в столбце Stringgrid и вывести в другой Stringgrid
Необходимо сложить ячейки в столбце Stringgrid и вывести в другой Stringgrid Количество столбцов.

Содержимое выделенной строки из первого StringGrid-а перенести во второй StringGrid
Нужно написать программу которая выполняет следующие действия. Есть два StringGrid. По нажатия на.

Значение одной ячейки первого StringGrid-а присвоить другой ячейке второго StringGrid-а
скажите пожалуйста, вот нам даны две таблицы stringgrid, как значение одной ячейки,первой таблицы.

CurrToStrF — Функция Delphi

Описание
Функция конвертирует значение типа Currency, указанное в параметре Value, в его строковое представление, используя заданный формат. Действие данной функции аналогично функции FloatToStrF с точностью (Precision) равной 19 знакам. Назначение параметра Digits зависит от типа формата строки, определенного в параметре Format. Подробности форматирования см. в описании функции FloatToStrF.

Пример
var
SumWithNDS, NDS: Currency;
S: string;
begin
SumWithNDS:= 10203;
NDS:=SumWithNDS/6;
MessageDlg(‘Сумма: ‘+ CurrToStrF( SumWithNDS, ffCurrency, 2)+ #13+ ‘НДС=20%: ‘+ CurrToStrF( NDS, ffCurrency, 2), mtInformation, [mbOk], 0);
end;

CurrToStrF Routine

Unit Edit

Description Edit

Definition (Delphi 6):

Definition (Delphi 2007, 2010):

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.)

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Приведение типов в Delphi: Преобразование целых чисел в строку и обратно

Преобразование целых чисел в строку и обратно

Начнем с рассмотрения специальных функций для преобразования несовмести­мых типов. Самое частое, что может понадобиться при программировании, — пре­образование строк в число и обратно. Допустим, нужно написать программу, в ко­торой пользователь будет вводить число в компонент TEdit. Чтобы получить доступ к содержимому Editl, надо написать Editl.Text. Так мы получим тексто­вое представление числа. Чтобы его преобразовать, необходимо воспользоваться специальной функцией.

Для преобразования строки в число используется функция strToint. У нее только один параметр — строка, а на выходе она возвращает число,

ch:=StrToInt(Editl.Text); II Преобразовываю Edit1.Text в число end;

В этом примере мы присвоили переменной ch значение, содержащееся в Editl. Text, которое было преобразовано в число. Теперь можно производить математические действия с введенным числом.

Обратное преобразование (превращение числа в строку) можно произвести с помощью функции IntToStr.

ch:=StrToInt(Edit1.Text); // Преобразовываю Editl.Text в число ch:=ch+1;

Edit1.Text:=IntToStr(ch); // Преобразовываю ch в строку end;

Когда вы преобразовываете строку в число, то должны быть уверенным в том, что строка содержит число. Если в строке будет хоть один символ, не относящийся к цифре, то во время преобразования произойдет ошибка. Чтобы избавиться от ошибок, можно использовать исключительные ситуации, заключая преобразование между try и except. Есть еще один способ — использовать функцию strTointDef, у которой уже два параметра:

  • строка, которую надо преобразовать;
  • значение по умолчанию, которое будет возвращено, если произошла ошибка.

Итак, наш пример можно подкорректировать следующим образом:

ch:=StrToIntDef(Editl.Text, 0); // Преобразовываю Editl.Text в число end;

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

Функции Delphi

Стандартные функции Delphi:

Для проведения всевозможных математических вычислений и многочисленных преобразований язык программирования Delphi содержит библиотеки стандартных процедур и функций. Давайте подробнее рассмотрим стандартные функции Delphi.

Между значением и именем функции существует зависимость. Поэтому всякая функция может быть представлена как операнд некоторого выражения (к примеру, в инструкции присваивания). Для возведения числа в n-ую степень достаточно записать

откуда ln — функция, вычисляющая натуральный логарифм числа exp(x), exp — функция, вычисляющая экспоненту в степени x, x — число, n-ую степень которого надо найти, а n — степень числа x. Каждая функция обладает следующими характеристиками: тип значений, тип параметров.

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

Математические функции Delphi:

Библиотеки языка Delphi включаются в себя и множество математических функций:

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

где a выражает угол в градусах; 3.1415926 означает число pi. На месте константы 3.1415926 с дробной частью для достижения большей точности чаще всего пользуются стандартной именованной константой pi. Тогда выражения для угла в пересчете в радианы будет выглядеть следующим образом:

Функции преобразования Delphi:

Наиболее частое использование функций преобразования связано с инструкциями, которые обеспечивают ввод/вывод какой-либо информации. Например, для вывода значения переменной c типом real в поле вывода диалогового окна (компонент Label), нужно провести преобразование числа в строку символов, которая собственно изображает данное число. Это можно достичь, применяя функцию FloatToStr, которая заменяет значение выражения (оно указано как параметр функции) его строковым представлением.

Пример.

В приведенном примере значение переменной m будете выведено в поле Label. В таблице ниже Вам будут представлены основные функции преобразования Delphi:

Применение функций Delphi:

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

Примеры.

Структура функции Delphi

Как организована инструкция функции в языке Delphi? В любом языке программирования на первом этапе описания функции указывается ее заголовок. Далее за заголовком программист описывает раздел объявления констант const (если таковы имеются), затем занимается описанием раздела объявления типов type, далее следует раздел объявления переменных var и, наконец, раздел инструкций.

В приведенном примере в заголовке функции вначале указывается зарезервированное слово function, а следом идет имя функции. Далее в скобках программист перечисляет список параметров, и вслед за ним, используя символ «:», указывает тип значения функции. В конце каждого заголовка стоит символ «;». После заголовка следуют раздел констант, раздел типов, раздел переменных. Внутри раздела инструкций кроме констант и переменных, описанных соответственно в разделах const и var, может находится переменная result.

Когда инструкции функции завершат свое выполнение, значению переменной result присваивается значение функции. Таким образом, среди всех инструкций функций необходимое присутствие инструкции, которая бы присваивала переменной result окончательное значение функции. Обычно подобная инструкция есть последняя исполняемая инструкция функции. Представим пример функции FuntToKg, преобразующей фунты в килограммы.

Использование замыканий и функций высших порядков в Delphi

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

Delphi не является языком функционального программирования, но тот факт, что программы на нем могут манипулировать функциями как объектами означает, что в Delphi можно использовать приемы функциональной парадигмы. Цель статьи — не подтолкнуть к использованию этого стиля, но обозначить некоторые примеры и возможности.

Илон Маск рекомендует:  Iis использование стандарта безопасности fortezza в iis
Конструирование функций

Функции высшего порядка (ФВП) – это функции, которые оперируют функциями, принимая одну или более функций и возвращая новую функцию.
Следующий пример показывает, как с помощью ФВП можно конструировать другие функции.

Функция Negate в примере выше, является ФВП, потому что она принимает функцию IsOdd в виде аргумента и возвращает новую функцию IsEven, которая передает свои аргументы Negate и возвращает логическое отрицание значения, возвращаемого функцией IsOdd.

Так как использование обобщенных типов не способствует ясности изложения, в последующих примерах будем по возможности их избегать.

Композиция функций

Ниже приводится пример еще одной, более универсальной функции, которая принимает две функции, F и G, и возвращает новую функцию, которая возвращает результат F(G()).

Здесь функция Compose вычисляет F(G(X, Y)). Возвращаемая функция передает все свои аргументы функции G, затем передает значение, полученное от G, функции F и возвращает результат вызова F.

Частичное применение

Этот термин описывает преобразование функции с несколькими аргументами в функцию, которая принимает меньшее количество аргументов, при этом значения для опущенных аргументов задаются заранее. Этот прием вполне адекватен своему названию: он «частично применяет» некоторые аргументы функции, возвращая функцию, принимающую остающиеся аргументы.
Функция BindLeft в примере ниже берет функцию Calc, принимающую n аргументов, связывает первые k из них с наперед заданными значениями и возвращает функцию Partial, которая может принять (n-k) аргументов (первые k аргументов будут уже применены к ней).

Здесь интересен момент, когда после вызова BindLeft локальная переменная StoredArgs не прекращает свое существование и используется далее, сохраняя в себе значения аргументов, которые потом используются при вызове Partial и передаются в Calc. Этот эффект называется замыканием. При этом каждый вызов BindLeft будет порождать новые «экземпляры» StoredArgs. Замыкания использовались и в предыдущих примерах, когда в них сохранялись аргументы ФВП.
Определить частичное применение справа можно следующим образом:

Карринг

В то время как частичное применение преобразует функцию с n параметрами в функцию с n-k параметрами, применяя k аргументов, карринг декомпозирует функцию на функции от одного аргумента. Мы не передаем никаких дополнительных аргументов в метод Curry, кроме преобразуемой функции:

  • Curry(F) возвращает функцию F1, такую что.
  • F1(A) возвращает функцию F2, такую что.
  • F2(B) возвращает функцию F3, такую что.
  • F3(С) вызывает F(A, B, C)
Мемоизация

Мемоизованная функция — это функция, которая сохраняет ранее вычисленные результаты. Другими словами, для функции создаётся таблица результатов, и, будучи вычисленным при определённых значениях параметров, результат заносится в эту таблицу. В дальнейшем результат берётся из данной таблицы. Эта техника позволяет за счёт использования дополнительной памяти ускорить работу программы. Разумеется, мемоизируемая функция должна работать без побочных эффектов и ей желательно иметь дискретную область определения.
В следующем примере демонстрируется функция Memoize высшего порядка, которая принимает функцию в виде аргумента и возвращает ее мемоизованную версию.

Функция Memoize создает объект TCache для использования в качестве кэша и присваивает его локальной переменной, благодаря чему он остается доступным (через замыкание) только для возвращаемой функции. Возвращаемая функция преобразует свой аргумент в ключ. Если значение присутствует в кэше, оно просто возвращается в качестве результата. В противном случае вызывается оригинальная функция, вычисляющая значение для заданного аргумента; полученное значение помещается в кэш и возвращается.

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

Генераторы

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

Польза генераторов заключается в том, что для вычисления каждого следующего элемента не требуется вычислять всю последовательность с самого начала. Генераторы позволяют работать даже с бесконечными последовательностями, но они обеспечивают только последовательный доступ к своим элементам и не позволяют обращаться к своим элементам по индексу: чтобы получить n-e значение придется выполнить n-1 итераций.

Отложенные вычисления

Генераторы бывает удобно использовать для последовательной обработки данных — элементов списка, строк текста, лексем в лексическом анализаторе и т.д. Генераторы можно объединять в цепочки, подобно конвейеру команд в Unix. Самое интересное в этом подходе заключается в том, что он следует принципу отложенных вычислений: значения «извлекаются» из генератора (или из конвейера) по мере необходимости, а не все сразу. Эту особенность демонстрирует следующий пример, в котором исходный текст фильтруется, построчно проходя через цепочку генераторов.

CurrToStrF — Функция Delphi

Строки в Delphi состоят из одоного (тип ShortString ) или двух байтов (тип AnsiString, WideString ), содержащих указание количества символов в строке, и последовательности символов. Таким образом ShortString максимально может содержать до 255 символов и занимать память 2 байта ..256 байт, а AnsiString или WideString — максимально могут содержать примерно 2 x 10 30 символов и занимать память 4 байта .. 2 Гбайта.

В типе AnsiString символы кодируются в коде ANSI, а в типе WideString — в коде Unicode.

Общим типом является тип String , который может соответствовать как типу ShortString , так и типу AnsiString . Это определяется директивой компилятора $H . По умолчанию используется <$H+>, и тип String равен типу AnsiString .

Кроме того имеется тип PChar , представляющий так называемую строку с завершающим нулем. Строки с завершающим нулем не содержат байтов длины. В отличие от обычных строк они состоят из последовательности ненулевых символов, за которым следует символ NULL (#0). Никаких ограничений на длину строк с завершающим нулем не накладывается. Фактически он указывает на символ

Расширенный синтаксис позволяет ставить в соответствие строкам с завершающим нулем символьный массив типа

где X — положительное число типа Integer , определяющее количество символов в строке, не считая завершающего символа с кодом 0. В отличие от типа String , символ с индексом 0 здесь является первым символом строки, а последний символ с индексом X — завершающим символом с кодом 0. (см. Функции работы со строками с завершающим нулем)

Список литературы:

  1. Гофман В.Э., Хомоненко А.Д. Delphi 6. — СПб. БХВ-Петербург, 2002. — 1152 с.: ил.
  2. Турбо Паскаль 7.0 — К. Торгово-издательское бюро BHV, 1996 — 448 с.: ил.
  3. Delphi7 Help

Некоторые интересные строковые функции Delphi.

Рассматриваемые функции:
AdjustLineBreaks
IsValidIdent
AnsiQuotedStr и AnsiExtractQuotedStr

Функция AdjustLineBreaks приводит строку S к формату установленной OS, преобразуя символы перевода строки (одиночные символы возврата каретки (#13), перевода строки (#10), и пары CR-LF) применительно к данной ОС. Файлы, копируемые из систем Unix и Macintosh, содержат иные символы окончания строк, чем могут «ввести в заблуждение» многие программы DOS и Windows. (В Macintosh используется только символ возврата каретки; в Unix — только символ перевода строки.)

Второй необязательный параметр позволяет управлять форматированием. Ты можешь адаптировать переносы строк, как под Windows (tlbsCRLF), так и под Unix (tlbsLF). По умолчанию он определяется установленной ОС.

Эта функция часто может тебе понадобиться, чтобы общаться с серверами в сети, т.к. серверы чаще всего работают по никсами (а ты конечно под Виндой ).

Для примера переделаем WhoIs-клиент из всеми любимой ДГХ (стр. 142 «Их разыскивают бойцы 139-го порта»). Там, чтобы отформатировать полученную от сервера строку, написан цикл, сканирующий строку на символ #10 и делящий текст на кусочки. Мы сделаем все это в одной строке (для надежности я добавил обработку ошибок):

StringReplace возвращает копию S, где OldSubStr заменена на NewSubStr. Если Flags содержит rfReplaceAll, заменяются все вхождения OldSubStr; иначе заменяется только первое вхождение. Поиск OldSubStr выполняется с учетом регистра, если только не включен флаг rflgnoreCase.
Пример замены текста в TMemo:

Функция WrapText возвращает копию Line, разбитую на несколько строк шириной MaxCol столбцов. Каждая строка разбивается, когда ее длина доходит до MaxCol символов. Разбиение производится там, где есть символы из множества BreakChars. При нахождении символа из BreakChars, после него вставляется строка BreakStr. (В Delphi 5 как существующие переводы строк рассматриваются символы #13 и #10, независимо от BreakStr.)

Вторая форма WrapText использует [‘ ‘, ‘ -‘ , #9] (пробел, дефис, табуляция) в качестве BreakChars и #13#10 (возврат каретки, перевод строки) в качестве BreakStr. Получается эта форма просто переносит строку по словам.

Сама Delphi к этой функции в своих модулях не обращается. Для разных компонентов пишутся аналоги с другими названиями. Я не додумался до сколько-нибудь полезного примера, т.к. например в TMemo и TRichEdit это свойство уже реализовано.

В моем примере TListBox заполняется строками, примерно, как в TMemo и ширина и количество строк меняются, при изменении размера TListBox. Также в примере есть алгоритм подгонки ширины строк к ширине окна:

function IsValidIdent ( const >: string ) : Boolean ;

Функция IsValidIdent возвращает True, если Ident содержит корректный идентификатор Delphi Pascal, т. е. строку, первый символ которой является буквой или подчеркиванием: [‘A’..’Z’, ‘a’..’z’, ‘_’] ,а последующие символы — буквами, цифрами или символами подчеркивания: [‘A’..’Z’, ‘a’..’z’, ‘0..’9′, ‘_’].

Наверняка пригодится где-нибудь при разработке компонентов для проверки корректности установленных свойств. Например Delphi использует эту функцию при установке имени компонента TComponent.Name.
Хочется показать определение этой функции. Смотри какой простой и правильный код:

function LastDelimiter ( const Delimiters , S : string ) : Integer ;

Функция LastDelimiter возвращает индекс последнего (самого правого) вхождения любого из символов Delimters в строке S. Если ни один из символов Delimiters не присутствует в S, LastDelimiter возвращает ноль. Delimiters не может быть многобайтовой строкой, и нельзя использовать #0 в качестве одного из разделителей.

Может, например, понадобиться для разбора пути к файлу на каталоги: от конечного к корню диска.

А я для примера написал функцию, которая выводит слова в предложении в обратном порядке:

При работе с PChar для тех же целей используется функция AnsiStrRScan:

function AnsiStrRScan ( Str : PChar ; Chr : Char ) : PChar ;

Функция AnsiStrRScan выполняет поиск последнего (самого правого) вхождения символа Chr в Str и возвращает указатель на символ в строке Str или nil, если символ не найден.

AnsiQuotedStr и AnsiExtractQuotedStr

function AnsiQuotedStr ( const S : string ; Quote : Char ) : string ;

Функция AnsiQuotedStr возвращает копию S, заключенную в кавычки. Символ кавычек указан в параметре Quote. Вхождения Quote в S повторяются и в результирующей строке. Эта функция предполагает, что в S нет символов #0 (кроме #0, находящегося за концом строки).

function AnsiExtractQuotedStr ( var Src : PChar ; Quote : Char ) : string ;

Функция AnsiExtractQuotedStr выбирает из Src строку, заключенную в кавычки. Первый символ Src должен быть равен Quote, иначе функция сразу завершается, возвращая пустую строку. Если это условие выполняется, строка, заключенная в символы кавычек, копируется и возвращается в качестве результата функции. Повторяющиеся символы кавычек преобразуются в одиночные кавычки. Src изменяется, указывая теперь на символ сразу за закрывающей кавычкой. Если в Src нет закрывающей кавычки, то Src присваивается указатель на завершающий байт #0, и функция возвращает весь текст до конца строки.

Эти функции могут тебе понадобится при работе с файлами, при записи-чтении информации. Delphi использует эти функции при чтении-записи свойства TStrings.CommaText.

Если хочешь знать еще больше, то запускай Delphi, создавай проект по умолчанию и, удерживая кнопочку CTRL кликай мышкой по слову SysUtils в секции uses. Смещай взгляд свой в левую сторону окна с кодом. И будет там окно Code Explorer. И когда нажмешь ты на плюсик слева от папочки Procedures, то будет тебе счастье. Изучай.

Преобразовать функцию в delphi 2009/2010 (unicode)

Я медленно конвертирую свой существующий код в Delphi 2010 и читаю несколько статей на веб-сайте Embarcaedro, а также в техническом документе Marco Cantú.

Есть еще некоторые вещи, которые я не понял, поэтому вот две функции, чтобы показать мой вопрос:

Для функции RemoveSpace, если символ unicode не передан (например, «aa bb» ), все хорошо. Теперь, если я передаю текст «ab cd», функция не работает должным образом (я получаю ab?? cd в качестве вывода).

Как я могу рассчитать возможные символы Unicode в строке? использование длины (InStr) явно неверно, а также Copy (InStr, I, 1).

Каков наилучший способ преобразования этого кода, чтобы он учитывал символы Unicode?

Если это были ваши РЕАЛЬНЫЕ функции, и вы просто пытаетесь заставить их работать, то:

(на данный момент мы не используем D10, так что остерегайтесь!)

Проблема в Delphi со строковыми литералами, которые содержат символы вне базового ascii-диапазона. Когда они передаются в строковые подпрограммы, символы, отличные от ascii, заменяются вопросительными знаками.

Чтобы избежать этого, передайте текстовые литералы в WideStrings, прежде чем передавать их как параметр функции.

Я не знаю, относится ли это к процедуре StringReplace, но программа поиска Delphi Pos/Posex не обрабатывает Юникод правильно. Мы должны были заменить эти процедуры своим собственным вариантом. Для этой улучшенной процедуры важно убедиться, что параметры имеют тип WideString, а не обычный тип строки.

Мы сделали это в D7 при работе с Unicode, и все работает хорошо.

Хотя string теперь является типом Unicode, когда вы указываете длину, вы все равно получаете тип non-Unicode ShortString . Переменная TestChar в вашей функции RemoveSpace является несимвольной односимвольной строкой. То, что вы должны использовать все время, является реальной переменной Char . Я ожидаю, что вы пришли из мира VB, где односимвольные строки были такими же, как одиночные символы. В Delphi строка не совпадает с символом, поэтому, когда вы вызываете Copy , вы получаете строку.

В Unicode Delphi эта односимвольная строка сводится к строке, отличной от Юникода, и если нет представления для этого символа на текущей кодовой странице, вместо этого вы получаете знак вопроса. Исправьте это так:

Я избавился от Ans . Начиная с Turbo Pascal 7, вы можете использовать неявно объявленную переменную Result вместо объявления своей собственной, а затем назначить ее имени функции. Result доступен для чтения и записи. Кроме того, вам не нужно беспокоиться о вводе нулевой длины. Когда верхняя граница цикла «for-to» меньше нижней границы, цикл просто не запускается, поэтому вам не нужно проверять заранее. Наконец, я использовал операторы скобок на InStr для извлечения символа в указанном индексе вместо получения строки длиной в один символ.

Вы говорите, что ваши использования Length и Copy явно неверны, но вы ошибаетесь. Эти функции продолжают работать очень хорошо в Unicode. Они знают, что Char теперь имеет ширину в два байта, поэтому, если вы назовете их на переменные UnicodeString , вы получите правильные символы. Они также продолжают работать с переменными AnsiString . Фактически, они также работают на переменные WideString , даже в более старых версиях Delphi.

Основная проблема в вашем коде заключалась в том, что вы сохранили символ Unicode в виде строки, отличной от Юникода.

Илон Маск рекомендует:  Серверные скрипты введение
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL