Свойства 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;