Экспертная система 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™ (статус: Доктор наук), 22 июня 2009, 15:56 [#21]:

Так, начнём издалека. Изучи, плиз, метод TStringList.IndexOf().
Условие (Temp.IndexOf(FList[Index]) = -1) будет = True, если строки FList[Index] нету в списке Temp. Если её нету в списке, то она в этот список добавляется, иначе НЕ добавляется. После цикла проверок сохраняется в файл именно список Temp, а не FList. Когда ж до тебя это дойдёт, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
fedora

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

а нет. вру. просто глюк какой-то :( добавляется одна строка.
извини за 'торможение' :)
min@y™

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

Цитата (fedora):

извини за 'торможение' :)

Неужели так трудно было внимательно просмотреть выходной файл?

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

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

на работе java не работает :(
приду домой всем поставлю.
fedora

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

подскажите, в моем случае как использовать процедуру Delete вместо Pos? все время пишет not enough actual parametrs, хотя указываю : "Delete(Str: String; Start, Length: Integer) - удаляет из строки Str символы, начиная с позиции Start длиной Length.", т.е. Delete(FList[Index]), 6, 7) и можно вместо позиции Start '6' использовать, например, 'вперед' - слово?
min@y™

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

А самому допетрить алгоритм никак?
Вот, набросал тебе функцию за 3 минуты:
// Удаление всех вхождений строки SubStr из строки S
function DeleteSubString(const SubStr, S: string): string;
var
  P: Integer;
begin
  Result:= S;
 
  repeat
    P:= Pos(SubStr, Result);
    if P <> 0
      then Delete(Result, P, Length(SubStr));
  until P = 0;
end;

Использование:

FList[Index]:= DeleteSubString('вперед', FList[Index]);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 25 июня 2009, 11:25 [#27]:

to volshba
Дело в том, что процедура delete хочет ссылку на строку, а не метод, который возвращает строку.
Да, конечно компилятор мог собразить, что там свойство которое не только возвращает строку, но и может принять её, но это два метода, а не ссылка на строку. Поэтому в данном случае нужно работать через доппеременную, где то так
var s:string;
begin
//.....
s := FList[Index]);
Delete(s, 6, 7);
FList[Index]) := s;
//.....
end;
Галочка "подтверждения прочтения" - вселенское зло.

Страницы: [« Предыдущая] [1] [2]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 23:49
Выполнено за 0.04 сек.