Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Как посчитать количество символов

Страницы: 1 2 След.
Как посчитать количество символов
Собственно,вопрос в том как узнать количество символов в тексте?
Текст это одна строка и что значит "узнать количество символов"? Количество каждого символа или сумма всех символов?
Допустим, есть у меня текст в Memo, мне нужно посчитать сумму всех символов в нем.
Вот так
Код
x:=Length(Memo1.lines.text);
При таком подсчете количество символов получиться больше на количество строк умноженных на 2.
А почему такое происходит?
Потому что в конце каждой строки есть #13#10
Вот так правильно будет
Код
x := Length(Memo1.text)-((Memo1.Lines.Count-1)*2);
-1 лишний, правильно вот так
Код
x := Length(Memo1.text)-(Memo1.Lines.Count)*2;
Странно, у меня как раз без -1 на 2 символа больше
Попробуйте набрать в Memo
1
2
3
4
5
И посчитать количество символов, с -1 получится 7, но это же не так
Нет, с -1 получится как раз 5,а без него всего 3
Действительно, думал наоборот.
Виктор, у Вас, конечно, все правильно, но если в тексте нет ни одного символа, то результат получится 2 символа.
Ну тогда нужно поставить условие и в этом приравнивать значение к нулю.
Ага, а еще если поставить один символ в итоге получится -1, отрицательного количества быть не может.
Тогда нужно брать значение по модулю.
Можно и так, но выглядеть написанное будет некрасиво
Что-бы все эти условия не ставить, нужно делать так
Код
var
r:extended;
begin
r:=0;
for i:=0 to memo2.lines.count-1 do r:=r+length(memo2.Lines[i]);
//r - результат
end;
Красиво, но медленно.
Да, я уже думал над этим, но ничего лучше не придумал.
Скорее всего, здесь проблема в length. Потому что если применить length к Memo.Lines.Text, то есть весь текст скопировать в одну строку,а потом посчитать в ней все символы, то результат получится намного быстрее. Но ведь в Вашем варианте копирования не происходит. Значит проблема именно в этой функции.
Не думаю. Скорее проблема в Memo.Lines, так как каждый раз вызывается WinAPI (SendMessage) за получение каждой строки
Код
Var S :String;
    P,N :integer;
begin
 Label1.Caption := '0';
  S := Memo1.Text;
  N := 0;
 While Pos(Edit1.Text, S)>0 do
 begin
   P := Pos(Edit1.Text, S);
  If P>0 then
  begin
   Inc(N);
   Delete(S, P, Length(Edit1.Text));
  end;
 end;
  Label1.Caption := IntToStr(N);
в мертвом теле здоровый дух
А не проще будет сделать вот так
Код
function GetStrLen(List: TStrings): integer;
begin
 Result:= StringReplace(List.Text,#13#10,#0,[rfReplaceAll]);
end;
свободный страннык
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)