![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что я делаю не так? [D6, Win2k]
Ross © (2002-04-15 19:58:00)Здравствуйте. Вот код для чтения пословно, который я использую:
procedure TForm1.Button1Click(Sender: TObject);
var
i,n:integer;
s:string;
begin
n:= WordCount(Memo3.Lines.Text,[#13, " ",".",",",":",";"]); // Вот здесь наверное ошибка
for i:=1 to n-1 do
begin
s:= ExtractWord(i,Memo3.Lines.Text, [#13, " ",".",",",":",";"]); // И здесь
Table1.Findkey([s]);
Memo2.Lines.Add(Table1.Fields[1].text+" - "+Table1.Fields[2].text);
end;
end;
Все работает прекрасно, но если текст в Memo3 начинается с новой строки, или если в самом конце текста нет никакого символа, то получается читать только первую строку или до предпоследнего слова.. Я догадываюсь что не поставил еще несколько символов... Помогите.
P.S. Я использовал функции ExtractWord, WordCount и WordPosition из RXLib.
Ross (2002-04-16 14:26:00) [1]to Alx2:
Огромное спасибо. Код данный вами прекрасно работает. Еще раз спасибо.
To All:
Но все-таки, ради интереса, если использовать мою версию кода, почему не работает? Привожу полностью:
function WordCount(const s: string;
const WordDelims: TCharSet):integer;
var
Slen,i:cardinal;
begin
Result:=0;
i:=1;
Slen:=Length(s);
While i<=Slen do
begin
While (i<=Slen) and (s[i] in Worddelims) do Inc(i);
If i<=Slen then inc(result);
While (i<=Slen) and not (s[i] in Worddelims) do Inc(i);
end;
end;
function WordPosition(const N: Integer; const S: string;
const WordDelims: TCharSet): Integer;
var
Count, I: Integer;
begin
Count := 0;
I := 1;
Result := 0;
while (I <= Length(S)) and (Count <> N) do begin
while (I <= Length(S)) and (S[I] in WordDelims) do Inc(I);
if I <= Length(S) then Inc(Count);
if Count <> N then
while (I <= Length(S)) and not (S[I] in WordDelims) do Inc(I)
else Result := I;
end;
end;
function ExtractWord(N: Integer; const S: string;
const WordDelims: TCharSet): string;
var
I: Integer;
Len: Integer;
begin
Len := 0;
I := WordPosition(N, S, WordDelims);
if I <> 0 then
while (I <= Length(S)) and not(S[I] in WordDelims) do begin
Inc(Len);
SetLength(Result, Len);
Result[Len] := S[I];
Inc(I);
end;
SetLength(Result, Len);
end;
procedure TForm1.ToolButton1Click(Sender: TObject);
var
i,n:integer;
s:string;
begin
n:= WordCount(Memo3.Lines.Text,[#13#10," ",".",",",":",";"]);
pb.Min:=0;
pb.Position:=0;
pb.Max:=n;
for i:=1 to n-1 do
begin
s:= ExtractWord(i,Memo3.Lines.Text, [#13#10," ",".",",",":",";"]);
if Table1.Findkey([s])=true then
begin
Memo2.Lines.Add(Table1.Fields[1].text+" - "+Table1.Fields[2].text);
end
else
if Table1.Findkey([s])=false then
begin
Memo2.Lines.Add(s +" - ошибка");
end;
pb.Position:=i;
end;
pb.Position:=0;
end;
pb-это ПрогрессБар
kull (2002-04-16 14:17:00) [2]
>Ross © (16.04.02 10:56)
> for i:=1 to n-1 do наверное потому что результат WordCount
> начинается с 1. Если я не прав, поправьте.
Начинается то он с 1 а заканчивается чем? Не n ли.
Johnmen (2002-04-16 13:40:00) [3]Ну нельзя же так тормозить...:)
[#13,#10,, " ",".",",",":",";"]);
Alx2 (2002-04-16 13:22:00) [4]
Const ValidSet = ["a".."z", "A".."Z", "а".."я", "А".."Я", "0".."9"];
Var S, SS: String;
K, len, Start: Integer;
Begin
S := Memo3.Text;
len := Length(S);
K := 1;
While K <= len Do
Begin
While (K <= len) And (Not (S[K] In ValidSet)) Do inc(K);
Start := K;
If Start > len Then break;
inc(K);
While (K <= len) And (S[K] In ValidSet) Do inc(K);
SS :=Copy(S, Start, K - Start);
Table1.Findkey([SS]);
Memo2.Lines.Add(Table1.Fields[1].text+" - "+Table1.Fields[2].text);
End;
End;
Anatoly Podgoretsky (2002-04-16 13:04:00) [5]Приведи код
Ross (2002-04-16 12:58:00) [6]to MBo ©
НЕ ИДЕТ: Incompatible integer and char
MBo (2002-04-16 12:49:00) [7]#13#10
Ross (2002-04-16 12:42:00) [8]to Johnmen ©
Если #13+#10 или "#13+#10" то ошибка: Incompatible integer and char, eсли #13,#10 то не получается... Попробовал все знакомые мне варианты: ничего.
Johnmen (2002-04-16 11:02:00) [9]Добавь #10
Ross (2002-04-16 10:56:00) [10]to kull ©
for i:=1 to n-1 do наверное потому что результат WordCount начинается с 1. Если я не прав, поправьте.
Ross (2002-04-16 10:54:00) [11]Нет (я так думаю), мне наверное нужно в символах типа TCharSet-WordDelims функции ExtractWord (a)добавить переход каретки, (в) Переместить курсор в конце текста и добавить какой нибудь символ, пробел, точку или запятую... Но как? #13 не идет...
kull (2002-04-15 21:27:00) [12]А почему for i:=1 to n-1 а не:
i:=0 to n-1
или
i:=1 to n
может здесь ошибка?