Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Что я делаю не так? 


Ross   (2002-04-15 19:58) [0]

Здравствуйте. Вот код для чтения пословно, который я использую:

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.



kull   (2002-04-15 21:27) [1]

А почему for i:=1 to n-1 а не:

i:=0 to n-1
или
i:=1 to n
может здесь ошибка?



Ross   (2002-04-16 10:54) [2]

Нет (я так думаю), мне наверное нужно в символах типа TCharSet-WordDelims функции ExtractWord (a)добавить переход каретки, (в) Переместить курсор в конце текста и добавить какой нибудь символ, пробел, точку или запятую... Но как? #13 не идет...



Ross   (2002-04-16 10:56) [3]

to kull ©
for i:=1 to n-1 do наверное потому что результат WordCount начинается с 1. Если я не прав, поправьте.



Johnmen   (2002-04-16 11:02) [4]

Добавь #10



Ross   (2002-04-16 12:42) [5]

to Johnmen ©
Если #13+#10 или "#13+#10" то ошибка: Incompatible integer and char, eсли #13,#10 то не получается... Попробовал все знакомые мне варианты: ничего.



MBo   (2002-04-16 12:49) [6]

#13#10



Ross   (2002-04-16 12:58) [7]

to MBo ©
НЕ ИДЕТ: Incompatible integer and char



Anatoly Podgoretsky   (2002-04-16 13:04) [8]

Приведи код



Alx2   (2002-04-16 13:22) [9]


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;




Johnmen   (2002-04-16 13:40) [10]

Ну нельзя же так тормозить...:)

[#13,#10,, " ",".",",",":",";"]);



kull   (2002-04-16 14:17) [11]


>Ross © (16.04.02 10:56)
> for i:=1 to n-1 do наверное потому что результат WordCount
> начинается с 1. Если я не прав, поправьте.

Начинается то он с 1 а заканчивается чем? Не n ли.



Ross   (2002-04-16 14:26) [12]

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-это ПрогрессБар




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.043 c
3-94276           Glonia Zbanov         2002-04-08 11:19  2002.04.29  
проблемы русского языка


4-94632           Эйнхерий              2002-02-26 10:51  2002.04.29  
Загвоздка при использовании WH_KEYHOOK и передачи параметров в главное приложение.


7-94593           Андрей Татуков        2002-02-04 16:14  2002.04.29  
Язык Windows


14-94565          Capo                  2002-03-24 18:57  2002.04.29  
mail via SMTP


1-94496           Reals                 2002-04-16 17:30  2002.04.29  
Как написать плугин для Outlook Express и internet Explorer...