Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic: новости сайтов, советы, примеры кодов. Выпуск 250.


Информационный Канал Subscribe.Ru

Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 250.


VBNet VBMania
Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • VB по русски
  • MDesign
  • IgorykSoft
  • DanSoft
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Гм.. Странно совпало как-то: сегодня юбилейный 250-ый выпуск рассылки, а в понедельник у меня день рождения! Поздравления принимаются :)
       Кстати... В разделе Вопрос/Ответ я сегодня не все ответы закинул, уж сильно их много было, какие остались - опубликую в следующем выпуске...
    Читайте!


    Содержание выпуска




    Новости сайта VBNet

    Дата: 17.03.2004 11:37 | Раздел: Примеры кода | Автор: UzniK

    SeaWar - Это сетевая версия популярной игры "Морской бой". Программа не до конца доработана и является бета -версией. Все замечания и пожелания отправлять на :rusivan_2004@mail.ru Программа реализована с помощью контрола WINSOCK.

    Дата: 17.03.2004 10:41 | Раздел: Статьи по VB | Автор: Шатохина Н.А.

    RPC/Литерал и свобода выбора - Посмотрим, почему используемый для Web сервиса формат обмена сообщениями SOAP не всегда определяет используемую модель программирования. Больше узнаем о форматах обмена сообщениями SOAP и разделении формата сообщения и модели программирования.

    Дата: 16.03.2004 14:32 | Раздел: Статьи по VB | Автор: Шатохина Н.А.

    Спецификация С# версии 2.0. Неполные типы - Спецификация C#. Глава 23: Неполные типы. В этой главе детально описаны неполные типы.

    Дата: 16.03.2004 10:17 | Раздел: Примеры кода | Автор: Millenium

    Mabry MIDI Player - Очень крутой проигрыватель MIDI файлов, с визуализатором состояния звука. Простой в то же время мошный проигрыватель построен на осное контролей написанных Marby Software. Контроли написаны на Си но подправлены ан ВИжуал Бейзике. Дерзайте!

    Дата: 16.03.2004 10:17 | Раздел: Примеры кода | Автор: Millenium

    Volume İndicator 128/256 - Контроль типа VolumeBar - кто не знает загляните и посмотрите. Можно использовать как индекатор загруженности или простой Progress bar. В архиве 2 вида контроля с исходниками. Один 128 для 128-бит а другой 256 модифицированный и универсльный. Где даже начало чвета и сам чвет каждого статуса можно указать. Одним словом, хотите узнать получше - взгляните! Применяйте в аудио утилитах! Очень полезно!

    Дата: 16.03.2004 10:06 | Раздел: Примеры кода | Автор: sne

    Reg2Ini - Модуль для работы с INI файлами с тем же комфортом что и работа с реестром.

    Дата: 16.03.2004 10:06 | Раздел: Примеры кода | Автор: sne

    CutForm - Вырезка произвольных форм. Отличный пример!

    Дата: 16.03.2004 10:03 | Раздел: Примеры кода | Автор: Dr Drux

    Slider - Элемент Slider.



    Последние 20 тем форума на VBNet.Ru:

    12:17 / 22 мар.  Как узнать какой масштабный коэффициент экрана ... | Хитов: 2 |  Ответов: 0
    12:13 / 22 мар.  HELP: Struktura | Хитов: 4 |  Ответов: 0
    12:13 / 22 мар.  Ошибка в executeline | Хитов: 2 |  Ответов: 0
    11:35 / 22 мар.  Домино Сервер в VB | Хитов: 6 |  Ответов: 1
    10:27 / 22 мар.  Альтернатива SYSTRAY | Хитов: 12 |  Ответов: 0
    10:07 / 22 мар.  Прога открывает два соединения на SQL Server ??? | Хитов: 3 |  Ответов: 0
    08:55 / 22 мар.  VsFlexGrid???? | Хитов: 3 |  Ответов: 0
    04:31 / 22 мар.  Вставить в RichTextBox данные из буфера либо пе... | Хитов: 5 |  Ответов: 1
    01:23 / 22 мар.  Color 2 Hex | Хитов: 13 |  Ответов: 4
    00:15 / 22 мар.  И чем тут может быть проблема? VS --> Access | Хитов: 9 |  Ответов: 0
    00:05 / 22 мар.  Вставка Image в Outlook | Хитов: 6 |  Ответов: 0
    23:51 / 21 мар.  траффик | Хитов: 16 |  Ответов: 2
    21:24 / 21 мар.  Братва! Звук так и не появился! | Хитов: 14 |  Ответов: 1
    20:40 / 21 мар.  Удаление комментарий | Хитов: 26 |  Ответов: 6
    20:16 / 21 мар.  Книги по теории БД | Хитов: 5 |  Ответов: 1
    19:59 / 21 мар.  Текст, как код проги... | Хитов: 22 |  Ответов: 3
    18:55 / 21 мар.  URL | Хитов: 13 |  Ответов: 1
    13:19 / 21 мар.  NTFS | Хитов: 21 |  Ответов: 1
    10:54 / 21 мар.  Собственное MsgBox | Хитов: 45 |  Ответов: 10
    10:02 / 21 мар.  Разрешен ли доступ к папке | Хитов: 16 |  Ответов: 1


    Последние поступления в Библиотеку кодов:



    наверх


    Новости сайта MSDN



    наверх


    Новости сайта GotdotNet

    • 16.03.2004 - Свежие новости MSDN для разработчиков на .NET
      Важнейшие материалы, новые веб-ресурсы, продукты и технологии наших партнеров, веб-презентации, общение в режиме реального времени, мероприятия для разработчиков.


    Новые статьи:



    наверх


    Новости сайта dotSite

    Новые статьи:



    Новые примеры:



    наверх


    Один момент из жизни форума: Параметры страницы...

    Адерес темы: http://vbnet.ru/forum/show.asp?id=39022

    Вопрос:
    Автор вопроса: Padre

       Как вызвать окно "Параметры страницы", как в блокноте (Файл>Параметры страницы...)?


    Ответы:

    Автор: LamerOnLine
       Option Explicit Private Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PageSetupDlg) As Long
    Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type
    Private Type POINTAPI
    x As Long
    y As Long
    End Type
    Private Type PageSetupDlg
    lStructSize As Long
    hwndOwner As Long
    hDevMode As Long
    hDevNames As Long
    flags As Long
    ptPaperSize As POINTAPI
    rtMinMargin As RECT
    rtMargin As RECT
    hInstance As Long
    lCustData As Long
    lpfnPageSetupHook As Long
    lpfnPagePaintHook As Long
    lpPageSetupTemplateName As String
    hPageSetupTemplate As Long
    End Type
    Private Function ShowPageSetupDlg() As Long
    Dim m_PSD As PageSetupDlg
    'Set the structure size
    m_PSD.lStructSize = Len(m_PSD)
    'Set the owner window
    m_PSD.hwndOwner = Me.hWnd
    'Set the application instance
    m_PSD.hInstance = App.hInstance
    'no extra flags
    m_PSD.flags = 0
    'Show the pagesetup dialog
    If PageSetupDlg(m_PSD) Then
    ShowPageSetupDlg = 0
    Else
    ShowPageSetupDlg = -1
    End If
    End Function
    Private Sub Command1_Click()
    Dim Ret As Long
    Ret = ShowPageSetupDlg
    End Sub



    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса: Tima

    Ответ ожидается по этому адресу

       Как поместить свою программу на сайт (в смысле не для того чтобы её можно было скачать, а для того чтобы она там работала) средствами VB 6.0?


    Автор вопроса: Tima

    Ответ ожидается по этому адресу

       Куда надо помещать *.dll файлы и куда *.ocx файлы при переносе проги на другой комп? Могут ли это делать компиляторы?


    Автор вопроса: Данила

    Ответ ожидается по этому адресу

       Как сделать плагин? Как его подключать?


    Автор вопроса: Rizayev F. I.

    Ответ ожидается по этому адресу

       Как то в выпуске 89 был код: "Kак убрать программу из списка Ctrl+Alt+Del".
    В Win95-98 он идет а, на ХР выдает ошибку во время выполнения прграммы '453'. Не может найти DLL точку входа RegisterServiceProcess в kernel32.

    Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal ProcessID As Long, ByVal ServiceFlags As Long) As Long
    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Sub Form_Load()
    RegisterServiceProcess GetCurrentProcessId, 1 'Hide app
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    RegisterServiceProcess GetCurrentProcessId, 0 'Remove service flag
    End Sub


    Автор вопроса: maxi_10

    Ответ ожидается по этому адресу

       Подскажите пожалуста, такая проблема.

    Call Shell ("ping 195.14.50.1 -l 1500",,)

    if A = 0 then
    Beep
    end if

    Как мне получить в переменную "А", прошли пакеты или нет? Или подскажите, как проверить, работаетли компьютер в сети, зная его IP.


    Автор вопроса: C...R...a...S...H

    Ответ ожидается по этому адресу

       Как мне выделить несколько контролов(любым способом), а потом получить их индексы (массив контролов)?


    Автор вопроса: Anakonda

    Ответ ожидается по этому адресу

       У меня такая проблема:
    Я пишу скринграбер. В функции съёмки окна или элемента окна я думаю перерисовать содержимое экрана на форму и развернуть эту форму на весь экран. Так намного лучше чем давать пользователю водить мышкой прямо по окнам, выбирая их. Но тогда ведь не будет работать WindowFromPoint... Ведь она отлавливает верхнее окно, а верхним будет моя форма (может можно сделать как-то, чтобы она мою не учитывала?). Поэтому я решил, что сначала надо создать список всех окон в системе с их координатами, размерами. А потом, когда пользователь водит крысой, из этого списка выбирается то, что находится в этой точке... Но если таких несколько? Как определить которое выше? Я намутил такой вот код:
      
    Dim w As Long
      
    Dim w As Long
    Dim RC As RECT
      
    L.Clear
    w = GetWindow(GetDesktopWindow, GW_CHILD)
    Do While w <> 0
         If IsWindowVisible(w) Then
             GetWindowRect w, RC
             L.AddItem w & " (" & RC.Left & ", " & RC.Top & ", " & RC.Right & ", " & RC.Bottom & ")"
         End If
         w = GetWindow(w, GW_HWNDNEXT)
    Loop
      
    Он создаёт список окон на рабочем столе (без учёта дочерних) с их координатами. Он может стать основой. Но как реализовать остальное я не знаю :(
    Возможно есть и другой способ, полегче...
    Буду благодарен за любые советы (лучше полный код :).


    Автор вопроса: Олег

    Ответ ожидается по этому адресу

       Хочу сделать антивирус, но вот начались проблемы с созданием антивирусных баз.
    База представляет собой следующий файл.В начале должна находится версия базы, далее после символа "VbNewLine" идет название вруса #1, а после этого символ "VbNewLine" и часть бинарного кода вируса, подом название вируса #2, и его код и.т.д. Помогите, пожалуйста, осуществить это.




    Ответы:


    Вопрос:

       Есть такой код. Проблема в том, что в Windows 98 он работает, а в 2000 и ХР нет. Подскажите, что здесь неправильно.

    Private Declare Function CreatePolygonRgn Lib "gdi32.dll" (lpPoint _
    As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
    Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hwnd _
    As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    Private Type POINTAPI
         X As Long
         Y As Long
    End Type

    Dim P(407) As POINTAPI
    Dim hw As Long

    hw=me.hwnd 'hWnd формы
    'Заполняем массив точек. Данный массив рисует звездочку на форме
    P(0).X = 124: P(0).Y = 0
    P(1).X = 159: P(1).Y = 86
    P(2).X = 248: P(2).Y = 86
    P(3).X = 183: P(3).Y = 146
    P(4).X = 248: P(4).Y = 312
    P(5).X = 124: P(5).Y = 199
    P(6).X = 0: P(6).Y = 312
    P(7).X = 65: P(7).Y = 146
    P(8).X = 0: P(8).Y = 86
    P(9).X = 89: P(9).Y = 86
    P(10).X = 124: P(10).Y = 0
    'Вызов этой функции при работе под Win2000 дает 0
    'Я менял второй параметр ставил его и 10 и 11, результат один и тот же.
    Rgn = CreatePolygonRgn(P(0), 10, 0)
    Call SetWindowRgn(hw, Rgn, True)

    Ответ:

    Автор ответа: Valery Tesher

    nPolyFillMode - определяет режим заполнения, используемый для определения того, какие пиксели входят в область. Может принимать одно из следующих значений:

           ALTERNATE
          Попеременный режим. Закрашиваются только те фрагменты внутренней области многоугольника, которые получаются путем соединения линий с нечетными номерами (1, 3, 5 и т. д.). Другие фрагменты внутренней области не закрашиваются.
          
           WINDING
          Сквозной. Windows закрашивает все внутренние области.
          


    Const ALTERNATE = 1 ' ALTERNATE and WINDING are
    Const WINDING = 2 ' constants for FillMode.

    В вашем примере

       Rgn = CreatePolygonRgn(P(0), 10, 0)

    необходимо 0 заменить на 1 или 2, например:

       Rgn = CreatePolygonRgn(P(0), 10, 1)


    Вопрос:

       Как сгенерировать случайное число, состоящее из 5 чисел, все из которых будут единицы или нули?

    Ответ:

    Автор ответа: Арамян Арам

    dim i as integer, res as integer, it as integer
      
    randomize timer
    for i=0 to 4
         if rnd>=0,5 then it=1 else it=0
         res=it*(10^i)
    next i



    Ответ:

    Автор ответа: Александр Юрьевич

    dim i%, n%, s$

    for i = 1 to 5
        n = (rnd(1) * 2) - 1
        if n = -1 then n = 0
        s = s & n
    next
    debug.print s



    Ответ:

    Автор ответа: Bullet [PCLO]

    Лучше всего оформить это в виде процедуры. Можешь это сделать так:

    Public Function GetRnd()
         Randomize
         For rndIndex = 0 To 4
             tmpRnd = Int(Rnd * 2)
             If tmpRnd = 1 Then tmpRnd = 0 Else tmpRnd = 1
             strRnd = strRnd & tmpRnd
         Next
         GetRnd = strRnd
    End Function

    Потом в теле программы просто делаешь вызывов типа:

           MyRndDidit = GetRnd



    Ответ:

    Автор ответа: Дамир

    Привет, если я правильно понял проблему, то ее можно решить так:

    Dim x As String
    Dim k As Integer
    Dim i As Integer
    x = ""
    k = 0
    i = 0
    For i = 0 To 4
      'инициализируем генератор случайных чисел
      Randomize
      'случайное число
      k = Rnd
      If k > 0.5 Then
       k = 1
      Else
       k = 0
      End If
      x = x & CStr(k)
    Next i
    'выводим полученное случайное число в Immediate Window
    Debug.Print x



    Ответ:

    Автор ответа: C...R...a...S...H

    Можешь сгенерировать любое число, а заменить его цифры:

    Dim aa As Long
    Randomize (Time)
    aa = Rnd() * 100000
    Dim str As String
    str = CStr(aa)
    For i = 1 To Len(str)
         If CInt(Mid(str, i, 1)) >= 5 Then Mid(str, i, 1) = "1" Else Mid(str, i, 1) = "0"
    Next i
    MsgBox aa & " " & str



    Ответ:

    Автор ответа: Anakonda

    Вот замутил функцию GetRnd. Для примера сделал модную нынче Matrix ;)
    Добавь на форму таймер, вставь этот код, BorderStyle поставь None = 0 и посмотри... Если долго пристально вглядыватся, то создаётся впечеатление движения :)
      
    Option Explicit
      
    Dim nom As String
    Dim i As Integer
      
    Private Sub Form_Load()
    Me.WindowState = 2
    Me.BackColor = 0
    Me.AutoRedraw = True
    Me.ForeColor = RGB(0, 255, 0)
    Timer1.Interval = 10
      
    End Sub
      
    Private Sub Timer1_Timer()
    Randomize Timer
    Me.Cls
    For i = 1 To 100
      
    Me.Print GetRnd(200) ' Если тебе надо пять символов, вызывай эту функцию с 5
    Next
    End Sub
      
    Function GetRnd(kolvo As Integer) As String
    Dim rez As String
    Dim i As Integer
      
         rez = ""
         For i = 1 To kolvo
             rez = rez + Trim(Str(Int(Rnd + 0.5)))
         Next
         GetRnd = rez
    End Function



    Ответ:

    Автор ответа: Neco

    По генерации кода:

    dim Pass as string,i as INteger
    randomize timer
    for i=1 to 5
             pass=pass+cstr(int(rnd*2))
    next i


    Вопрос:

       Как програмно изменять, добавлять или удалять данные, работая с ADODC?

    Ответ:

    Автор ответа: Арамян Арам

    set rs=adodc1.recordset
      
    rs.addnew - вставка строки( прописываешь в код кнопки "Добавить")
      
    rs.update - фиксирует изменения после addnew или редактирования(кнопка "Сохранить изменения")
    Редактирование(как и заполнение пустой строки) производиться либо через элементы управления (например DBGrid) либо в коде:
      
    rs.fields(0).value=10 'запишет в первый(нулевой) столбец выбранной строки значение "10"
      
      
    rs.delete - удаление выбранной строки( кнопка "Удалить")


    Вопрос:

       Каким способом можно считывать переменные из файла (например *.txt)? Я только знаю оператор Open, но он мне не подходит, потому что он считывает только одну строчку или файл целиком. Может можно использвать этот файл как-то по другому? В файле у меня написано:

    chislo=1
    nomer=51
    siename="Иванов"

    Как мне присвоить переменным эти значения?

    Ответ:

    Автор ответа: Dima

    Используй API для работы с ini-файлами:

    Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

    Могу скинуть класс для работы с этими функциями.



    Ответ:

    Автор ответа: Александр Паршин

    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

    Public Function ReadINI(AppName As String, KeyName As String, FileName As String, Default As String) As String
         Dim s As String, char As Long
         s = String(7001, 0)
         char = GetPrivateProfileString(AppName, KeyName, Default, s, 7000, FileName)
         ReadINI = Left(s, char)
    End Function
    Public Function WriteINI(AppName As String, KeyName As String, sData As String, FileName As String)
         WritePrivateProfileString AppName, KeyName, sData, FileName
    End Function

    Private Sub Command1_Click()

    WriteINI "Name", "siename", "Иванов", "имя Вашего файла" 'Записываем данные
    'Результат будет таков
    '[Name]
    'siename=Иванов
    Me.Text1.text = ReadINI("Name", "siename", "имя Вашего файла", "еси нету данных, то по умолчанию читаем хххх ")
    End Sub



    Ответ:

    Автор ответа: Neco

    По открытию файла:
    Ну собственно всё, что надо, ты уже знаешь. Остальное придётся ручками.

    Здесь пожалуй два варианта:

    1. Считывать построково и решать проблему так:

    dim v as integer
    v=instr(1,stroka,"=")
    if v>0 then
             varname=left$(stroka,v-1)
             select case varname
                     case "chislo":chislo=mid$(stroka,v+1)
                     ' и т.д.
             end select
    end if

    2. Считывать сразу весь файл (если он не огромный или у тебя нет напряга с оперативкой) и потом разбараться с ним через массивы:

    tmparr=split(fullfile,vbcrlf)
    ' Здесь проверку на правильность создания массива
    maxarr=ubound(tmparr) ' Пойдёт только в случае полной уверенности
    ' наличия массива,
    ' а потом в цикле применяешь или первый метод (см. выше) или опять
    ' Split:
    for i=0 to maxarr
             tmparr2=split(tmparr(i),"=")
             ' здесь опять проверка должна быть (я опускаю)
             varname=tmparr2(0)
             select case varname
                     case "chislo":chislo=tmparr2(1)
                     ' и т.д.
             end select
    next i

    select case в принципе можно заменить одним хитрым способом, который я видел, но никогда не применял, поэтому не запомнил - узнавание переменной по имени. Но в случае, если переменных немного, то проще select case'ом. А если ты точно знаешь в какой строке находится нужная переменная (к примеру INI-файл), то совсем просто: элементарно по порядку всех их вытаскиваешь...


    Вопрос:

       Как считывать информацию из базы данных? Например у меня есть база данных в формате Microsoft Acsess. Как мне присвоить переменным значения этой таблицы:

    Фамилия Имя Отчество
    Иванов Иван Иваныч

    Желательно, бея раяличных компонентов и библиотек.

    Ответ:

    Автор ответа: Арамян Арам

    Без различных библиотек и компонент ты даже кнопку на форме нарисовать не сможешь.
      
    В VB полно встроенных объектов для работы с БД (особенно MS Access): DataGrid, ADODC... Если покопаться можно много интересного накопать.


    Вопрос:

       Мой проект состоит из нескольких форм. Когда я загружаю вторую форму (через первую), то находящийся в ней ListBox опусташается, как это исправить??

    Ответ:

    Автор ответа: Neco

    Не выгружай вторую форму:

    Form2.hide

    или

    form2.visible=false



    Ответ:

    Автор ответа: C...R...a...S...H

    Попробуй скрывать форму не через Unload, a через Hide.


    Вопрос:

       Как разместить flash-анимацию на форму?

    Ответ:

    Автор ответа: Александр Паршин

    Есть такой контрол в системной папке:
    X:\WINDOWS\system32\Macromed\Flash\swflash.ocx


    Вопрос:

       Есть элемент Picture1 и нужно чтобы из буфера обмена картинка вставлялась в него.

    Picture1.Picture = LoadPicture(Clipboard.GetData)

    Данная команда постоянно выдает ошибку "Файл не найден "ХХХХХХ", где ХХХХХХ постоянно изменяющееся число.
    Подскажите, как определять, что в clipboard имеется картинка (BMP-формат или что-то в этом роде) и если это так, то вставить эту картинку в PictureBox и сохранить в файл, желательно в формате JPG.

    Ответ:

    Автор ответа: C...R...a...S...H

    if Clipboard.GetFormat (vbCFBitmap)=True then
        Picture1.Picture = Clipboard.GetData 'Вставка картинки из буфера
    end if
    SavePicture Picture1.picture, "c:\1.bmp"



    Ответ:

    Автор ответа: Сан Саныч

    Ну еще бы он нашел файл, которого нет! LoadPicture загружает картинку только из файла на диске. Надо делать так:

    If Clipboard.GetFormat(vbCFBitmap) Then Set Picture1.Picture = Clipboard.GetData

    А вот сохранить в jpg можно только при помощи спец. контрола (ActiveX).




    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел


    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу


    В избранное