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 - він стандартний для делфі)