| 
| 
 | Вопрос # 2 933/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!помогите разделить код на две кнопки. на первой открытие одновременно МНОГО файлов, а на второй выполнение условия и сохранение результата в один файл.
 Приложение:Переключить в обычный режим procedure Tpar.Button1Click(Sender: TObject);var  i, j, n, m: Integer;  FName: string;  TempStrings: TStrings;begin  if (OpenDialog1.Execute()) then  begin    TempStrings := TStringList.Create();    try      for j := 0 to (OpenDialog1.Files.Count - 1) do      begin        FName := OpenDialog1.Files[j];        TempStrings.LoadFromFile(FName);        for i:=TempStrings.Count-1 downto 0 do             TempStrings.Delete(i);        n:=0;        while not (n>=(TempStrings.Count - 1)) do        begin          for m:=TempStrings.Count-1 downto n+1 do            if (TempStrings.Strings[n] = TempStrings.Strings[m]) then              TempStrings.Delete(m);          inc(n)        end;      end;    finally      TempStrings.Free();    end;  end;end;
|  |   Вопрос задал: 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™ (статус: Доктор наук), 21 июня 2009, 18:35 [#1]:Сформулируй задачу иначе. Типа, есть много файлов, их надо все открыть, найти и выбрать, исключая повторы, из них все строки, в которых есть подстрока "лицензия" и сохранить список найденных строк в файл.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | fedora (статус: Посетитель), 21 июня 2009, 22:02 [#2]:спасибо. завтра обязательно проверю. и задачу вы правильно сформулировали
   |  
|   | fedora (статус: Посетитель), 22 июня 2009, 09:07 [#3]:странно. при проверке вылетает ошибка на строчке FList.Clear();
 и не надо ли в опциях выставить ofAllowMultiSelect?
 |  
|   | min@y™ (статус: Доктор наук), 22 июня 2009, 09:25 [#4]:Прежде чем использовать FList, его надо создать 
 FList:= TStringList.Create();Обрати внимание на мой комментарий в начале ответа. 
 Цитата (fedora): и не надо ли в опциях выставить ofAllowMultiSelect?  В опциях чего? Opendialog1? Да, надо, если требуется выбирать сразу несколько файлов.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 22 июня 2009, 12:45 [#7]:удалено |  
|   | min@y™ (статус: Доктор наук), 22 июня 2009, 13:04 [#8]: Цитата: и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?
 
 
 if (Pos('лицензия', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) then ...Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 22 июня 2009, 13:05 [#9]: Цитата (Вадим К): Зачем искать циклом по каждой строке, если можно сразу по всему тексту... Потому что требуется отфильтровать именно строки по данному словию.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 22 июня 2009, 13:09 [#10]:я фразу "и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?" понимаю как "в тексте должны быть обе эти строки, но они могут быть в разных строках". Хотя что прийдет в голову автору вопроса... Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 22 июня 2009, 13:21 [#11]:Не, если в строке есть либо "лицензия", либо "копия", значит строку добавляемя в список, иначе - игнорируем. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 22 июня 2009, 14:25 [#14]:а почему "моя копия и лицензия верна" не найдется? я же ищу строку со словами 'лицензия' и 'верна' либо 'копия' и 'верна' |  
|   | min@y™ (статус: Доктор наук), 22 июня 2009, 14:29 [#15]:Короче, на русском языке сформулируй чётко и недвусмысленно условие добавления строки в список. А я напишу тебе код этого условия. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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™ (статус: Доктор наук), 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 (статус: Посетитель), 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |