AnsiLeftStr — Функция Delphi


Содержание

AnsiLeftStr — Функция Delphi

не могу понять почему %-)
помогите кто может!

А где она стандартная?

Понял где.
И как она не работает?

>Южанин
Может имелось ввиду TrimLeft и TrimRight ?

>Reindeer Moss Eater
Где ?
Я что-то не нашёл.

>Reindeer Moss Eater
Вот незадача ! А я в D5 пишу. :)

Reindeer Moss Eater
Ты попробуй ее применить хотя бы как в примере из help»a
и сам увидишь как не работает.

У меня работает.

vStr:=LeftStr(«1234567890»,4);
showmessage(vStr); //vStr=1234

И именно так как в примере из help»a

кинь мне на мыло все файлы проекта кроме exe файла

Южанин, ты не забыл, что функции работать и не должны. Они должны возвращать результат?

не работает, я имел ввиду что не проходит компиляция на этой функции

а возвращение результата, что нельзя назвать работой?

файлы можешь выслать?

Нажми на имени функции F1 и прочитай имя модуля в котором она объявлена. После чего отредактируй секцию USES

модуль strutil
в uses добавлен
все равно не работает

Тебе не повезло

Южанин (15.11.02 15:02)
Раз не компилируется, то должно быть сообщение об ошибке

[Error] Unit1.pas(7): Declaration expected but identifier «StrUtils» found

Тебе следует изучить структуру паскалевского модуля. Жить станет легче, жить станет веселей.

Переустановил Delphi и все заработало!
Так ни чего и не понял, что за глюк.
Всем спасибо за внимание!

AnsiLeftStr — Функция Delphi

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Группа: Администраторы
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

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

А вот что получилось у меня:

// Функции для работы с ini файлами и для разбора строк
// Проверка строки на содержание данных (ini file)
function TestStr(Str: string): Boolean;
// Проверка строки на наличие коментария (ini file)
function TestCommentStr(Str: string): Boolean;
// Извлекает строку до символа #13(#10) и вырезает её из основной строки (Str)
function ExtractStr(var Str: string; AutoTrim: Boolean = False; Ex: Boolean = False): string;
// Извлекает строку до разделителя Sep и вырезает её из основной строки (Str)
function ExtractStrSep(Sep: string; var Str: string; Ex: Boolean = False): string;
// Извлекает параметр ParName из списка строк Str и помещает его в ParStr, в случае неудачи возвращает False (ini file)
function ExtractValue(Str, ParName: string; var ParStr: string): Boolean;
// Преобразует масив в виде строки в масив Delphi
function ExtractMasToStaticArray(Source: string; var Dest: array of string): Boolean;
// Преобразует масив Delphi в масив Delphi в виде строки
function InvolvingStaticArrayToMas(var Dest: string; Source: array of string): Boolean;
// Преобразует масив в виде строки в список строк разделённых #13#10
function ExtractMasToStr(Source: string; var Dest: string): Boolean;
// Преобразует список строк разделённых #13#10 в масив в виде строки
function InvolvingStrToMas(Source: string; var Dest: string): Boolean;
// Похоже на ExtractStr, но с дополнительными возможностями (ini file)
function NextInfStr(var Str, ExtStr: string; NillStop: Boolean = False): Boolean;
// Ну тут вроде так будет ясно
function ReplaceStr(FindStr, ReplStr, EventStr: string; IgnoreCase: Boolean = False): string;
// Упаковывает строку в безопасную строку (%**)
function StrPak(Str: string; CharPak: string = »; CharNoPak: string = »): string;
// Распаковывает строку из безопасной строки (%**)
function StrUnPak(Str: string): string;

// Функции для работы со списками строк
function StrAddLine(AddStr: string; var Str: string): Boolean;
function StrInsLine(AddStr: string; var Str: string; Index: Integer): Boolean;
function StrDelLine(var Str: string; Index: Integer): Boolean;
function StrMoveLine(var Str: string; FromLine, ToLine: Integer): Boolean;
function StrGetLine(Str: string; Index: Integer): string;
function StrSetLine(NewStr: string; var Str: string; Index: Integer): Boolean;
function StrFindLine(FindStr, Str: string; Start: Integer; IgnoreCase: Boolean = False): Integer;
function StrFindBeginLine(Str: string; Index: Integer; Start: Integer = 1): Integer;
function StrLenLine(Str: string; Start: Integer): Integer;
function StrCountLine(Str: string): Integer;

