CurrToStr — Функция Delphi


Содержание

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.

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

Delphi: Как получить (текущий код строку, текущую единицу, текущая функция) без использования Assertion?

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

Пример usning утверждать, что:

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

не работает пример:

пожалуйста, помогите, и спасибо заранее.

Вы можете связать свой собственный TAssertErrorProc процесс к AssertErrorProc переменной. Вы могли бы написать что — то вроде этого:

Самый простой способ отображения из указателя команд на единицу имя и номер строки, чтобы использовать один из различных библиотек отладки: madExcept, EurekaLog, JclDebug и т.д.

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

Работа со строками в Delphi 10.3 Rio

Работа со строками в Delphi — это отдельная и очень обширная тема. Рассмотреть в одной статье все тонкости и особенности строк delphi представляет собой достаточно сложную задачу сравнимую, наверное, с написанием небольшой книги, просто по причине того, что в Delphi на сегодняшний день используются разные типы строк (ShortString, AnsiString, UnicodeString и прочие) и каждый тип для чего-то да нужен — для обратной совместимости, для COM BSTR, для разработки под мобильные платформы и так далее.

Вместе с этим, Delphi постоянно развивается, что-то добавляется, что-то улучшается и вот уже те инструменты работы со строками в Delphi, которые вызывали недоумение своим появлением, например, в Delphi 2009 в Delphi 10.3 Rio начинают играть другими красками. На написание этой статьи меня подтолкнула статья « What’s New » для Delphi 10.3 Rio, а именно то, что разработчики Delphi отдельным пунктом выделили, что давным давно существующий в Delphi класс TStringBuilder оптимизирован и даже обзавелся перегруженным методом ToString использование которого может увеличить производительность. Вот я и решил проверить — на сколько же выросла производительность TStringBuilder в Delphi по сравнению с тем, что было в далеком 2008 году, когда не было ни поддержки мобильных платформ, ни x64 с Linux.

Справка по TStringBuilder

TStringBuilder — это специализированный класс для работы со строками в Delphi (аналог класса StringBuilder в .NET Framework).

TStringBuilder поддерживает выполнение таких операций со строками как конкатенация (сложение), поиск, заменена и вставка подстрок. При этом, массив символов может быть запрошен по индексу или преобразован в строку для сравнения.

На массив символов можно ссылаться напрямую, используя свойство Chars. Свойство Length содержит текущую длину массива символов.

Работать с классом TStringBuilder в Delphi достаточно просто:

Обратить внимание стоит на то, что TStringBuilder работает с 0-индексированными (0-based) строками — первый символ имеет индекс 0, а не 1, как мы привыкли в Delphi. В остальном же, работа с TStringBuilder основана на использовании следующих методов:

Append — добавить подстроку к строке (конкатенация строк). Метод перегружен поэтому, Вы можете добавлять к строке числа, массивы символов и другие типы, например так:

Insert — вставить подстроку в строку с заданной позиции (метод также перегружен)

Replace — заменить подстроку (или символ) на другую строку (символ). Заменяет все вхождения подстрок.

CopyTo — копирование части строки в строку-приемник.

В Delphi 10.3 Rio TStringBuilder обзавелся также перегруженным методом ToString:

По сообщению разработчиков Delphi, ToString (True) даст лучшую производительность, если больше не ожидается никаких изменений для TStringBuilder, поскольку это уменьшает объем копируемых данных.

Со всеми методами TStringBuilder можно ознакомиться в справке Delphi.

Меня же больше интересует насколько TStringBuilder стал более производительным в части конкатенации строк по сравнению с обычной (привычной, классической) операцией сложения?

Вводные для теста производительности TStringBuilder

Итак, что у меня имеется для тестирования TStringBuilder:

Стационарный компьютер имеет следующие характеристики:

  • Процессор Intel Core i5 8400 (6-ти ядерный)
  • ОЗУ: 16 ГБ
  • ОС: Windows 10 x64

Смартфон LG Q7+ (Android 8.1.0)

Модель процессора MediaTek MT6750S
Частота процессора 1.5 ГГц
Кол-во ядер процессора 8
Оперативная память 3 ГБ

Проверять будем конкатенацию (сложение) строк Delphi в следующем порядке:

  1. Проверяем скорость сложения строк с использованием метода Append TStringBuilder
  2. Проверяем обычное сложение строк (Str1+Str2)
  3. Проверяем скорость сложения строк с использованием метода Append TStringBuilder и вывод строки обновленным методом ToString(True).

Все три проверки буду проводить на всех доступных устройствах.

Приложение для тестирование производительности TStringBuilder

Версия для ОС Windows

Внешний вид приложения для теста производительности TStringBuilder в Windows:

Каждую операцию сложения строк будем повторять по десять раз и результаты теста выводить в TStringGrid.

Код обработчика OnClick:

Результаты теста TStringBuilder в Windows

Тестирование сложение двух строк

  • Строка 1: edStr1
  • Строка 2: edStr2
  • Количество сложений: 30 000 000
# TStringBuilder Классика TStringBuilder.ToString(True)
1 234 483 165
2 249 527 163
3 197 482 155
4 206 495 157
5 186 503 155
6 185 503 162
7 188 499 155
8 188 519 155
9 187 478 155
10 208 537 154
Илон Маск рекомендует:  Как заставить ajax читать между строк

Прибавление к строке одного символа

  • Строка 1: edStr1
  • Строка 2: a
  • Количество сложений: 30 000 000
# TStringBuilder Классика TStringBuilder.ToString(True)
1 149 314 124
2 149 318 128
3 137 332 207
4 122 312 123
5 121 311 123
6 146 312 173
7 130 327 124
8 122 315 124
9 122 317 123
10 122 312 123

