Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

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

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 933

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
помогите разделить код на две кнопки. на первой открытие одновременно МНОГО файлов, а на второй выполнение условия и сохранение результата в один файл.

Приложение:
  1. procedure Tpar.Button1Click(Sender: TObject);
  2. var
  3. i, j, n, m: Integer;
  4. FName: string;
  5. TempStrings: TStrings;
  6. begin
  7. if (OpenDialog1.Execute()) then
  8. begin
  9. TempStrings := TStringList.Create();
  10. try
  11. for j := 0 to (OpenDialog1.Files.Count - 1) do
  12. begin
  13. FName := OpenDialog1.Files[j];
  14. TempStrings.LoadFromFile(FName);
  15. for i:=TempStrings.Count-1 downto 0 do
  16.  
  17. TempStrings.Delete(i);
  18. n:=0;
  19. while not (n>=(TempStrings.Count - 1)) do
  20. begin
  21. for m:=TempStrings.Count-1 downto n+1 do
  22. if (TempStrings.Strings[n] = TempStrings.Strings[m]) then
  23. TempStrings.Delete(m);
  24. inc(n)
  25. end;
  26. end;
  27. finally
  28. TempStrings.Free();
  29. end;
  30. end;
  31. end;


fedora Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: fedora (статус: Посетитель)
Вопрос отправлен: 21 июня 2009, 18:20
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Попробую включить телепатор. Если всё так, как я понял, то вот:

// Подразумевается, что в секции private формы Tpar есть поле FList: TStringList
// и то, что это поле проинициализировано FList:= TStringList.Create() где-нить
// в конструкторе или OnCreate формы.
 
// Открытие кучи файлов и сваливание их содержимого в один список в памяти.
procedure Tpar.Button1Click(Sender: TObject);
var
  Temp: TStringList;
  Index: Integer;
begin
  if not OpenDialog1.Execute()
    then Exit;
 
  FList.Clear();
  Temp:= TStringList.Create();
  try
    for Index:= 0 to OpenDialog1.Files.Count - 1 do
      try
        Temp.LoadFromFile(OpenDialog1.Files[Index]);
        FList.AddStrings(Temp);
      except
        ShowMessage('Мощщный ЕРРОР!');
        Break;
      end;
  finally
    Temp.Free();
  end;
end;
 
// Поиск в списке и сохранение в файл строк списка, в которых есть слово "лицензия"
procedure Tpar.Button2Click(Sender: TObject);
var
  Temp: TStringList;
  Index: Integer;
begin
  if not SaveDialog1.Execute()
    then Exit;
 
  Temp:= TStringList.Create();
  try
    for Index:= 0 to FList.Count - 1 do
      if (Pos('лицензия', FList[Index]) <> 0) and (Temp.IndexOf(FList[Index]) = -1)
        then Temp.Add(FList[Index]);
 
    try
      Temp.SaveToFile(SaveDialog1.FileName);
    except
      ShowMessage('Мощщный ЕРРОР!');
    end;
  finally
    Temp.Free();
  end;
end;

Вот типа так.
АХТУНГ! Код не отлаживал, писал в браузере!

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 июня 2009, 18:54


Мини-форум вопроса