// Функции преоразования
function IntToHex(Value: Integer; MinDigits: Byte = 2; MaxDigits: Byte = 8): string;
function HexToInt(Value: string; Def: Integer = 0): Integer;
function HexToIntDef(Value: string; var PosErr: Integer; Def: Integer = 0): Integer;
function NextWord(var Value: string; Splin: string = #32): string;
function StrToColor(Str: string): TColor;
// Просто возвращает параметр Value
function toconst(Value: string): string;
// «Фамилию Имя Отчество» преобразует в «Фамилия И О»
function FIOToShortFIO(Value: string): string;
// Преобразует строку формата С в формат Delphi (преобразуются t r n и т.д.)
function CtoPasStr(S: PChar): string;
// Генерирует случайный пароль
function GeneratePassword(Size: Byte = 8; Chars: string = ‘abcdefghijklmonqrstuvwxyz’): string;

Группа: Пользователи
Сообщений: 156
Пол: Мужской

function ReplaceStr(FindStr, ReplStr, EventStr: string; IgnoreCase: Boolean = False): string;

Есть стандартная функция — StringReplace

function StrInsLine(AddStr: string; var Str: string; Index: Integer): Boolean;

Есть стандартная функция — Insert

function StrDelLine(var Str: string; Index: Integer): Boolean;

Есть стандартная функция — Delete

function StrFindLine(FindStr, Str: string; Start: Integer; IgnoreCase: Boolean = False): Integer;

Есть стандартные функции — Pos, AnsiPos и т.п.

function StrLenLine(Str: string; Start: Integer): Integer;
function StrCountLine(Str: string): Integer;

// Функции преоразования
function IntToHex(Value: Integer; MinDigits: Byte = 2; MaxDigits: Byte = 8): string;
function HexToInt(Value: string; Def: Integer = 0): Integer;

Есть стандартные одноимённые функции IntToHex, HexToInt

function StrToColor(Str: string): TColor;
// Просто возвращает параметр Value

А RTTI нельзя использовать?

Все всегда уезжают навсегда. Вернуться невозможно-вместо нас всегда возвращается кто-то другой

Группа: Пользователи
Сообщений: 156
Пол: Мужской

Вот некоторые стандартные функции дельфи по работе со строками:

AdjustLineBreaks function
AnsiCompareStr function
AnsiCompareText function
AnsiContainsStr function
AnsiContainsText function
AnsiDequotedStr function
AnsiEndsStr function
AnsiEndsText function
AnsiExtractQuotedStr function
AnsiIndexStr function
AnsiIndexText function
AnsiLeftStr function
AnsiLowerCase function
AnsiMatchStr function
AnsiMatchText function
AnsiMidStr function
AnsiPos function
AnsiQuotedStr function
AnsiReplaceStr function
AnsiReplaceText function
AnsiResemblesProc variable
AnsiResemblesText function
AnsiReverseString function
AnsiRightStr function
AnsiSameStr function
AnsiSameText function
AnsiStartsStr function
AnsiStartsText function
AnsiUpperCase function
CompareStr function
CompareText function
Concat function
Copy function
DecodeSoundExInt function
DecodeSoundExWord function
Delete procedure
DupeString function
Insert procedure
IsDelimiter function
LastDelimiter function
LeftBStr function
LeftStr function
Length function
LowerCase function
MidBStr function
MidStr function
NullStr constant
Pos function
PosEx function
QuotedStr function
ReverseString function
RightBStr function
RightStr function
SameText function
SetLength procedure
SetString procedure
SoundEx function
SoundExCompare function
SoundExInt function
SoundExProc function
SoundExSimilar function
SoundExWord function
Str procedure
StringOfChar function
StringReplace function
StuffString function
Trim function
TrimLeft function
TrimRight function
UpperCase function
Val procedure
WideLowerCase function
WideSameStr function
WideSameText function
WideUpperCase function
WrapText function
BinToHex procedure
BoolToStr function
FalseBoolStrs variable
HexToBin function
StrToBool function
StrToBoolDef function
StrToInt function
StrToInt64 function
StrToInt64Def function
StrToIntDef function
TrueBoolStrs variable
TryStrToBool function
TryStrToInt function
TryStrToInt64 function
MatchesMask function
AnsiStrComp
AnsiStrIComp
AnsiStrLComp
AnsiStrLIComp
StrComp
StrIComp
StrLComp
StrLIComp
AnsiStrLower
AnsiStrUpper
StrLower
StrUpper
StrCat
StrLCat
AnsiStrPos
AnsiStrScan
AnsiStrRScan
StrPos
StrScan
StrRScan
StrCopy
StrLCopy
StrECopy
StrMove
StrPCopy
StrPLCopy

В общем — читайте хэлп и исходники, иногда помогает.

Все всегда уезжают навсегда. Вернуться невозможно-вместо нас всегда возвращается кто-то другой

Группа: Администраторы
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

function ReplaceStr(FindStr, ReplStr, EventStr: string; IgnoreCase: Boolean = False): string;

Есть стандартная функция — StringReplace

function StrInsLine(AddStr: string; var Str: string; Index: Integer): Boolean;

Есть стандартная функция — Insert

function StrDelLine(var Str: string; Index: Integer): Boolean;

Есть стандартная функция — Delete

function StrFindLine(FindStr, Str: string; Start: Integer; IgnoreCase: Boolean = False): Integer;

Есть стандартные функции — Pos, AnsiPos и т.п.

// Функции преоразования
function IntToHex(Value: Integer; MinDigits: Byte = 2; MaxDigits: Byte = 8): string;
function HexToInt(Value: string; Def: Integer = 0): Integer;

Есть стандартные одноимённые функции IntToHex, HexToInt

Если программа пишется без VCL то эти функции пригодятся

function StrToColor(Str: string): TColor;
// Просто возвращает параметр Value

А RTTI нельзя использовать?

Многие написанные мною функцию имеют одноимённые функции так как многие мои функции только корректируют работу стандартных и в нутри происходит обращение к стандартным функцим. Приведу примеры:

function StrToColor(Str: string): TColor;
begin
if Str=» then
begin
Result := 0;
Exit;
end;
if Str[1]=’#’ then
Str[1] := ‘$’;
if not IdentToColor(Str, Longint(Result)) and
not IdentToColor(‘cl’+Str, Longint(Result)) then
Result := TColor(StrToInt(Str));
end;

function StrAddLine(AddStr: string; var Str: string): Boolean;
var
L: Integer;
begin
Result := Pos(#13, AddStr)=0;
if Result then
begin
L := Length(Str);
if (L>0) and (Str[L]<>#13) and ((L=1) or (Str[L]<>#10) or (Str[L-1]<>#13)) then
Str := Str+#13#10;
Str := Str+AddStr+#13#10;
end;
end;

function StrInsLine(AddStr: string; var Str: string; Index: Integer): Boolean;
var
P: Integer;
begin
P := StrFindBeginLine(Str, Index);
if P 0;
if not Result then Exit;
L := StrFindBeginLine(Str, 1, P);
if L>0 then
Delete(Str, P, L-P)
else
Setlength(Str, P-1);
Result := True;
end;

Группа: Пользователи
Сообщений: 156
Пол: Мужской

1) из описания не очень то понятно отличие от стандартных
2) Зачем использовать строки с #13#10? Для этого используют потомков TStrings, и вместо нагромождения функций, лучше было написать свой класс от TStrings со всеми нужными методами

Кстати у меня есть модуль для работы со строками примерно раз в 30 больше, прислать?

Все всегда уезжают навсегда. Вернуться невозможно-вместо нас всегда возвращается кто-то другой

AnsiLeftStr — Функция Delphi

I can get some characters from the right or left of a string via Right or Left function in VB, I don’t know if there was similar function in Delphi?
Thanks..

EX: right(«SampleString»,3) will return «ing»

aquarianboy
View Public Profile
Send a private message to aquarianboy
Visit aquarianboy’s homepage!
Find all posts by aquarianboy

well, not as far as I know of.. but you could try this:

procedure TForm1.Button1Click(Sender: TObject);
var S: string;
begin
s:= ‘MySampleString’;
Showmessage(Copy(S, Length(S)-2, 3));
end;

For more help, see Delphi’s help on the Subject «Copy function»

Ted On The NeT
View Public Profile
Visit Ted On The NeT’s homepage!
Find all posts by Ted On The NeT

you can use the following functions:

function LeftStr(InValue: String, Len: Integer): String;
begin
Result := Copy(InValue, 1, Len);
end;

function RightStr(InValue: String, Len: Integer): String;
begin
Result := Copy(InValue, Length(InValue)-(Len — 1), Len));
end;

