|
Вопрос # 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™ (статус: Доктор наук), 22 июня 2009, 15:56 [#21]:
Так, начнём издалека. Изучи, плиз, метод TStringList.IndexOf().
Условие (Temp.IndexOf(FList[Index]) = -1) будет = True, если строки FList[Index] нету в списке Temp. Если её нету в списке, то она в этот список добавляется, иначе НЕ добавляется. После цикла проверок сохраняется в файл именно список Temp, а не FList. Когда ж до тебя это дойдёт, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 16:09 [#23]:
Цитата (fedora):
извини за 'торможение'
Неужели так трудно было внимательно просмотреть выходной файл?
ЗЫ. Не вижу оценки за ответ, плюса к репутации или пива. Пиво-то я, наверно, заслужил, или как?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
fedora (статус: Посетитель), 22 июня 2009, 17:23 [#24]:
на работе java не работает
приду домой всем поставлю.
|
|
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™ (статус: Доктор наук), 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]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|