Всего сообщений: 27; последнее сообщение — 25 июня 2009, 11:25; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 21 июня 2009, 18:35 [#1]:

Сформулируй задачу иначе.
Типа, есть много файлов, их надо все открыть, найти и выбрать, исключая повторы, из них все строки, в которых есть подстрока "лицензия" и сохранить список найденных строк в файл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
fedora

fedora (статус: Посетитель), 21 июня 2009, 22:02 [#2]:

спасибо. завтра обязательно проверю.
и задачу вы правильно сформулировали :)
fedora

fedora (статус: Посетитель), 22 июня 2009, 09:07 [#3]:

странно.
при проверке вылетает ошибка на строчке FList.Clear();
и не надо ли в опциях выставить ofAllowMultiSelect?
min@y™

min@y™ (статус: Доктор наук), 22 июня 2009, 09:25 [#4]:

Прежде чем использовать FList, его надо создать
FList:= TStringList.Create();
Обрати внимание на мой комментарий в начале ответа.

Цитата (fedora):

и не надо ли в опциях выставить ofAllowMultiSelect?

В опциях чего? Opendialog1? Да, надо, если требуется выбирать сразу несколько файлов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
fedora

fedora (статус: Посетитель), 22 июня 2009, 12:07 [#5]:

спасибо. все заработало.
а подскажите по условиям?
в строке:
if (Pos('лицензия', FList[Index]) <> 0) and (Pos('имеется', FList[Index])
and - это и
or - или
а какие еще есть параметры? где бы прочитать?
и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?
Вадим К

Вадим К (статус: Академик), 22 июня 2009, 12:22 [#6]:

есть xor к примеру. это "исключающие или".
ну и not - отрицание.
А вот что бы найти в разных строках, надо отдельно поискать одну строку, потому вторую.
а можно проще. Зачем искать циклом по каждой строке, если можно сразу по всему тексту...
где то так
if (Pos('лицензия', FList.text) <> 0) and (Pos('имеется', FList.text)
Галочка "подтверждения прочтения" - вселенское зло.
fedora

fedora (статус: Посетитель), 22 июня 2009, 12:45 [#7]:

удалено
min@y™

min@y™ (статус: Доктор наук), 22 июня 2009, 13:04 [#8]:

Цитата:


и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?

if (Pos('лицензия', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) then ...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 22 июня 2009, 13:05 [#9]:

Цитата (Вадим К):

Зачем искать циклом по каждой строке, если можно сразу по всему тексту...

Потому что требуется отфильтровать именно строки по данному словию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 июня 2009, 13:09 [#10]:

я фразу "и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?" понимаю как "в тексте должны быть обе эти строки, но они могут быть в разных строках". Хотя что прийдет в голову автору вопроса...
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 июня 2009, 13:21 [#11]:

Не, если в строке есть либо "лицензия", либо "копия", значит строку добавляемя в список, иначе - игнорируем.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
fedora

fedora (статус: Посетитель), 22 июня 2009, 14:08 [#12]:

1. not у меня не сработал - ошибка, зато xor - то, что надо.
2. в тексте есть несколько строк, в которых встречаются слова 'лицензия' и 'копия' и в месте и по отдельности.
лицензия верна
лицензия и копия верна, но дата закончилась
копия верна
тут другая информация
копия отсутствует
лицензия отсутствует и дата открыта
<CODE>
if (Pos('лицензия', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) then ...
</CODE>
но необходимо еще одно условие 'верна', т.е. если я напишу
<CODE>
if (Pos('лицензия', FList[Index]) <> 0) and (Pos('верна', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) and (Pos('верна', FList[Index]) <> 0) then ...
</CODE>
и верно я понимаю, что найдутся строки со словами 'лицензия верна' либо 'копия верна'.

извините, что так пишу. у меня принудительно отключены java scripts.
а можно еще добавить в код автоматом удаление дублей? как в первоначальном примере?
Вадим К

Вадим К (статус: Академик), 22 июня 2009, 14:12 [#13]:

not не сработал... да, его надо правильно готовить:)
...
по последнему вопросу. таке найдуться "верна копия", "моя лицензия также верна" и тому подобное.
Но если будет строка "моя копия и лицензия верна", то не найдеться.
Галочка "подтверждения прочтения" - вселенское зло.
fedora

fedora (статус: Посетитель), 22 июня 2009, 14:25 [#14]:

а почему "моя копия и лицензия верна" не найдется? я же ищу строку со словами 'лицензия' и 'верна' либо 'копия' и 'верна'
min@y™

min@y™ (статус: Доктор наук), 22 июня 2009, 14:29 [#15]:

Короче, на русском языке сформулируй чётко и недвусмысленно условие добавления строки в список. А я напишу тебе код этого условия.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
fedora

fedora (статус: Посетитель), 22 июня 2009, 14:53 [#16]:

лучше я еще додумаю какие условия применять.
подскажите лучше как в
procedure Tpar.Button2Click(Sender: TObject);
из предыдущей странице, добавить автоматическое удаление дублирующих строк.
Вадим К

Вадим К (статус: Академик), 22 июня 2009, 14:53 [#17]:

"а почему "моя копия и лицензия верна" не найдется? я же ищу строку со словами 'лицензия' и 'верна' либо 'копия' и 'верна'"
потому что "либо", а не "или".
потому что xor. Читаем внимательно литературу, что бы узнать, что такое "исключающее или". (гугл точно подскажет).
вообще то то, что в языках программирования называтся or следует переводить как "и/или". Тогда всё станет на свои места.
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 22 июня 2009, 15:00 [#18]:

а вот дублирующие строки удалять - это уже весело. Эх, в линуксовской консоли это делается в одно движение левой ногой.
Например, есть кучка файлов в папке и вложенных. задача - выбрать все строки, где есть слово лицензия и верна и сложить в файл. одинаковые строки не включать.
grep -r 'лицензия' | grep -e 'верна' | sort | uniq > rezult.txt
еще и отсортирует:)
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 июня 2009, 15:15 [#19]:

Цитата (fedora):

подскажите лучше как в
procedure Tpar.Button2Click(Sender: TObject);
из предыдущей странице, добавить автоматическое удаление дублирующих строк.


Там уже есть такое условие, читай внимательнее:
if ... and (Temp.IndexOf(FList[Index]) = -1)
  then Temp.Add(FList[Index]);
Это означает, буквально: если такой строки нету в списке, то добавить её.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
fedora

fedora (статус: Посетитель), 22 июня 2009, 15:23 [#20]:

"Это означает, буквально: если такой строки нету в списке, то добавить её. "
добавить-то добавляет. из текста:
лицензия от 10.10.09
лицензия от 10.10.09
отказано
отказано
лицензия от 11.10.09
лицензия от 12.10.09
лицензия от 10.10.09
лицензия от 10.10.09
по условию 'лицензия от 10.10.09' он добавит:
лицензия от 10.10.09
лицензия от 10.10.09
лицензия от 10.10.09
лицензия от 10.10.09
а мне надо всего одну строку 'лицензия от 10.10.09', остальные (повторные) убрать.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:03
Выполнено за 0.03 сек.