Hope this helps,

Please click on Accept if this helped.

And if you don’t know how to get the left and right out of the copy:

function left(const s:string; count:integer):string;
begin
result:=copy(s,1,count);
end;
function right(const s:string; count:integer):string;
var
p: integer;
begin
p:=length(s)-count+1;
if p

AnsiLeftStr Routine

Unit Edit

Description Edit

(Please provide a description in your own words. It is illegal to use the wording from the Delphi Help.)

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

Скобки

Добавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными.

Возможность перегрузки

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

procedure Test (I: integer); overload;
procedure Test (S: string); overload;
procedure Test (D: double); overload;

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

Передача параметров

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

Передача параметров по значению

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

procedure Test(s: string);

При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.

Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Этот способ передачи является у большинства самым излюбленным, но в тоже время является и самым не практичным, т.к. для выполнения метода выделяется дополнительная память для создания точной копией передаваемой переменой. Для решения этой проблемы следует использовать один из способов описанных ниже.

Передача параметров по ссылке

Pascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции.

procedure ChangeMe(var x: longint);
begin
x := 2; // Параметр х изменен вызванной процедурой
end;

Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.

Передача параметров констант

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

procedure Test(const s: string );

Передача открытых массивов

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

function AddEmUp(A: array of integer): integer;

