// 1. ...............................................
Code: |
type TStrArray = arrayofstring;
function Explode(var a: TStrArray; Border, S: string): Integer; var S2: string; begin Result := 0; S2 := S + Border; repeat SetLength(A, Length(A) + 1); a[Result] := Copy(S2, 0,Pos(Border, S2) - 1); Delete(S2, 1,Length(a[Result] + Border)); Inc(Result); until S2 = ''; end; |
// How to use it:
Code: |
procedure TForm1.Button1Click(Sender: TObject); var S: string; A: TStrArray; AnzTokens, i: Integer; begin S := 'Ein=Text=durch=Geleichzeichen=getrennt'; AnzTokens := Explode(A, '=', S); for i := 0to AnzTokens -1do Memo1.Lines.Add(A[i]); end; |
// 2. ...............................................
Code: |
{ * These 2 functions are from the programming language PHP, unite certainly well-known. * Now one can use it also in Delphi:) }
{...}
//* Needed type declaration type TExplodeArray = arrayofString;
{...}
function Implode(const cSeparator: String; const cArray: TExplodeArray): String; var i: Integer; begin Result := ''; for i := 0to Length(cArray) -1dobegin Result := Result + cSeparator + cArray[i]; end; System.Delete(Result, 1, Length(cSeparator)); end;
function Explode(const cSeparator, vString: String): TExplodeArray; var i: Integer; S: String; begin S := vString; SetLength(Result, 0); i := 0; while Pos(cSeparator, S) > 0dobegin SetLength(Result, Length(Result) +1); Result[i] := Copy(S, 1, Pos(cSeparator, S) -1); Inc(i); S := Copy(S, Pos(cSeparator, S) + Length(cSeparator), Length(S)); end; SetLength(Result, Length(Result) +1); Result[i] := Copy(S, 1, Length(S)); end; |
Взято с сайтаhttps://www.swissdelphicente
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
{ **** UBPFD *********** by delphibase.endimus **** >> Быстрые функции сжатия пробелов и управляющих символов в строке.
Функции удаляют из строки начальные и конечные пробелы и управляющие символы (меньшие пробела). Идущие подряд пробелы и управляющие символы в середине строки заменяются одним пробелом.
Зависимости: нет Автор: Александр Шарахов, alsha @ mailru.com, Москва Copyright: Александр Шарахов
***************************************************** }
// Sha_SpaceCompress удаляет из Ansi-строки начальные и конечные пробелы // и управляющие символы (меньшие пробела). Идущие подряд пробелы // и управляющие символы в середине строки заменяются одним пробелом. // Исходная строка при этом не изменяется. Эта функция работает // медленнее, чем Sha_SpaceCompressInplace. С целью ускорения работы // освобождение неиспользуемой памяти за пределами строки не производится. // Если это критично, после вызова данной функции можно освободить память // следующим образом: s2:=Sha_SpaceCompress(s1); SetLength(s2,Length(s2)); // Функция не работает, если нарушен формат Ansi-строки, в частности, // если в конце строки отсутствует терминатор.
function Sha_SpaceCompress(const s: string): string; var p, q, t: pchar; ch: char; label rt; begin ; p := pointer(s); q := nil; if p <> nilthen begin ; t := p + (pinteger(p - 4))^; if p < t then begin ; repeat; dec(t); if p > t then goto rt; until (t^ > ' '); SetString(Result, nil, (t - p) + 1); q := pchar(pointer(Result)); repeat; repeat; ch := p^; inc(p); until ch > ' '; repeat; q^ := ch; ch := p^; inc(q); inc(p); until ch <= ' '; q^ := ' '; inc(q); until p > t; end; end; rt: if q <> nilthen begin ; dec(q); q^ := #0; (pinteger(pchar(pointer(Result)) - 4))^ := q - pointer(Result); end else Result := ''; end;
// Sha_SpaceCompressInplace удаляет из Ansi-строки начальные и конечные пробелы // и управляющие символы (меньшие пробела). Идущие подряд пробелы // и управляющие символы в середине строки заменяются одним пробелом. // Результат замещает исходную строку. С целью ускорения работы // освобождение неиспользуемой памяти за пределами строки не производится. // Если это критично, после вызова данной функции можно освободить память // следующим образом: Sha_SpaceCompressInpace(s); SetLength(s,Length(s)); // Процедура не работает, если нарушен формат Ansi-строки, в частности, // если в конце строки отсутствует терминатор.
procedure Sha_SpaceCompressInplace(var s: string); var p, q, t: pchar; ch: char; label rt; begin ; UniqueString(s); p := pointer(s); if p <> nilthen begin ; t := p + (pinteger(p - 4))^; if p < t then begin ; q := p; repeat; dec(t); if p > t then goto rt; until (t^ > ' '); repeat; repeat; ch := p^; inc(p); until ch > ' '; repeat; q^ := ch; ch := p^; inc(q); inc(p); until ch <= ' '; q^ := ' '; inc(q); until p > t; dec(q); rt: q^ := #0; (pinteger(pchar(pointer(s)) - 4))^ := q - pointer(s); end; end; end;
// Sha_SpaceCompressPChar удаляет из null-terminated строки начальные // и конечные пробелы и управляющие символы (меньшие пробела), за исключением // терминатора. Идущие подряд пробелы и управляющие символы в середине строки // заменяются одним пробелом. Результат замещает исходную строку. // Никакое перераспределения памяти не производится. // Функция не работает с read-only строкой.
function Sha_SpaceCompressPChar(p: pchar): pchar; var q: pchar; ch: char; label rt; begin ; Result := p; if (p <> nil) and (p^ <> #0) then begin ; q := p - 1; repeat; repeat; ch := p^; inc(p); if ch = #0then goto rt; until ch > ' '; inc(q); repeat; q^ := ch; ch := p^; inc(q); inc(p); until ch <= ' '; q^ := ' '; until ch = #0; rt: if q < Result then inc(q); q^ := #0; end; end; Пример использования:
s2 := Sha_SpaceCompress(s1); Sha_SpaceCompressInpace(s); Sha_SpaceCompressPChar(pch);
|
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
{ **** UBPFD *********** by kladovka.net **** >> Нестрогое сравнение строк
Зависимости: SysUtils Автор: Dimich, dvmospan pisem.net, ICQ:236286143, Bryansk Copyright: Владимир Кива
********************************************** }
unit FindCompare;
interface
//------------------------------------------------------------------------------ //Функция нечеткого сравнения строк БЕЗ УЧЕТА РЕГИСТРА //------------------------------------------------------------------------------ //MaxMatching - максимальная длина подстроки (достаточно 3-4) //strInputMatching - сравниваемая строка //strInputStandart - строка-образец
// Сравнивание без учета регистра // if IndistinctMatching(4, "поисковая строка", "оригинальная строка - эталон") > 40 then ...
function IndistinctMatching(MaxMatching : Integer; strInputMatching: WideString; strInputStandart: WideString): Integer; implementation
Uses SysUtils;
Type TRetCount = packedrecord lngSubRows : Word; lngCountLike : Word; end;
//-------------------------------------------- function Matching(StrInputA: WideString; StrInputB: WideString; lngLen: Integer) : TRetCount; Var TempRet : TRetCount; PosStrB : Integer; PosStrA : Integer; StrA : WideString; StrB : WideString; StrTempA : WideString; StrTempB : WideString; begin StrA := String(StrInputA); StrB := String(StrInputB); For PosStrA:= 1To Length(strA) - lngLen + 1do begin StrTempA:= System.Copy(strA, PosStrA, lngLen); PosStrB:= 1; For PosStrB:= 1To Length(strB) - lngLen + 1do begin StrTempB:= System.Copy(strB, PosStrB, lngLen); If SysUtils.AnsiCompareText(StrTempA,StrTempB) = 0Then begin Inc(TempRet.lngCountLike); break; end; end; Inc(TempRet.lngSubRows); end; // PosStrA Matching.lngCountLike:= TempRet.lngCountLike; Matching.lngSubRows := TempRet.lngSubRows; end; { function }
//----------------------------------------------------- function IndistinctMatching(MaxMatching : Integer; strInputMatching: WideString; strInputStandart: WideString): Integer; Var gret : TRetCount; tret : TRetCount; lngCurLen: Integer ; //текущая длина подстроки begin //если не передан какой-либо параметр, то выход If (MaxMatching = 0) Or (Length(strInputMatching) = 0) Or (Length(strInputStandart) = 0) Then begin IndistinctMatching:= 0; exit; end; gret.lngCountLike:= 0; gret.lngSubRows := 0; // Цикл прохода по длине сравниваемой фразы For lngCurLen:= 1To MaxMatching do begin //Сравниваем строку A со строкой B tret:= Matching(strInputMatching, strInputStandart, lngCurLen); gret.lngCountLike := gret.lngCountLike + tret.lngCountLike; gret.lngSubRows := gret.lngSubRows + tret.lngSubRows; //Сравниваем строку B со строкой A tret:= Matching(strInputStandart, strInputMatching, lngCurLen); gret.lngCountLike := gret.lngCountLike + tret.lngCountLike; gret.lngSubRows := gret.lngSubRows + tret.lngSubRows; end; If gret.lngSubRows = 0Then begin IndistinctMatching:= 0; exit; end; IndistinctMatching:= Trunc((gret.lngCountLike / gret.lngSubRows) * 100); end;
end. |
Пример использования:
Code: |
begin Relevant := FindCompare.IndistinctMatching (3, edFind.Text, edOriginal.Text); if Relevant > 40then ShowMessage('IMHO похожи!'); //.... end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Как в Run-time сгененрировать строку типа
'{821AB2C7-559D-48E0-A3EE-6DD50E83234C}'
Типа как в среде при нажатии Ctrl-Shift-G. Функция CoCreateGuid выводит значение типа TGUID, я нигде не нашёл функции конвертации TGUID -> String. Может кто знает такую функцию?
Автор:Vit
Взято с Vingrad ruhttps://forum.vingrad
Есть такая функция. Как ни странно называется она GUIDToString, и живет в SysUtils.
Автор:Fantasist
Взято с Vingrad ruhttps://forum.vingrad
Можно GUIDToString написать и вручную, будет выглядеть примерно так:
Code: |
procedure TForm1.Button1Click(Sender: TObject); var G: TGUID; S: string; i: Integer; begin CoCreateGuid(G); S := '{' + IntToHex(G.D1, 8) + '-' + IntToHex(G.D2, 4) + '-' + IntToHex(G.D3, 4) + '-'; for i := 0to7do begin S := S + IntToHex(G.D4[i], 2); if i = 1then S := S + '-' end; S := S + '}'; ShowMessage(GUIDToString(G) + #13 + S) end; |
Автор:Jin X
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
{ **** UBPFD *********** by delphibase.endimus **** >> О пользе типа shortstring при использовании WinAPI
Довольно значительное количество функций WinAPI принимают как параметры указатель на заполняемый ими массив символов и размер этого массива, а возвращают количество помещенных ими символов. Если мы работаем в ANSI (не Unicode), здесь удобно пользоваться короткими строками и "убивать двух зайцев" за один раз.
Зависимости: windows Автор: Павел Озерский, pavel @ insect.mail.iephb.ru, Санкт-Петербург Copyright: собственная разработка автора (Павел Озерский)
***************************************************** }
//пример:
function ClassName(hwnd: tHandle): shortstring; begin byte(Result[0]) := GetClassName(hwnd, pChar(@Result[1]), 255); end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Свойства text элемента управления является строкой, в свою очередь являющейся массивом символом. Вы не можете осуществить преобразование символа в строку. Тем не менее, вы можете получить доступ ко всем символам строки через их индекс.
Попробуйте это:
Code: |
var s: string; begin s := RevField.text; s[1] := chr(ord(s[1]) + 1); RevField.text := s; end; |
Здесь кроется 2 проблемы:
Для увеличения значения вам необходимо извлекать символы из строки.
Хотя вы можете получить доступ к отдельным символам через выделение подстроки, данный метод не срабатывает у некоторых свойств, таких как, например, свойство TStringField Text.
Лучшим решением, по-видимому, будет написание специфической функции. Например, в случае, если revision-символ всегда является конечным символом строки, функция могла бы выглядеть следующим образом:
Code: |
function IncrementTrailingVersionLetter(Str: string): string; begin Str[Length(Str)] := Char(Ord(Str[Length(Str)]) + 1); IncrementTrailingVersionLetter := Str; end;
и использовать ее следующим образом:
with RevField do Text := IncrementTrailingVersionLetter(Text); |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
{ **** UBPFD *********** by kladovka.net **** >> Получение параметра из строки по его индексу, а также получение общего числа параметров в строке
В юните представлены две функции, одна из которых, GetParamFromString, позволяет получить параметр из строки, по индексу этого параметра (индексация начинается с 1). Параметров в строке, я называю части строк, разделённые каким-нибудь оговорённым разделителем, например символом ";". К пример строка "fex;9x-1;code" имеет три параметра: fex 9x-1 code.
Описание аргументов функции GetParamFromString: SourceStr - строка, содержащая в себе параметры; Delimiter - разделитель параметров в строке; Ind - индекс запрашиваемого параметра.
Функция GetParamsCount просто возвращает количество параметров в строке. Описание аргументов функции GetParamsCount: SourceStr - строка, содержащая в себе параметры; Delimiter - разделитель параметров в строке;
Зависимости: Windows Автор: VID, ICQ:132234868, Махачкала Copyright: (c) не моё
********************************************** }
unit getstrparam;
interface
uses Windows;
function GetParamsCount (const SourceStr, Delimiter:String): integer; function GetParamFromString(const SourceStr,Delimiter:String; Ind:integer):string;
implementation
function GetDTextItem(DText,delimeter:pchar;var idx:integer):Pchar; var nextpos:Pchar;i,len, p:integer; begin result:=DText; len:=length(delimeter); if (len=0) or (DText='') then exit; i:=1; while TRUE do begin p:=pos(delimeter,result); if (p<>0) then nextpos:=pointer(integer(result)+p-1) else nextpos:=pointer(integer(result)+length(result)); if (i=idx) or (p=0) then break; result:=pointer(integer(nextpos)+len); inc(i); end; if i=idx then byte(nextpos^):=0else byte(result^):=0; end;
function GetDTextCount(DText,delimeter:pchar):integer; var subpos:Pchar;i,len:integer; begin result:=0; len:=length(delimeter); if (len=0) or (DText='') then exit; subpos:=DText; i:=pos(delimeter,subpos); while i<>0do begin inc(result); subpos:=pointer(integer(subpos)+i+len-1); i:=pos(delimeter,subpos); end; if (byte(subpos^))<>0then inc(result); end;
function GetParamsCount (const SourceStr, Delimiter:String): integer; begin Result:=GetDTextCount(PChar(SourceStr), PChar(Delimiter)); end;
function GetParamFromString(const SourceStr,Delimiter:String; Ind:integer):string; var TmpS, TmpRes:PChar; LRes:integer; begin GetMem (Tmps, Length(SourceStr)+1); try CopyMemory(Tmps, PChar(SourceStr), Length(SourceStr)); Byte(Pointer(Integer(Tmps)+Length(SourceStr))^):=0; TmpRes:=GetDTextItem(TmpS, PChar(Delimiter), Ind); LRes:=Length(TmpRes); SetLength(Result,LRes); CopyMemory(@Result[1], TmpRes, LRes); finally FreeMem(TmpS); end; end;
end. |
Пример использования:
Code: |
showmessage(GetParamFromString('1;2a;3;4', ';',2)); showmessage(inttostr(GetParamsCount('1;2;3;4', ';'))); |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Автор: Lloyd
Функция Soundex определяет схожесть звучания двух слов. Алгоритм Soundex опубликован в одной из статей журнала PC Magazine и предназначен для работы с английским языком (может кто-нибудь портирует для работы с нашим могучим? Пишите). Функции передается строка. Возвращаемое Soundex значение также имеет тип строки. Эта величина может сохраняться в базе данных или сравниваться с другим значением Soundex. Если два слова имеют одинаковое значение Soundex, можно предположить, что звучат они одинаково (более или менее).
Вы должны иметь в виду, что алгоритм Soundex игнорирует первую букву слова. Таким образом, "won" и "one" будут иметь различное значение Soundex, а "Won" и "Wunn" - одинаковое.
Soundex будет особенно полезен в базах данных, когда пользователь затрудняется с правописанием имен и фамилий.
Code: |
function Soundex(OriginalWord: string): string; var Tempstring1, Tempstring2: string; Count: integer; begin Tempstring1 := ''; Tempstring2 := ''; OriginalWord := Uppercase(OriginalWord); {Переводим исходное слово в верхний регистр} Appendstr(Tempstring1, OriginalWord[1]); {Используем первую букву слова} for Count := 2to length(OriginalWord) do {Назначаем числовое значение каждой букве, за исключением первой}
case OriginalWord[Count] of 'B', 'F', 'P', 'V': Appendstr(Tempstring1, '1'); 'C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z': Appendstr(Tempstring1, '2'); 'D', 'T': Appendstr(Tempstring1, '3'); 'L': Appendstr(Tempstring1, '4'); 'M', 'N': Appendstr(Tempstring1, '5'); 'R': Appendstr(Tempstring1, '6'); {Все другие буквы, цифры и знаки пунктуации игнорируются} end; Appendstr(Tempstring2, OriginalWord[1]); {Удаляем из результата все последовательно повторяющиеся цифры.}
for Count := 2to length(Tempstring1) do if Tempstring1[Count - 1] <> Tempstring1[Count] then Appendstr(Tempstring2, Tempstring1[Count]); Soundex := Tempstring2; {Это - значение soundex} end; |
SoundAlike - функция, проверяющая схожесть звучания двух слов. При схожести звучания она возвратит значение True и значение False в противном случае. Она демонстрирует пример использования функции Soundex.
Code: |
function SoundAlike(Word1, Word2: string): boolean; begin if (Word1 = '') and (Word2 = '') then result := True elseif (Word1 = '') or (Word2 = '') then result := False elseif (Soundex(Word1) = Soundex(Word2)) then result := True else result := False; end; |
Дополнение
Существует алгоритм ("параметрической корреляции", если я вообще правильно называю его), основанный на оценке схожести слов по количеству совпадающих букв идущих друг за другом. Примечание: буквы не обязательно идут *непосредственно* друг за другом, т.е. без других букв.
Пример:
Андрей vs. Андрей - 6
ндрей vs. Андрей - 5
Анрей vs. Андрей - 5
Андрей vs. Александр - 4
Андрей vs. Иннокентий - 2
АнXрей vs. Андрей - 3, но в то же время с другими словами результат
будет на уровне 0..2
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
function GetAnsistringRefcount(const S: string): Cardinal; asm or eax, eax jz @done sub eax, 8 mov eax, dword ptr [eax] @done: end;
procedure TForm1.Button1Click(Sender: TObject); var S1, S2: string; begin memo1.lines.Add(Format('Refcount at start: %d', [GetAnsistringRefcount(S1)])); S1 := StringOfChar('A', 10); memo1.lines.Add(Format('Refcount after assignment: %d', [GetAnsistringRefcount(S1)])); S2 := S1; memo1.lines.Add(Format('Refcount after S2:=S1: %d', [GetAnsistringRefcount(S1)])); S2 := S1 + S2; memo1.lines.Add(Format('Refcount after S2:=S1+S2: %d', [GetAnsistringRefcount(S1)])); end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
function GetAnsistringRefcount(const S: string): Cardinal; asm or eax, eax jz @done sub eax, 8 mov eax, dword ptr [eax] @done: end;
procedure TForm1.Button1Click(Sender: TObject); var S1, S2: string; begin memo1.lines.Add(Format('Refcount at start: %d', [GetAnsistringRefcount(S1)])); S1 := StringOfChar('A', 10); memo1.lines.Add(Format('Refcount after assignment: %d', [GetAnsistringRefcount(S1)])); S2 := S1; memo1.lines.Add(Format('Refcount after S2:=S1: %d', [GetAnsistringRefcount(S1)])); S2 := S1 + S2; memo1.lines.Add(Format('Refcount after S2:=S1+S2: %d', [GetAnsistringRefcount(S1)])); end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Code: |
{ **** UBPFD *********** by delphibase.endimus **** >> Проверка значения строки
Функция предназначена дла проверки значения строки.
Зависимости: нет Автор: Separator, vilgelm @ mail.kz, Алматы Copyright: Сергей Вильгельм
***************************************************** }
type TTypeStr = (tsString, tsDate, tsNumber);
function CheckString(const Value: string): TTypeStr; begin if StrToDateTimeDef(Value, 0) = 0then if StrToIntDef(Value, 0) = 0then Result := tsString else Result := tsNumber else Result := tsDate end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Страница 1 из 2