|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Счетчик в мемо и файлы
Еще одна задача образовалась.
В memo1 помещен текст. Есть число К. Оно задается пользователем или рандомом. Требуется, Пробежаться по тексту в Мемо до символа!(включая запятые, пробелы и т.д.) до символа К, посмотреть, где ближайшая к нему "."(точка). Вырезать от начала текста до этой точки весь текст и сохранить его в Файл txt. И так весь текст. Кто сможет помочь? Я запутался в циклах и их вложенности при подсчете символов Код:
k:=0; //счетчик символов For i:=0 to Memo1.Lines.Count-1 do for j:=0 to length(Memo1.Lines.Count[i]) do begin inc(k); p.s. Забыл сказать. Что в txt я придумал сохранять в том же цикле но в мемо2. Т.е. этот кусок в мемо2 а там SaveToFile. Так вроде должно работать. Последний раз редактировалось FreeUser, 08.02.2009 в 23:25. |
#2
|
|||
|
|||
1. Точка должна быть до k или в любом месте?
2. Удобнее работать со строкой. Тут есть несколько вопросов. Учитывать ли переводы строк (2 символа - #13#10). Если не учитывать, то на что их заменять (пропускать или просто на пробел)? Ну а далее задача решается простым методом. Ответишь на вопросы - подскажу дальше. |
#3
|
|||
|
|||
"." Точка должна быть после К. Т.е. если К выпадает на середину слова, запятую или пробел, т.е. фактически в середину предложения, то предложение это надо закончить, т.е. двигаться в сторону К+.
2. Переводы строк просто пропускать, не считать их. |
#4
|
|||
|
|||
Ну тогда алгоритм простой.
1. Получение строки для работы: Код:
function GetStr(AMemo : TMemo) : String; var I : Integer; begin Result := ''; For I := 0 To AMemo.Count-1 Do Result := Result + AMemo.Lines[i]; end; 2. Разбивка Код:
S := GetStr(Memo1); While Length(S) > K Do begin F := True; For I := K To Length(S) Do If S[i] = '.' Then Begin Memo2.Lines.Add(Copy(S,1,I)); S := Copy(S,I+1,Length(S) - I +1); F := False; Break; End; If F Then Break; end; If S <> '' Then Memo2.Lines.Add(S); |
#5
|
|||
|
|||
Спасибо. Сейчас потестим.
|
#6
|
|||
|
|||
Мог где и ошибиться, но логика, ИМХО, понятна. Точку ищем прямо с позиции К.
|
#7
|
|||
|
|||
А что такое AMemo? Это Мемо1 у вас так названа?
|
#8
|
|||
|
|||
Ну да, просто я указал ее как параметр функции. Смотри второй код - там эта функция прямо в первой строке вызывается.
|
#9
|
|||
|
|||
Ага..Сейчас разберусь.
|
#10
|
|||
|
|||
Он мне в функции ошибку пишет
[Error] Unit1.pas(40): Undeclared identifier: 'Count' |
#11
|
|||
|
|||
Так, разобрался. Это, если я правильно понял, не совсем то. Тут копируется первый кусок удовлетворяющий условиям. А мне надо чтобы текст из мемо1 был весь порезан на такие куски и сохранен каждый кусок в отдельный файл. Т.е. текст в мемо1 должен постоянно уменьшаться и вконеце, когда будут остатки, то и эти остатки в последний текстовый файл.
Последний раз редактировалось FreeUser, 09.02.2009 в 01:12. |
#12
|
|||
|
|||
ты невнимательно читал.
Код зациклен, пока его длинна больше твоего к. Ну и хвост после цикла тоже запихивается как отдельная строка. Читай внимательней!!! |