В открытом массиве можно передавать переменные, константы или выражения из констант.

Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf.

Object Pascal также поддерживает тип array of const, который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

procedure WhatHaveIGot( A: array of const );

Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

procedure WhatHaveIGot( [‘Text’, 10, 5.5, @WhatHaveIGot, 3.14, true, ‘c’] );

При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

PVarRec = ^TVarRec;
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;

Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно приведенных значений.

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

procedure WhatHaveIGot( A: array of const );
var
i: integer;
TypeStr: string;
begin
for i := Low(A) to High(A) do
begin
case A[i].VType of
vtInteger : TypeStr := ‘Integer’;
vtBoolean : TypeStr := ‘Boolean’;
vtChar : TypeStr := ‘Char’;
vtExtended : TypeStr := ‘Extended’;
vtString : TypeStr := ‘String’;
vtPointer : TypeStr := ‘Pointer’;
vtPChar : TypeStr := ‘PChar’;
vtObject : TypeStr := ‘Object’;
vt ;
vtW ;
vtPW ;
vtAnsiString : TypeStr := ‘AnsiString’;
vtCurrency : TypeStr := ‘Currency’;
vtVariant : TypeStr := ‘Variant’;
vtInterface : TypeStr := ‘Interface’;
vtW ;
vtInt64 : TypeStr := ‘Int64’;
end;
ShowMessage( Format( ‘Array item %d is a %s’, [i, TypeStr] ) );
end;
end;

Значения параметров по умолчанию

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

procedure HasDefVal( s: string; i: integer = 0 );

Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае — как обычно, с указанием обоих параметров:

procedure HasDefVal( ‘Hello’, 26 );


Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию:

procedure HasDefVal( ‘Hello’ );

При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах:

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

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

function Add( I1, I2: integer ): integer;
begin
Result := I1 + I2;
end;

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

function Add( I1, I2: integer; I3: integer = 0 ): integer;
begin
Result := I1 + I2 + I3;
end;

Директива

Директива <$X->запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен (<$X+>). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора <$X->.

В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени — все зависит от того, где она расположена — в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции.

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

Работа со строками в Delphi 10.1 Berlin

Автор: Alex. Опубликовано в Программирование 31 Январь 2020 . просмотров: 23127

Для работы со строками в последних версиях Delphi разработчикам доступно большое количество функций, помимо которых ещё есть помощники для работы со строками, такие как TStringHelper, TStringBuilder и TRegEx. Во всём этом разнообразии бывает сложно найти нужную функцию. Я попытался разобраться, что есть в Delphi 10.1 Berlin для работы со строками и как этим всем пользоваться.

Итак, прежде чем начнём разбираться с функциями, замечу, что начиная с Delphi XE3, появился помощник TStringHelper, и теперь работать со строками можно как с записями. Т.е., если вы определили переменную со строкой (на картинке снизу – это myStr), то вы можете поставить точку и посмотреть, какие функции доступны. Это очень удобно.

Кстати аналогичные помощники появились и для работы с типами Single, Double и Extended: TSingleHelper, TDoubleHelper и TExtendedHelper.

Ну и конечно, помимо помощника TStringHelper, никуда не делся класс TStringBuilder, который используется для работы со строкой как с массивом, и который является полностью совместимым с .NET классом StringBuilder.

А для работы с текстовыми документами незаменимым окажется класс TRegEx, который является обёрткой над библиотекой PCRE, позволяющий использовать регулярные выражения для поиска, замены подстрок и расщепления текста на части.

Все приведённые в статье примеры сделаны с помощью Delphi 10.1 Berlin, поэтому в других версиях Delphi их работа не гарантируется.

Вот основные моменты, которые мы рассмотрим в статье:

Строки в Delphi

В последних версиях Delphi тип string, обозначающий строку, является псевдонимом встроенного типа System.UnicodeString. Т.е. когда вы объявляете переменную str: string, то автоматически вы объявляете переменную типа UnicodeString.

