1 Востаннє редагувалося phantom823 (29.05.2013 16:49:03)

Тема: Робота з TStringList

Вибачте!
1.В текстовому файлі (вибирає користувач) знайти кількість рядків, що починаються зі знака!. Використовуючи властивості і методи класу TStringList
2.Переписати вміст текстового файлу (вибирає користувач) в новий текстовий файл (вибирає користувач), замінюючи точками комами, використовуючи властивості і методи класу TStringList

2

Re: Робота з TStringList

http://replace.org.ua/rules/

Подякували: koala1

3

Re: Робота з TStringList

Тобто вам потрібно написати програму на Delphi і у вас немає ніяких напрацювань?

4

Re: Робота з TStringList

Replace написав:

Тобто вам потрібно написати програму на Delphi і у вас немає ніяких напрацювань?

першу я зробив,а другу не можу

5

Re: Робота з TStringList

Ось перша задача,в мене вона не працюе,прошу перевірте на помилки

 var
F:TStringList;
i,j,kol:integer;
S:String;
begin
F:=TStringList.Create;
If OpenDialog1.Execute then begin
F.loadfromfile(OpenDialog1.FileName);
For i:=0 to F.Count-1 do begin
F.Strings[i];
For j:=1 to length(S) do
If length(s)=' ' then kol:=kol+1;
F.SavetoFile('C:\1.txt')
F.Free;
end;


end;

end.

6 Востаннє редагувалося cuhedg (29.05.2013 18:02:25)

Re: Робота з TStringList

procedure TForm1.Button1Click(Sender: TObject);
var
  F:TStringList;
  i,j,kol:integer;
  S:String;
begin
kol:= 0;
F:=TStringList.Create;
If OpenDialog1.Execute then
begin
  F.loadfromfile(OpenDialog1.FileName);
  For i:=0 to F.Count-1 do
    if (Pos('!', F.Strings[i]) = 1) then kol:=kol+1;
  F.Free;
  ShowMessage(IntToStr(kol));
end;
end;

А так?

7

Re: Робота з TStringList

cuhedg написав:
procedure TForm1.Button1Click(Sender: TObject);
var
  F:TStringList;
  i,j,kol:integer;
  S:String;
begin
kol:= 0;
F:=TStringList.Create;
If OpenDialog1.Execute then
begin
  F.loadfromfile(OpenDialog1.FileName);
  For i:=0 to F.Count-1 do
    if (Pos('!', F.Strings[i]) = 1) then kol:=kol+1;
  F.Free;
  ShowMessage(IntToStr(kol));
end;
end;

А так?

так,розібрався!
тепер 2 треба

8 Востаннє редагувалося DOP (29.05.2013 23:49:38)

Re: Робота з TStringList

Дещо не по темі, але в даному прикладі буде витік пам'яті, якщо юзер скасує діалог.
Тобто, метод F.Free потрібно винести приблизно ось так:

cuhedg написав:
procedure TForm1.Button1Click(Sender: TObject);
var
  F:TStringList;
  i,j,kol:integer;
  S:String;
begin
  kol:= 0;
  F:=TStringList.Create;
  If OpenDialog1.Execute then
  begin
    F.loadfromfile(OpenDialog1.FileName);
    For i:=0 to F.Count-1 do
      if (Pos('!', F.Strings[i]) = 1) then kol:=kol+1;
    ShowMessage(IntToStr(kol));
  end;
  F.Free;
end;
Подякували: cuhedg1

9

Re: Робота з TStringList

тепер 2 треба

Згадуєте про існування StringReplace та TSaveDialog, і вперед.

10 Востаннє редагувалося ADR (08.06.2013 00:43:32)

Re: Робота з TStringList

phantom823 написав:

Ось перша задача,в мене вона не працюе,прошу перевірте на помилки

 var
F:TStringList;
i,j,kol:integer;
S:String;
begin
F:=TStringList.Create;
If OpenDialog1.Execute then begin
F.loadfromfile(OpenDialog1.FileName);
For i:=0 to F.Count-1 do begin
F.Strings[ i];
For j:=1 to length(S) do
If length(s)=' ' then kol:=kol+1;
F.SavetoFile('C:\1.txt')
F.Free;
end;


end;

end.

Ясно що не компілюється:


>>F.Strings[ i];
ти читаєш властивість в нікуди. (напр: відкрив книжку, але не дивишся  неї)


і хіба не було попередження що "значення присвоєне перемінні "kol" - не використовується"
та "перемінна "kol" може бути не ініціалізована"?


>>If length(s)=' ' then kol:=kol+1;
"несумісні типи: число і рядок"


"Перемінна "S" може бути не ініціалізована"







Компілятор ж усе каже...

11

Re: Робота з TStringList

cuhedg написав:
procedure TForm1.Button1Click(Sender: TObject);
var
  F:TStringList;
  i,j,kol:integer;
  S:String;
begin
  kol:= 0;
  F:=TStringList.Create;
  If OpenDialog1.Execute then
  begin
    F.loadfromfile(OpenDialog1.FileName);
    For i:=0 to F.Count-1 do
      if (Pos('!', F.Strings[i]) = 1) then kol:=kol+1;
    ShowMessage(IntToStr(kol));
  end;
  F.Free;
end;

так краще але теж погано... а якщо станеться OutOfMemory (закінчилась оперативка), або не та фаза місяця?

потрібно обгортати роботу на виділеною пам'яттю в try finally і як на мене об'єкт треба створювати безпосередньо перед використанням


procedure TForm1.Button1Click(Sender: TObject);
var
  F:TStringList;
  i,j,kol:integer;
  S:String;
begin
  kol:= 0;
  If OpenDialog1.Execute then
  begin
    F:=TStringList.Create;
    try
      F.loadfromfile(OpenDialog1.FileName);
      For i:=0 to F.Count-1 do
        if (Pos('!', F.Strings[i]) = 1) then kol:=kol+1;
      ShowMessage(IntToStr(kol));
    finally
        F.Free;
    end;
  end;
end;

ПС: до ТС: якщо ви цікавитесь програмуванням - дотримуйтесь стилю форматування (стилю Borland - він стандартний для делфі)