Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.165.66] |
|
Сообщ.
#1
,
|
|
|
Дан текст:
123456789:aaaa!www 123456789:aaaaZwww 1234-!-56789:aaaawww 12345-Z-6789:aaaawww Задание: В edit1 - пишем символы "!" и "Z" и программа исключает все строки, где после знака ":" - имеются символы "!" и "Z". На выходе должно получится: 1234-!-56789:aaaawww 12345-Z-6789:aaaawww Вопрос: Почему второй код через MEMO - Работает, А первый код через файл - дублирует значения и не работает. Где я допустил ошибку ??? Первый код: Обработка через текстовый файл - неправильно работает: procedure TForm1.Button1Click(Sender: TObject); var fall, f1: TextFile; S,s1: string; i: integer; L: TStringList; b: boolean; j: integer; begin //Открываем диалог выбора файла if OpenDialog1.Execute then begin AssignFile(fall, OpenDialog1.FileName); reset(fall); end; //работаем по строкам в файле while not Eof(fall) do begin //читаем строку ReadLn(fall, S1); if Length(Trim(Edit1.Text)) = 0 then Exit; s := Edit1.Text; L := TStringList.Create; L.NameValueSeparator := ':'; L.Text := s1; for i := 0 to L.Count - 1 do begin b := true; for j := 1 to Length(s) do if Pos(s1[j], L.ValueFromIndex[i]) > 0 then b := false; if b then L.Add(L.Strings[i]); L.SaveToFile('результат.txt'); end; end; CloseFile(fall); L.Free; end; end. Второй код: А вот обработка через MEMO - правильно работает: var L: TStringList; b: boolean; s: String; i, j: integer; begin if Length(Trim(Edit1.Text)) = 0 then Exit; s := Edit1.Text; L := TStringList.Create; L.NameValueSeparator := ':'; L.Text := Memo1.Text; for i := 0 to L.Count - 1 do begin b := true; for j := 1 to Length(s) do if Pos(s[j], L.ValueFromIndex[i]) > 0 then b := false; if b then Memo2.Lines.Add(L.Strings[i]); end; L.Free; end; Помогите исправить ошибки в первом коде...! |
Сообщ.
#2
,
|
|
|
У вас после L.SaveToFile аж два end'а, а это означает, что вы не удаляете TStringList после каждой итерации цикла while; но создаёте его! Это, как минимум, неправильно.
|
Сообщ.
#3
,
|
|
|
Цитата Славян @ У вас после L.SaveToFile аж два end'а, а это означает, что вы не удаляете TStringList после каждой итерации цикла while; но создаёте его! Это, как минимум, неправильно. Переделал и снова результата ноль. По возможности подскажите как правильно будет. procedure TForm1.Button1Click(Sender: TObject); var fall, f1: TextFile; S,s1: string; i,j: integer; L: TStringList; b: boolean; begin //Открываем диалог выбора файла if OpenDialog1.Execute then begin AssignFile(fall, OpenDialog1.FileName); reset(fall); end; if Length(Trim(Edit1.Text)) = 0 then Exit; s := Edit1.Text; // Фильтр который проверяет строки после знака : L := TStringList.Create; //работаем по строкам в файле while not Eof(fall) do begin //читаем строку ReadLn(fall, S1); L.NameValueSeparator := ':'; L.Text := s1; for i := 0 to L.Count - 1 do begin b := true; for j := 1 to Length(s1) do if Pos(s1[j], L.ValueFromIndex[i]) > 0 then b := false; if b then L.Add(L.Strings[i]); end; end; L.SaveToFile('Результат.txt'); L.Free; CloseFile(fall); end; |
Сообщ.
#4
,
|
|
|
Цитата Kirilis2018 @ А вот обработка через MEMO - правильно работает: Идя по пути меньшего сопротивления, видится логичным в мемо и загружать файл... Добавлено раз уж в нем все работает, зачем изобретать велосипед? |
Сообщ.
#5
,
|
|
|
Руслан, В memo большой файл не загрузить... Есть варианты как исправить - Первый код?.
|
Сообщ.
#6
,
|
|
|
Все, вопрос решен. Доработал, только что, код благодаря - Славян. Всем спасибо за наставления!
|