Кстати, на платформе Win32 вы можете использовать директиву « », которая превратит тип string в ShortString. С помощью этого способа вы можете использовать старый 16-битный код Delphi или Turbo Pascal в ваших проектах.

Обратите внимание, что кроме типа UnicodeString и ShortString в Delphi есть и другие типы строк, такие как AnsiString и WideString, однако дальше в статье мы будем рассматривать только работу со строками типа string.

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

Инициализация строк

Конечно, начнём мы с инициализации строк. Итак, рассмотрим объявление переменной с типом string.

В этой строчке кода мы объявляем переменную s с типом string, т.е., как было написано выше, по умолчанию с типом UnicodeString. Объявленные переменные с типом UnicodeString, в которые не присвоено значение, всегда гарантированно содержат строку нулевой длины. Чтобы теперь в переменной s была нужная нам строка, нужно просто присвоить переменной другое значение, например:

Это самый простой и часто используемый способ инициализации. Кроме этого есть ряд полезных функций, которые пригодятся вам для инициализации строк в некоторых ситуациях (здесь и далее я буду давать полный код проекта консольного Win32 приложения):

Изменение регистра

Для изменения регистра строк в Delphi есть функции LowerCase, UpperCase, TStringHelper.ToLower, TStringHelper.ToUpper, TStringHelper.ToLowerInvariant и TStringHelper.ToUpperInvariant. В нижний регистр строки меняют функции LowerCase, TStringHelper.ToLower и TStringHelper.ToLowerInvariant, остальные – в верхний. Обратите внимание, что функции LowerCase и UpperCase не работают с кириллицей. Функции TStringHelper.ToUpperInvariant и TStringHelper.ToLowerInvariant всегда работают независимо от текущей пользовательской локали. Вот примеры использования функций:

Конкатенация строк

Здесь конечно самый простой вариант – это использование оператора +. Но есть и другие варианты, например, функция Concat. А если вам нужно в цикле добавлять в конец одной строки большое количество других строк, то здесь пригодится метод Append класса TStringBuilder. Вот пример использования перечисленных способов:

Во всех четырёх переменных, после выполнения нашей программы, будет следующая строка: «Абвгдеёжзиклмнопрст». Четвёртый способ выглядит более громоздким, но у такого способа есть три преимущества. Во-первых, при большом количестве конкатенаций этот способ даст выигрыш по времени по сравнению с первыми тремя способами. Во-вторых, при создании объекта TStringBuilder вы сразу можете задать нужный размер массива для хранения строки, если он конечно известен. Это тоже даст выигрыш по времени. В-третьих, функция Append принимает на вход не только строки, но и другие типы, такие как Integer и Single, автоматически преобразуя их в строку.

Третий способ удобно использовать, если нужно сложить строки, находящиеся в массиве или списке. К тому же здесь первым параметром можно задать строку-разделитель, которая будет вставлена между строками, взятыми из массива. Вот пример, в котором формируется строка со списком городов, разделённых запятыми:

В результате выполнения этой функции получится строка «Москва, Санкт-Петербург, Севастополь».

Вставка подстроки в строку

Для того чтобы вставить внутрь строки подстроку вы можете использовать процедуру Insert или функцию TStringHelper.Insert. У класса TStringBuilder тоже есть аналогичная функция. Кстати, функция TStringBuilder.Insert, кроме строк умеет вставлять и другие типы, такие как Integer и Single, автоматически преобразуя их в строку. Вот пример использования:

Обратите внимание, в процедуре Insert нумерация символов начинается с 1, а в функциях TStringHelper.Insert и TStringBuilder.Insert – с 0. Все приведённые способы меняют строку, хранящуюся в переменной.

Удаление части строки

Допустим, вам нужно удалить из строки часть символов. Здесь нам помогут процедура Delete и функция TStringHelper.Remove. У класса TStringBuilder тоже есть функция Remove. Вот примеры использования:

Во всех трёх способах из строки «Абвгд» получится строка «Агд». Обратите внимание, что в процедуре Delete нумерация символов начинается с 1, а в функциях Remove – с 0.

Также интересно, что функция TStringHelper.Remove не трогает исходную строку. Вместо этого она возвращает новую строку с удалёнными символами. Именно поэтому мы присваиваем результат обратно в переменную. Процедура Delete работает по-другому: она меняет исходную строку.

Помимо приведённых здесь вариантов, для удаления части строки можно использовать функции замены подстроки, просто для этого искомая подстрока заменяется на пустую, например, StringReplace(str1, substr1, »).

Копирование части строки

