Стандартные функции обработки строк:

1) Функция Length(Str: String) - возвращает длину строки (количество символов). Пример:

var
Str: String; L: Integer;
{ … }
Str:=’Hello!’;
L:=Length(Str); { L = 6 }

2) Функция SetLength(Str: String; NewLength: Integer) позволяет изменить длину строки. Если строка содержала большее количество символов, чем задано в функции, то “лишние” символы обрезаются. Пример:

var Str: String;
{ … }
Str:=’Hello, world!’;
SetLength(Str, 5); { Str = “Hello” }

3) Функция Pos(SubStr, Str: String) - возвращает позицию подстроки в строке. Нумерация символов начинается с единицы (1). В случае отсутствия подстроки в строке возращается 0. Пример:

var Str1, Str2: String; P: Integer;
{ … }
Str1:=’Hi! How do you do?’;
Str2:=’do’;
P:=Pos(Str2, Str1); { P = 9 }

4) Функция Copy(Str: String; Start, Length: Integer) - возвращает часть строки Str, начиная с символа Start длиной Length. Ограничений на Length нет - если оно превышает количество символов от Start до конца строки, то строка будет скопирована до конца. Пример:

var Str1, Str2: String;
{ … }
Str1:=’This is a test for Copy() function.’;
Str2:=Copy(Str1, 11, 4); { Str2 = “test” }

5) Функция Delete(Str: String; Start, Length: Integer) - удаляет из строки Str символы, начиная с позиции Start длиной Length. Пример:

var Str1: String;
{ … }
Str1:=’Hello, world!’;
Delete(Str1, 6, 7); { Str1 = “Hello!” }

6) Функции UpperCase(Str: String) и LowerCase(Str: String) преобразуют строку соответственно в верхний и нижний регистры:

var Str1, Str2, Str3: String;
{ … }
Str1:=’hELLo’;
Str2:=UpperCase(Str1); { Str2 = “HELLO” }
Str3:=LowerCase(Str1); { Str3 = “hello” }

Строки можно сравнивать друг с другом стандартным способом:

var Str1, Str2, Str3: String; B1, B2: Boolean;
{ … }
Str1:=’123′;
Str2:=’456′;
Str3:=’123′;
B1:=(Str1 = Str2); { B1 = False }
B2:=(Str1 = Str3); { B2 = True }

Если строки полностью идентичны, логическое выражение станет равным True.

Июнь 30, 2008 — Рубрика: Delphi
Метки: , ,

Работа со строковыми типами данных

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

Строка - это последовательность символов. В Object Pascal существует несколько строковых типов. Вот основные из них:Тип данных Максимальная длина Используемая память Используется для…
ShortString 255 символов от 2 до 256 байт Минимальная совместимость, хранение небольших строк
AnsiString около 2^31 символов от 4 байт до 2 Гб 8-битные символы (ANSI), DBCS ANSI, MBCS ANSI и т.д.
WideString около 2^30 символов от 4 байт до 2 Гб Юникод-символы - многопользовательские сервера, мультиязыковые приложения

Для большинства целей подходит тип AnsiString (иногда называется Long String).

Июнь 28, 2008 — Рубрика: Delphi
Метки: ,

Копирование методами Windows.

uses ShellApi;

function WindowsCopyFile(FromFile, ToDir : string) : boolean;
var F : TShFileOpStruct;
begin
F.Wnd := 0; F.wFunc := FO_COPY;
FromFile:=FromFile+#0; F.pFrom:=pchar(FromFile);
ToDir:=ToDir+#0; F.pTo:=pchar(ToDir);
F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
result:=ShFileOperation(F) = 0;
end;

// Пример копирования:
procedure TForm1.Button1Click(Sender: TObject);
begin
if not WindowsCopyFile(’C:\UTIL\ARJ.EXE’, GetCurrentDir) then
ShowMessage(’Copy Failed’);
end;

Июнь 19, 2008 — Рубрика: Delphi
Метки: , ,

Копирование методом LZExpand.

uses LZExpand;

procedure CopyFile(FromFileName, ToFileName : string);
var
FromFile, ToFile: File;
begin
AssignFile(FromFile, FromFileName);
AssignFile(ToFile, ToFileName);
Reset(FromFile);
try
Rewrite(ToFile);
try
if LZCopy(TFileRec(FromFile).Handle, TFileRec(ToFile).Handle)<0 then
raise Exception.Create(’Error using LZCopy’)
finally
CloseFile(ToFile);
end;
finally
CloseFile(FromFile);
end;
end;

Июнь 5, 2008 — Рубрика: Delphi
Метки: ,

Копирование методом Pascal.

type
TCallBack=procedure (Position,Size:Longint); {Для индикации процесса копирования}

procedure FastFileCopy(Const InfileName, OutFileName: String; CallBack: TCallBack);
Const BufSize = 3*4*4096; { 48Kbytes дает прекрасный результат }
type
PBuffer = ^TBuffer;
TBuffer = array [1..BufSize] of Byte;
var
Size : integer;
Buffer : PBuffer;
infile, outfile : File;
SizeDone,SizeFile: Longint;
begin
if (InFileName <> OutFileName) then
begin
buffer := Nil;
AssignFile(infile, InFileName);
System.Reset(infile, 1);
try
SizeFile := FileSize(infile);
AssignFile(outfile, OutFileName);
System.Rewrite(outfile, 1);
try
SizeDone := 0; New(Buffer);
repeat
BlockRead(infile, Buffer^, BufSize, Size);
Inc(SizeDone, Size);
CallBack(SizeDone, SizeFile);
BlockWrite(outfile,Buffer^, Size)
until Size < BufSize;
FileSetDate(TFileRec(outfile).Handle,
FileGetDate(TFileRec(infile).Handle));
finally
if Buffer <> Nil then Dispose(Buffer);
System.close(outfile)
end;
finally
System.close(infile);
end;
end else
Raise EInOutError.Create(’File cannot be copied into itself’);
end;

Июнь 1, 2008 — Рубрика: Delphi
Метки: ,