Как можно видеть из представленных результатов TStringBuilder при сложении строк оказывается практически вдвое быстрее, чем обычная операция сложения, чего ранее за этим классом не наблюдалось при работе в Windows — ранее время, затрачиваемое на операцию сложения было практически одинаковым или, как в свое время проверял Marco Cantu — TStringBuilder оказывался намного медленнее.

Версия для ОС Android

Внешний вид приложения для тестирования TStringBuilder:

Исходный код программы тот же, что и в версии для Windows с одним лишь исключением — результаты теста будут выводиться в обычный Memo:

Результаты теста TStringBuilder на LG Q7+

Тестирование сложение двух строк

  • Строка 1: edStr1
  • Строка 2: edStr2
  • Количество сложений: 1 000 000
# TStringBuilder Классика TStringBuilder.ToString(True)
1 302 849 232
2 233 847 221
3 231 830 221
4 230 828 224
5 230 831 221
6 238 829 227
7 230 821 221
8 230 821 221
9 230 838 223
10 238 822 228

Прибавление к строке одного символа

  • Строка 1: edStr1
  • Строка 2: a
  • Количество сложений: 1 000 000
# TStringBuilder Классика TStringBuilder.ToString(True)
1 302 776 221
2 221 774 218
3 221 775 219
4 221 776 218
5 221 772 218
6 221 773 218
7 221 773 219
8 221 773 219
9 221 773 219
10 221 772 218

Опять же, как можно видеть по результатам тестирования, TStringBuilder ускоряет работу по сложению двух строк примерно в 2,5 раза, при этом, новый метод ToString(True) дает незначительное ускорение по сравнению с обычным ToString.

Резюмируем

На рисунке ниже представлено среднее время сложения двух строк в Windows.

  1. Синий столбик — сложение двух строк
  2. Оранжевый — прибавление к строке одного символа

То де самое, но уже для Android:

Представленные выше диаграммы наглядно демонстрируют рост производительности TStringBuilder при работе со строками в Delphi 10.3 Rio как в Windows, так и в Android. Между тем, новые метод TStringBuilder.ToStrng(True) дает незначительный прирост производительности по сравнению с ранее существующим методом ToString.

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

Остается открытым вопрос о производительности TStringBuilder при работе в многопоточных приложениях, но это уже отдельная тема повышения производительности работы со строками в Delphi в принципе.

Исходники обоих тестовых приложений можно скачать со страницы:

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

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

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

Конструирование функций

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

Функция 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. Самое интересное в этом подходе заключается в том, что он следует принципу отложенных вычислений: значения «извлекаются» из генератора (или из конвейера) по мере необходимости, а не все сразу. Эту особенность демонстрирует следующий пример, в котором исходный текст фильтруется, построчно проходя через цепочку генераторов.

How To Get the Name of the Current Procedure/Function in Delphi (As a String)

Is it possible to obtain the name of the current procedure/function as a string, within a procedure/function? I suppose there would be some «macro» that is expanded at compile-time.

My scenario is this: I have a lot of procedures that are given a record and they all need to start by checking the validity of the record, and so they pass the record to a «validator procedure». The validator procedure (the same one for all procedures) raises an exception if the record is invalid, and I want the message of the exception to include not the name of the validator procedure, but the name of the function/procedure that called the validator procedure (naturally).

Илон Маск рекомендует:  Создание двумерных игр при помощи game api

It would be somewhat less error-prone if I instead could write something like

and then each time the compiler encounters a <$PROCNAME>, it simply replaces the «macro» with the name of the current function/procedure as a string literal.

Update

The problem with the first approach is that it is error-prone. For instance, it happens easily that you get it wrong due to copy-paste:

or just temporary confusion:

6 Answers 6

We are doing something similar and only rely on a convention: putting a const SMethodName holding the function name at the very beginning.
Then all our routines follow the same template, and we use this const in Assert and other Exception raising.
Because of the proximity of the const with the routine name, there is little chance a typo or any discrepancy would stay there for long.
YMMV of course.

I think this is a duplicate of this question: How to get current method’s name in Delphi 7?

The answer there is that to do so, you need some form of debug info in your project, and to use, for example, the JCL functions to extract information from it.

I’ll add that I haven’t used the new RTTI support in D2009/2010, but it wouldn’t surprise me if there was something clever you could do with it. For example, this shows you how to list all methods of a class, and each method is represented by a TRttiMethod. That descends from TRttiNamedObject which has a Name property which «specifies the name of the reflected entity». I’m sure there must be a way to get a reference to where you currently are, ie the method that you’re currently in. This is all guesswork, but try giving that a go!

No compile time macro, but if you include enough debug information you can use the callstack to find it out. See this same question.

Another way to achieve the effect is to enter source metadata into a special comment like

And then run a third-party tool over your source in a pre-compile build event to find lines with «LOCAL_FUNCTION_NAME» in such a comment, and replace all string literals with the method name in which such code appears, so that e.g. the code becomes

if the code line is inside the «SomeProc3» method. It would not be difficult at all to write such a tool in Python, for example, and this text substitution done in Delphi would be easy enough too.

Having the substitution done automatically means you never have to worry about synchronization. For example, you can use refactoring tools to change your method names, and then your string literals will be automatically updated on the next compiler pass.

Something like a custom source pre-processor.

I gave this question a +1, this is a situation I have had numerous times before, especially for messages for assertion failures. I know the stack trace contains the data, but having the routine name inside the assertion message makes things that little bit easier, and doing it manually creates the danger of stale messages, as the OP pointed out.

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

CurrToStr — Функция 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, то будет тебе счастье. Изучай.

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