Здесь идёт речь о том, что часть длиной строки нужно скопировать в новую строку или массив символов. Для этого в Delphi есть функции LeftStr, RightStr, Copy, TStringHelper.Substring и TStringHelper.CopyTo. А в классе TStringBuilder – только функция CopyTo. Есть также функция MidStr в юните System.StrUtils, которая работает аналогично функции Copy, поэтому в примере её не будет.

Первые два способа копируют часть строки слева (функция LeftStr) или справа (RightStr). Остальные четыре способа подходят, как для копирования части строки слева или справа, так и из середины.

В способах 3-6 из примера мы получим сроку «вгд» или массив [‘в’, ‘г’, ‘д’]. Обратите внимание, что в функциях Copy и MidStr нумерация символов начинается с 1, а во всех остальных с 0. Исходная строка или массив символов во всех четырёх способах не меняется.

Сравнение строк

Конечно, сравнивать строки можно с помощью операторов =, , >= и <>. Но кроме этого существуют ещё много функций: StrComp, StrIComp, StrLComp, StrLIComp, CompareStr, CompareText, TStringHelper.Compare, TStringHelper.CompareOrdinal, TStringHelper.CompareTo, TStringHelper.CompareText, SameStr, SameText, TStringHelper.Equals и TStringBuilder.Equals. Функции SameText, StrIComp, CompareText, TStringHelper.CompareText и TStringHelper.Compare умеют производить регистронезависимое сравнение строк, остальные функции и операторы — регистрозависимое.

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

Самая продвинутая здесь функция – это TStringHelper.Compare. С помощью неё можно сравнивать не только целые строки, но и части строк. Здесь можно настроить зависимость от регистра, включить игнорирование символов и знаков препинания или сравнение цифр как чисел и т.д.

Операторы, а также функции TStringHelper.Equals и TStringBuilder.Equals, в результате сравнения, отдадут вам True, если условие верно, и False, если условие не верно. Функции CompareStr, CompareText, TStringHelper.Compare, TStringHelper.CompareTo, TStringHelper.CompareOrdinal и TStringHelper.CompareText работают по-другому. Они сравнивают строки с точки зрения сортировки. Функции возвращают отрицательное число, если строка, указанная в первом параметре, сортируется до строки, указанной во втором параметре, положительное число — если первая строка сортируется после второй и 0 – если строки равны.

Функции SameStr, SameText, TStringHelper.Equals и TStringBuilder.Equals сравнивают строки на соответствие.

Итак, вот примеры использования вышеперечисленных функций и операторов:

Поиск подстроки в строке

Теперь давайте посмотрим, как можно найти подстроку (определённую последовательность символов) в строке. Здесь у вас есть большой выбор функций, которые возвращают либо индекс найденной подстроки, либо true или false в зависимости от того, найдена подстрока в строке или нет. Итак, давайте перечислим все функции для поиска подстроки:

В первую очередь – это функция Pos, которая ищет подстроку, начиная с указанного номера символа. Функция осуществляет регистрозависимый поиск. Здесь нумерация символов начинается с 1. Если подстрока найдена, то возвращается номер первого символа найденной подстроки, иначе – 0. Есть также функция PosEx (в юните System.StrUtils), которая работает абсолютно также. Вот пример использования функции Pos:

Аналогично функции Pos работают и функции IndexOf и LastIndexOf помощника TStringHelper. Они также осуществляют регистрозависимый поиск. Функция IndexOf ищет подстроку (или символ) с начала и до конца строки, а функция LasIndexOf – наоборот, т.е. с конца и до начала. Если подстрока найдена, то функции возвращают индекс первого символа найденной подстроки в строке. Здесь нумерация символов начинается с 0. Если подстрока не найдена, то функции возвращают -1. Также при поиске вы можете задать начало и интервал поиска. Вот примеры использования этих функций:

Теперь рассмотрим функции для проверки, есть ли подстрока в строке, и не важно, в каком месте. Для этого есть функции ContainsStr и ContainsText в юните System.StrUtils, а также функция Contains в помощнике TStringHelper.Contains. Функции ContainsStr и TStringHelper.Contains – регистрозависимые, а функция ContainsText – нет. Вот примеры использования этих функций:

Дополнительно есть функции проверяющие, наличие определённой подстроки в начале или в конце текста. Это функции StartsStr, StartsText, EndsStr и EndsText в юните System.StrUtils, а также функции StartsWith, EndsWith и EndsText у помощника TStringHelper. Функции StartsStr и EndsStr регистрозависимые, функции StartsText, EndsText и TStringHelper.EndsText регистронезависимые, а у функций TStringHelper.StartsWith и TStringHelper.EndsWith есть второй параметр для выбора режима поиска. Учтите, что регистронезависимый поиск в функции TStringHelper.StartsWith работает только с буквами латинского алфавита. По умолчанию поиск в функциях TStringHelper.StartsWith и TStringHelper.EndsWith регистрозависимый.

