Работа со строками
Свойства 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); |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Автор: 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: |
{ **** 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; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
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 **** >> О пользе типа 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; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Разные вопросы
Страница 15 из 21