- •Строковые типы в Delphi. Особенности реализации и использования
- •Какие строковые типы существуют в Delphi, и чем они отличаются друг от друга?
- •Так как они устроены?
- •Как же это происходит?
- •Преобразование строк из одного типа в другой
- •Функции для работы со строками, о которых многие часто забывают, или вовсе не знают
- •If AnsiMatchText(YouName,['Вася','Петя','Гриша']) then
- •Запись строк в файл и чтение из файла
- •Использование строк в записях
- •Использование строк в качестве параметров и результатов функций размещенных в dll.
If AnsiMatchText(YouName,['Вася','Петя','Гриша']) then
ShowMessage('Ты мальчик')
else if AnsiMatchText(YouName,['Света','Оля','Настя']) then
ShowMessage('Ты девочка')
else
ShowMessage('Я не знаю тебя!');
function AnsiIndexStr (const AText: string; const AValues: array of string): Integer;
function AnsiIndexText (const AText: string; const AValues: array of string): Integer;
Возвращают индекс строки AText в списке AValues. Первый элемент списка имеет индекс 0. Если же AText в списке AValues не встречается, возвращает -1. Очень удобные функции, жаль что об их существовании многие не догадываются. Приведу пример использования:
case AnsiIndexText(Cmd,['вверх','вниз','влево','вправо']) of
0 : Dec(y);
1 : Inc(y);
2 : Dec(x);
3 : Inc(x);
else ShowMessage('Незнакомая команда: "'+Cmd+'"');
end;
function AnsiReplaceStr (const AText, AFromText, AToText: string): string;
function AnsiReplaceText (const AText, AFromText, AToText: string): string;
Позволяют выполнить замену контекста AFromText на AToText в строке AText.
function StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText:
string): string;
Заменяет фрагмент строки AText, начиная с позиции AStart и длиной ALength, строкой ASubText.
function StringOfChar(Ch: Char; Count: Integer): string;
Возвращает строку длинной Count, состоящую из символов Ch.
...
Короче, не забывайте на досуге читать файлы справки, найдёте там ещё много интересных и полезных функций.
Некоторые приемы использования строк типа AnsiString
В этом разделе, я постараюсь воздержаться от пространных комментариев, а попробую продемонстрировать некоторые приёмы работы с динамическими строками, учитывающие их реализацию.
Передача строк в качестве параметров
Как известно, есть четыре способа передачи параметров в процедуру или функцию. Вот какие особенности они имеют если параметр - динамическая строка:
-
входной параметр (const) – его значения нельзя изменять внутри, поэтому, передаётся адрес экземпляра динамической строки, без увеличения счётчика ссылок;
-
выходной параметр (out) – передаётся адрес строковой переменной которая будет получать результат. В общем случае значение такого параметра на входе в функцию считаются неопределённым, но для динамических строк, он всегда равен пустой строке. Естественно, счётчик ссылок не увеличивается – у пустой строки его просто нет. В месте вызова, и в начале процедуры, выполняется дополнительный код, обеспечивающий очистку строки. Конечно, на него тратится память и время.
-
параметр переменная (var) – передаётся адрес строковой переменной. Изменение этого параметра отражается изменением переданной переменной. Счётчик ссылок на экземпляр строки не увеличивается, поскольку передаётся не ссылка, а ссылка на ссылку;
-
параметр-значение – для такого параметра создается локальная копия переданного значения. При этом передаётся адрес экземпляра динамической строки, а в начале процедуры, при создании локальной копии параметра, увеличивается счётчик ссылок на экземпляр. На это тратится память и время.
Прочитав это, должна стать понятным следующее:
Если в качестве параметра передаётся динамическая строка, которая не будет изменяться внутри процедуры, то желательно описать этот параметр как входной (const). В отличие от простых типов (Integer, Boolean, и т.п.), это уменьшит код программы, и увеличит скорость ее работы.