Обратите внимание, что регистронезависимый поиск в функциях StartsText, EndsText и TStringHelper.EndsText и TStringHelper.EndsWith ведётся для текущей локали. Т.е. если на компьютере будет установлена английская локаль, то регистронезависимый поиск по русскому тексту работать не будет.

Вот примеры использования функций:

И конечно самые продвинутые условия для поиска подстрок можно задавать при помощи регулярных выражений. Для этого есть функции TRegEx.Match и TRegEx.Matches. Вот несколько примеров использования этих функций:

Примеры и описание регулярных выражений смотрите на сайте библиотеки PCRE.

Поиск символов в строке

Случается, что нужно найти определённые символы в строке. Конечно, для этого вы можете воспользоваться функциями для поиска подстроки, о которых было написано выше, но есть и специальные функции, позволяющие найти первый попавшийся в строке символ из нескольких искомых. Это функции помощника TStringHelper: IndexOfAny, IndexOfAnyUnquoted и LastIndexOfAny. Функции IndexOfAny и IndexOfAnyUnquoted ищут, перебирая символы сначала до конца строки, а функция LastIndexOfAny – наоборот. Во всех функциях можно указать интервал поиска. Функция IndexOfAnyUnquoted умеет игнорировать символы, заключенные в кавычки, скобки и т.п. Вот пример использования этих функций:

Замена подстроки в строке

Для поиска и замены подстроки (или символа) в строке можно использовать функции StringReplace, ReplaceStr и ReplaceText, TStringHelper.Replace, TStringBuilder.Replace и TRegEx.Replace. Функции ReplaceStr и TStringBuilder.Replace – регистрозависимые, функция ReplaceText – регистронезависимая, в функциях StringReplace, TStringHelper.Replace и TRegEx.Replace зависимость от регистра настраивается флажком rfIgnoreCase. Функции TRegEx.Replace ищут подстроку, используя регулярные выражения. В функции TStringBuilder.Replace можно задать диапазон поиска подстроки. Вот примеры использования этих функций:

Обрезка пробелов и управляющих символов

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

Выравнивание текста за счёт установки пробелов

И напоследок ещё пара интересных функций, которые умеют дополнять строку пробелами или другими символами, пока она не станет нужной длины. Это функции TStringHelper.PadLeft и TStringHelper.PadRight. С помощью этих функций, например, для лучшего восприятия можно добавить пробелы в начало чисел, которые вы выдаёте столбиком в консоли или дополнить числа ведущими нулями. Вот пример использования этих функций:

Вместо заключения

Итак, в статье я постарался собрать все возможные функции Delphi, которые постоянно нужны при работе со строками. Надеюсь, вы найдёте в этой статье что-то новое и интересное для себя. Если я упустил что-то важное на ваш взгляд, просьба не держать это в себе, а написать об этом в комментариях.

LeftStr Function

Declaration: function LeftStr(const AString: AnsiString; const Count: Integer): AnsiString;overload; function LeftStr(const AString: WideString; const Count: Integer): WideString; overload;

Description

Returns a string containing a specified number of characters from the left side of a string.

AString represents a string expression from which the leftmost characters are returned. Count indicates how many characters to return. If 0, a zero-length string («») is returned. If greater than or equal to the number of characters in AString, the entire string is returned.

Использование DLL С# в Delphi использует только первый параметр функции

Я использую С# DLL Export (UnmanagedExports — https://www.nuget.org/packages/UnmanagedExports), чтобы сделать мою управляемую С# DLL доступной для неизмененного кода, такого как Delphi. Моя проблема в том, что только первый параметр функции передается из delphi в С# dll:

Часть Delphi (вызывающая часть):

Проблема в этом случае состоит в том, что заполняется только data2. data1 никогда не заполняется. Я уже пробовал StdCall и Cdecl.

Редактировать:

Выполняется следующая работа (data1 и data2 ist переданы правильно) — возвращаемое значение изменено с строки на boolean:

Теперь я должен думать о возвращаемом значении или буфере aa, чтобы вернуть строку результата обратно в delphi.

Edit2:

Я пошел с предложением Дэвида Хеффернана использовать параметр out:

