Для работы со строками типа PChar
Функции для работы со строками, заканчивающимися нулем, незаменимы при организации взаимодействия приложения с функциями Windows API.
Все функции находятся в модуле SysUtils.
Таблица 3.10. Функции для работы со строками типа PChar
Функция | Описание |
Создание и уничтожение строк | |
function StrAlloc(Size: Cardinal): PChar; function StrNew(const Str: PChar): PChar; procedure StrDispose(Str: PChar); function StrBufSize(const Str: PChar): | Резервирует буфер для строки с нулевым символом в конце в куче памяти и возвращает указатель на первый символ. После использования вызывайте функцию StrDispose(). Размещает копию строки Str в куче памяти и возвращает указатель на нее. Размер в памяти равен StrLen(Str) + 5 байт. После использования вызывайте функцию StrDispose(). Уничтожает строку, созданную StrAlloc() или StrNew(). Возвращает максимальное количество символов, которое может быть сохранено в буфере, зарезервированном функциями StrAlloc() или StrNew(). |
Объединение и копирование строк | |
function StrCat(Dest: PChar; const Source: PChar): PChar; function StrLCat(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; function StrCopy(Dest: PChar; const Source: PChar): PChar; function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; function StrECopy(Dest: PChar; const Source: PChar): PChar; function StrPCopy(Dest: PChar; const Source: string): PChar; function StrPLCopy(Dest: PChar; const Source: string; MaxLen: Cardinal): PChar; function StrMove(Dest: PChar; const Source: PChar; Count: Cardinal): PChar; | Объединяет две строки, дописывая Source в конец Dest. Возвращает указатель на строку Dest. Размер буфера должен быть не менее StrLen(Dest) + StrLen(Source) + 1 символов. Так же, как и StrCat, объединяет две строки, дописывая Source в конец Dest, но с учетом максимальной длины MaxLen результирующей строки. Другими словами, копирует не более MaxLen – StrLen(Dest) символов из строки Source. Копирует строку Source в Dest и возвращает указатель на Dest. Размер буфера должен быть не менее StrLen(Source) + 1 символов. Так же, как и StrCopy(), копирует строку Source в Dest и возвращает указатель на Dest, но с проверкой максимально доступного размера. Копирует строку Source в Dest и возвращает указатель на последний нулевой символ. Размер буфера должен быть не менее StrLen(Source) + 1 символов. Копирует строку Pascal в строку Dest, заканчивающуюся нулем. Возвращает указатель на строку Dest. Размер буфера должен быть не менее Length(Source) + 1 символов. Копирует MaxLen символов из строки Pascal в строку Dest, заканчивающуюся нулем. Возвращает указатель на строку Dest. Копирует Count символов из строки Source в строку Dest. Возвращает указатель на строку Dest. |
Форматирование строк | |
function StrLower(Str: PChar): PChar; function StrUpper(Str: PChar): PChar; function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar; function StrLFmt(Buffer: PChar; MaxLen: Cardinal; Format: PChar; const Args: array of const): PChar; function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const): Cardinal; | Преобразует строку к нижнему регистру. Преобразует строку к верхнему регистру. Форматирование одного или нескольких значений массива Args в буфере Buffer осуществляется в соответствии с параметром Format. То же, что и StrFmt, но длина результата форматирования ограничивается значением MaxLen Форматирует группу аргументов из массива Args. Результат помещается в Buffer (размер BufLen). Место вставки аргументов и их форматирование определяются в строке Format. Функция возвращает количество символов, помещенных в Buffer. |
Сравнение строк | |
function StrComp(const Str1, Str2 : PChar): Integer; function StrIComp(const Str1, Str2:PChar): Integer; function StrLComp(const Str1, Str2: PChar; MaxLen: Cardinal): Integer; function StrLIComp(const Str1 Str2: PChar; MaxLen: Cardinal): Integer; | Посимвольно сравнивает две строки с учетом регистра. Если строки идентичны, возвращает 0. То же, что и StrComp(), но без учета регистра. Посимвольно сравнивает две строки, начиная с первого символа до символа с порядковым номером MaxLen. Если строки идентичны, то возвращает 0. То же, что и StrLComp(), но без учета регистра символов. |
Поиск вхождения строки или символа в строку | |
function StrPos(const Str1, Str2: PChar): PChar; function StrScan(const Str: PChar; Chr: Char): PChar; function StrRScan(const Str: PChar; Chr: Char): PChar; | Возвращает указатель на место вхождения строки Str2 в Str1. Если Str1 не содержит Str2, то возвращается nil. Возвращает указатель на первое вхождение символа Chr в строку Str. Если вхождений нет, возвращает nil. Возвращает указатель на последнее вхождение символа Chr в строку Str. Если вхождений нет, возвращает nil. |
Другие функции | |
function StrLen(const Str: PChar): Cardinal; functionStrEnd(const Str: PChar): PChar; | Возвращает длину строки без учета завершающего нулевого символа. Возвращает указатель на завершающий нулевой символ строки Str. |
Примечание: Для работы со строками с учетом языкового драйвера предусмотрены функции, аналогичные рассмотренным в таблице. Это функции ANSI: AnsiStrPos() – аналог StrPos(), AnsiStrScan() – аналог StrScan() и т. д.
procedure . . .;
var Source : string; Dest : PChar;
Begin
Source:='ABCDEFG';
Dest := StrNew(PChar('0123456789'));
StrPLCopy(PChar(Dest), Source, 5);
Application.MessageBox(Dest,'Результат', MB_OK);
StrDispose(Dest);
end;
Работа с памятью
Приложение, стартующее под управлением 32-разрядной версии Windows, получает в аренду 232 байт (4 Гбайт) виртуального адресного пространства, причем совсем не обязательно оснащать компьютер 4 гигабайтами дорогостоящего ОЗУ. В тот момент, когда для работы программы оперативной памяти окажется недостаточно, операционная система воспользуется услугами файла подкачки и перебросит на него часть информации. Именно поэтому мы говорим не о физической, а о виртуальной памяти. Каким образом Windows распределяет ячейки памяти между операционной системой и десятками клиентских приложений – достаточно сложный вопрос, который мы пока затрагивать не будет. Мы лишь познакомимся с рядом ключевых методов языка программирования Delphi, предназначенных для резервирования области памяти под наши данные.
Куча – это участок памяти, предназначенный для хранения данных изменяемой размерности.
Если в двух словах, то… в общем-то ничего сложного. И если вы не боитесь маленьких неприятностей, то можете попробовать немного поэкспериментировать с памятью. Но имейте в виду, что эксперименты окажутся по-настоящему увлекательными, а последствия (если вы только начинаете программировать) – попросту непредсказуемыми.
Таблица 3.11. Функции для работы с памятью
Функция | Модуль | Описание |
procedureNew(varP: Pointer); | System | Создает новую динамическую переменную и устанавливает указатель на нее. |
procedureDispose(varP: Pointer); | System | Очищает блок памяти, выделенный под динамическую переменную. |
procedureGetMem(var P: Pointer; Size: Integer); | System | Создает динамическую переменную и указатель P на блок памяти. |
procedureFreeMem(varP: Pointer[; Size: Integer]); | System | Освобождает блок памяти, связанный с указателем P. |
functionAllocMem(Size: Cardinal): Pointer; | Sysutils | Выделяет блок размером Size в куче памяти, обнуляет его и возвращает указатель. |
functionGetHeapStatus: THeapStatus; | System, ShareMem | Возвращает текущий статус менеджера памяти. Данные будут размещены в записи THeapStatus. |
procedureGetMemoryManager(varMemMgr: TMemoryManager); | System | Указывает на точки входа действующего в настоящее время менеджера памяти. Информация окажется в MemMgr(). |
procedureSetMemoryManager(constMemMgr: TMemoryManager); | System | Устанавливает точки входа функциям, инкапсулированным в менеджере памяти. Изменения окажут влияние на поведение стандартных процедур: GetMem(), ReallocMem() и FreeMem(). |
functionIsMemoryManagerSet : Boolean; | System | Указывает, был ли изменен стандартный менеджер памяти с помощью функции SetMemoryManager(). |
procedureReallocMem(varP: Pointer; Size: Integer); | System | Перераспределяет динамическую переменную, распределенную ранее функциями GetMem(), AllocMem() или ReallocMem(). |
functionSysFreeMem(P: Pointer): Integer; | System или ShareMem | Освобождает блок памяти, на который указывает Pointer. |
functionSysGetMem(Size: Integer): Pointer; | System или ShareMem | Выделяет Size байт и возвращает указатель на них. Если модуль ShareMem не используется, то блок выделяется в глобальной куче. |
functionSysReallocMem(P: Pointer; Size: Integer): Pointer; | System или ShareMem | Возвращает указатель на Size байт, при этом значение P сохраняется. |
functionCompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler; | Sysutils | Сравнивает содержимое двух блоков памяти по адресу P1 и P2 длиной Length байт. Возвращает true в случае полного соответствия. |
Модуль ShareMem обеспечивает подключение менеджера памяти, позволяющего разделять память между двумя и более процессами. Этот менеджер содержится в динамической библиотеке borlndmm.dll. Учтите это при установке созданных вами приложений на другие компьютеры, т.к. без этой библиотеки приложение, обращающееся к модулю ShareMem, не сможет работать.
Дата добавления: 2016-03-15; просмотров: 760;