Проблема — это возвращаемое значение string . В Delphi string является управляемым типом. Кроме того, таким типам дается несколько необычное лечение. Фактически они передаются как дополнительный неявный параметр var , после всех остальных параметров. Код С# передает возвращаемое значение через регистр.

Это означает, что функция С# имеет 2 параметра, но функция Delphi имеет 3 параметра. Это несоответствие, объясняющее поведение.

В любом случае возврат строки из С# приводит к указанию на нуль-завершенный массив символов, которые сортируются. Это, безусловно, не маршалируется как строка Дельфы.

У вас есть несколько доступных решений:

  1. Оставьте С# самостоятельно и измените возвращаемый тип Delphi на PAnsiChar . Или PWideChar если вы выберете возвращаемое значение С# как LPWStr . Вам нужно будет освободить указатель, вызвав CoTaskMemFree
  2. Измените С#, чтобы принять буфер, назначенный вызывающим абонентом, который он заполняет. Для этого потребуется StringBuilder со стороны С#. И прохождение длины буфера.
  3. Измените С#, чтобы использовать параметр out string типа, отсортированный как UnmanagedType.BStr . Это сопоставляется с WideString в Delphi.

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

BStr/WideString с BStr/WideString заключается в том, что Delphi ABI несовместим с Microsoft, см. Почему WideString не может использоваться как возвращаемое значение функции для взаимодействия? Вы можете обойти это, возвращая строку как параметр out а не возвращаемое значение функции.

Возвращая string С#, LPWStr как LPWStr , сопоставленную с PWideChar , у вас есть задача вызвать CoTaskMemFree для освобождения памяти. В общем, думаю, я бы выбрал этот вариант. Вот пример такого подхода.

Сравнение части строки

У меня проблема с Delphi.

Я должен сравнить строку из 4 символов, с данными в базе данных длиной 6 символов (почтовый индекс (Нидерланды)).

Что у меня сейчас есть:

Я искал в сети, и я обнаружил, что вы можете использовать ANISTRING. но это дает ошибку.

пропущенный оператор или точка с запятой

Что я должен делать?

Я обновил код

Дополнительная информация:

Мне нужно сравнить часть строки с данными в базе данных. Если я введу 5504BX в поле редактирования, dbgrid должен отобразить 5504LA 5504KJ все, что начинается с первых 4 чисел. буквы не имеют значения.

3 ответа

Я думаю, что вам нужно процитировать строку. Используйте QuotedStr.

Если вам нужен подстановочный матч, вы можете сделать

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

Вы объявили AnsileftStr как переменную, а затем пытаетесь использовать ее с синтаксисом, который выглядит как вызов функции с двумя аргументами. Вы пытаетесь вызвать функцию AnsiLeftStr из StrUtils ? Если это так, ваш код, вероятно, будет работать нормально, если вы удалите объявление переменной и убедитесь, что StrUtils находится в предложении использования .

Операции со строками Delphi

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

Примеры операции со строками Delphi

1) Функция length возвращает длину указанной строки. Данная функция обладает одним параметром, который представляет собой выражение, имеющее строковый тип данных. В качестве значения функции length выступает целое число, обозначающее количество символов, входящих в состав строки.

Примеры

b:=length(‘na beregu’);

В результате выполнения этих инструкций переменная a пример значение 6, а переменная b получит значение 9. 2)

2) Процедура delete. С помощью процедуры delete можно удалить определенную часть строки. Общий вид процедуры delete выглядит следующим образом:

  • строка обозначает переменную или константу с строковым типом данных;
  • n есть номер символа, начиная с которого удаляется заданная подстрока;
  • m представляет собой длину удаляемой впоследствии подстроки.

Пример

При выполнении инструкции

переменная st примет значение-строку ‘Город’. 3)

3) Функция роs. С помощью функции pos возможно определение положения подстроки в указанной строке. Общий вид инструкции функции pos представляется так:

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

Пример

При выполнении следующей инструкции:

Переменная n примет значение 2. В случае, если строка не содержит искомую подстроку, то функция pos возвращает значение 0. Приведем пример инструкции оператора while, которая позволит удалить начальные пробелы из указанной строки:

Здесь процедура delete(s, 1, 1) удаляет пробелы до тех пор, пока пробел есть начальный символ строки (то есть пока значение функции pos(‘ ‘,s) совпадает с единицей). Проверка условия length(s) > 0 применяется здесь для того, чтобы учесть возможность включения в строку только одних пробелов.

4) Функция copy выделяет фрагмент указанной строки. Общий вид инструкции функции copy представляется следующим образом:

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

Пример

При выполнении инструкции

town:=copy(s, 7, 12) ;

переменная town примет значение-строку ‘Екатеринбург‘.

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