Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подскажите плиз. Работа с файлами. Access2000 (для профи)
 
 автор: akkorn   (11.01.2007 в 02:06)   личное сообщение
 
 

Ситуация следующая: Я создал базу данных изделий предприятия. На сервере этого же предприятия есть файлы разработок изделий. Я хочу сделать так, чтобы в форме в списке при нажатии кнопки "Показать изделия" появлялись строки с путями до файлов на сервере и при двойном клике - запускался файл в родном приложении.

Реализация:
На сервере все изделия раасортированы каждое в свою директорию. В базе-же содержится некий набор данных, по которым я смогу приблизительно определить имя директории, но оно будет с продолжением (пояснение). Пример:
В базе строка говорит: zn14-00-000-01
На сервере директория: zn14-00-000-01 Усилитель линейный

МОЯ ПРОБЛЕМА: На сервере ОЧЧЧЕНЬ МНОГО ФАЙЛОВ (директорий только под 700, а в каждой не менее 15 файлов!!(стандартно там куча поддиректорий со своими файлами)). Я написал функцию, которая находит все файлы, начинающиеся с "zn14-00-000-01". НО ФУНКЦИЯ РАБОТАЕТ ОЧЕНЬ ДОООООЛГО! (от 2 до 4 минут).

Подскажите, как мне сначала включить НЕ ПОИСК ФАЙЛОВ, А ПОИСК ПОХОЖЕЙ ДИРЕКТОРИИ, а потом уже в ней я включу как раз эту функцию поиска файлов.

Вот моя ф-ция:

Function A1() As String
A1 = "Файлы не найдены!"
Dim ListRes1 As String

With Application.FileSearch
.LookIn = "\\tyan\arhive\"
.FileName = "zn14-00-000-01"
.SearchSubFolders = True
.Execute SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending
For i = 1 To .FoundFiles.Count
If ListRes1 = "" Then
ListRes1 = .FoundFiles(i)
Else
ListRes1 = ListRes1 & ";" & .FoundFiles(i)
End If
Next i
End With

If Len(ListRes1) > 0 Then A1 = ListRes1
End01:
End Function

Результат работы этой функции строка, которую можно использовать как данные для списка. Что-то вроде (ф-ция кнопки на форме):
me.list1.rowsource=a1


ПОМОГИТЕ КТО МОЖЕТ!!! Я НЕ ЗНАЮ КАК ВКЛЮЧИТЬ ПОИСК ИМЕННО ПАПОК!!
Перепробовал уже все способы. Перерыл интернет. Все пусто. Нет даже намеков.
ПЛИЗЗЗ!

  Ответить  
 
 автор: osmor   (11.01.2007 в 09:30)   личное сообщение
 
 

сталкивался с подобной проблеммой.
нужно было искать по всем финтам файлы с определенным расиширением, переписывал 3 раза, в итоге сделал на API... вот только найти никак не могу, куда запихнул, если найду - кину
пока могу посоветовать использовать FileSystemObject (тоже довольно быстро работает).
справка по FSO на русском
http://www.arimsoft.ru/msaccess/FileSystemObject.zip

  Ответить  
 
 автор: akkorn   (11.01.2007 в 19:10)   личное сообщение
 
 

Спасибо большое. Буду пробовать на FSO (правда для меня пока это вообще новое что-то).
Если Вы все-таки обнаружите Вашу волшебную функцию- моей радости просто не будет предела! ;-)))

  Ответить  
 
 автор: osmor   (12.01.2007 в 08:50)   личное сообщение
 
 

писалось 3 года назад.
Перерыл все ... Написал письмо заказчику, может у него осталось... пока молчит
поищите в инете по:
FindFirstFile и FindNextFile

  Ответить  
 
 автор: час   (12.01.2007 в 21:15)   личное сообщение
 
 

Извините, (я не профи) а таблица с директориями не подойдёт...
Это же база данных , вот и создать вам таблицу с полем (ПУТЬ К .....),
значение поля \\Болты\
значение поля \\Винты\

А внутри уже файлы будете искать...

А если подробную табличку состряпать с путями и файлами, то и порядок будет и искать раз плюнуть...
Вот табличку можно автоматом создать, используя то что ВЫ уже написали(код)

  Ответить  
 
 автор: akkorn   (12.01.2007 в 23:23)   личное сообщение
 
 

Уважаемый ЧАС!
Проблема состоит в том, что работает целое предприятие над разработками, и за один день через нормоконтролеров может проходить довольно большой обьем информации. А разработчики на то и нужны, чтобы разрабатывать нечто новое.
Вот и выходит, что информация постоянно меняется, в большинстве своем чаще добавляются файлы и папки.....

В связи с этим невозможно использовать ваш совет. Спасибо за ваше участие. Буду рад снова наблюдать вас здесь. Пожалуйста, не обижайтесь: Я считаю, что чем больше мыслей- тем ближе к истине. :-))

  Ответить  
 
 автор: час   (13.01.2007 в 11:14)   личное сообщение
 
 

Я не обижаюся я помогаю .
Так ведь вновь заносимые файлы сразу со своими путями со всех компов заносятся (соэдав програмку из нескольких строк) в эту общедоступную на сервере табличку.
хотел отправить файлик , но....
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND hide = 'show'' at line 2

  Ответить  
 
 автор: час   (13.01.2007 в 11:41)   личное сообщение
 
 


'***************************************************************
'   Подписка:   "Access 2000 - программирование и готовые решения"
'   Тема:       Application.FileSearch
'   Пример 1:   Поиск файлов по шаблону
'   Версия:     1 от 19.10.2001
'   Copyright © Leader Access, Ltd
'   Сайт:       http://www.leadersoft.ru
'   Почта:      support@leadersoft.ru
'   Примечание: При использовании в коммерческих целях - оплата 100 рублей
'
Option Compare Database
Option Explicit

'==============================================================
' Поиск файлов по шаблону
Private Sub butRead_Click()
Dim i As Long
On Error GoTo 999
    With Application.FileSearch
       .NewSearch
       .LookIn = Me.myFolder ' = c:\
       .FileName = Me.myExt ' = *.mdb
       .SearchSubFolders = Me.myFflagSubFolder ' = True
       If .Execute(SortBy:=msoSortByFileName, _
                SortOrder:=msoSortOrderAscending) > 0 Then
            Me.progress = "Count=" & .FoundFiles.Count & vbCrLf
            For i = 1 To .FoundFiles.Count
                Me.progress = Me.progress & .FoundFiles(i) & vbCrLf
            Next i
       End If
    End With
    Exit Sub      'Выходим из программы
999:
    MsgBox Err.Description
    Err.Clear 'Очищаем поток от ошибок
End Sub

  Ответить  
 
 автор: час   (13.01.2007 в 11:43)   личное сообщение
 
 

и вот ещё...

'***************************************************************
'   Подписка:   "Access 2000 - программирование и готовые решения"
'   Тема:       Работа с внешним бинарным файлом
'   Версия:     1 от 02.09.2002
'   Автор:      Copyright © LeaderAccess, LTD
'   Сайт:       http://www.leadersoft.ru
'   Почта:      support@leadersoft.ru
'   Примечание: При использовании в коммерческих целях - оплата 100 рублей
'
Option Compare Database
Option Explicit

'==============================================================
' При загрузке формы загружаем файлы
Private Sub Form_Load()
    funAutoReadAllFiles Application.CurrentProject.Path, "*.txt"
End Sub

'==============================================================
' Прочитаем имена файлов и загрузим их в таблицу
'
Private Sub funAutoReadAllFiles(strDir As String, strFileExt As String)
Dim i As Long, rst As DAO.Recordset
On Error GoTo 999
        With Application.FileSearch
           .NewSearch
           .LookIn = strDir ' *.name
           .FileName = strFileExt ' *.txt
           .SearchSubFolders = False
           If .Execute(SortBy:=msoSortByFileName, _
                    SortOrder:=msoSortOrderAscending) > 0 Then
                For i = 1 To .FoundFiles.Count
                    If MsgBox("Загрузить файл: " & .FoundFiles(i), vbInformation + vbOKCancel, "Загрузить") = vbOK Then
                        funAutoReadOneFile .FoundFiles(i), "Таблица5"
                        Me.table5.Requery
                    End If
                Next i
           End If
        End With
    Exit Sub      'Выходим из программы
999:
    MsgBox Err.Description
    Err.Clear 'Очищаем поток от ошибок
End Sub

'==============================================================
' Загружаем файл в таблицу
'
Private Function funAutoReadOneFile(strFileName As String, strTable)
Dim fs, f, flag
Dim dbs As DAO.Database, rst As DAO.Recordset

    On Error GoTo 999
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(strFileName)
    
    ' Проверка файла
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("select * from " & strTable)
    
    If rst.RecordCount Then
        rst.MoveLast
        rst.MoveFirst
    End If
    
    rst.FindFirst "[FileName] = '" & strFileName & "'"
    If rst.NoMatch = False Then
        dbs.Close
        rst.Close
        Exit Function
    End If
    
    ' Добавление информации о дате создания
    rst.AddNew
    rst!FileName = strFileName
    rst!DateCreated = f.DateCreated
    
    ' Добавление информации о содержимом
    rst!Memo = ""
    Set f = fs.OpenTextFile(strFileName, 1, False)
    Do While f.AtEndOfStream <> True
        rst!Memo = rst!Memo & f.ReadLine ' Читаем построчно
    Loop
    f.Close
    
    ' Сохранение содержимого
    rst.Update
    rst.Close
    dbs.Close
    
    Exit Function
999:
Ошибка:
    MsgBox Err.Description
    Err.Clear
    rst.Close
End Function

  Ответить  
 
 автор: час   (13.01.2007 в 11:46)   личное сообщение
 
 

А чего Вы своё "Е-мель" не напишите? .....

  Ответить  
 
 автор: akkorn   (13.01.2007 в 19:37)   личное сообщение
 
 

>А чего Вы своё "Е-мель" не напишите? .....
Уже исправился..

Уважаемый ЧАС!
Если честно, то я не понял смысл вашей фразы:
"...Так ведь вновь заносимые файлы сразу со своими путями со всех компов заносятся (соэдав програмку из нескольких строк) в эту общедоступную на сервере табличку..."

Как мне думается, вы хотели сказать, чтобы люди из отдела Документации при выкладывании файлов также регистрировали их и в базе?
Если я правильно понял суть, то хочу вновь вас разочаровать. С компьютерами на данном предприятии знакомы посредственно (к примеру, мастер участка на производстве в конце месяца собирает данные о работниках (кто сколько отработал) и забивает эти данные в Excel. Далее ИХ РАСПЕЧАТЫВАЕТ НА ПРИНТЕРЕ, НЕСЕТ В ОТДЕЛ ПЕРСОНАЛА И ТАМ ЭТИ ДАННЫЕ ДРУГОЙ ЧЕЛОВЕК ЗАНОСИТ В Excel!!!!!!!!!!!!!!!!! Самое плохое - то, что это ИМЕННО ТАК и обстоит! ). А про мою базу, полагаю, ни кто и не вспомнит даже на второй день!! И заносить данные туда соответственно ни кто не будет (эта база в первую очередь необходима самим разработчикам, а нормоконтролерам, или тем более отделам разным она ни к селу и к месту :-(( )... Тем более такой способ не отображает текущего состояния данных на сервере.

В описанных же вами функциях везде стоит функция Application.FileSearch
Если вы посмотрите, в моем вопросе тоже используется эта ф-ция. Проблема состоит в том, что КОЛИЧЕСТВО ФАЙЛОВ БОЛЬШОЕ и после нажатия кнопки на форме вся система виснет на 2-4 минуты наглухо!! (для примера попробуйте поискать на диске C:\ файлы с символом в имени "a". Вы увидите, что для постоянного пользования эта ф-ция не подходит, а народ хочет ИМЕННО ПОСТОЯННО ЕЕ ЮЗАТЬ (почему я и пытаюсь что-либо сделать).
Зависание происходит после выполения команды ".Execute"

В любом случае- спасибо вам за советы. С нетерпением жду еще. :-))

  Ответить  
 
 автор: Explorer   (13.01.2007 в 21:03)   личное сообщение
 
 

>>она ни к селу и к месту

воще-то ИМХО и оглядываясь на опыт, тогда ВООБЩЕ нет смысла напрягаться...

ты потратишь кучу времени и сил, а завтра уже твое решение не будет нужно никому...

по application.filesearch - в принципе в таких условиях полная переиндексация системы директорий и файлов - едва ли не единственй возможный способ решения задачи и 2-4 минуты потери времени не проблема - главное куда прикрутить такую переиндексацию.. найди место где все равно есть пустые потери времени...

1) например запускай переиндексацию при логине в базу, пока юзер входит, вторая база сканит файлы и апдейтит таблицы - юзер вошел, а структура директорий уже готова.

2) файлы в директориях сканить ккаждый раз когда юзер обращается к определеной директории - нет нужды делать это каждый раз для всех папок - только для конкретных


блин... там Чичерина по Северо-Запад плюс - побежал смотреть

со старым новым годом всех...

Сегодня http://news.bbc.co.uk/hi/russian/news/newsid_6205000/6205333.stm

  Ответить  
 
 автор: час   (14.01.2007 в 12:10)   личное сообщение
 
 

1) например запускай переиндексацию при логине в базу, пока юзер входит, вторая база сканит файлы и апдейтит таблицы - юзер вошел, а структура директорий уже готова.

Всегда нужна свежая информация о выложеных файлах?(ежеминутно).
Или их выкладывают только вечером?

  Ответить  
 
 автор: akkorn   (14.01.2007 в 16:50)   личное сообщение
 
 

>Всегда нужна свежая информация о выложеных файлах?(ежеминутно).
>Или их выкладывают только вечером?

Инфу выкладывают в течении всего рабочего дня (народ работает ведь).

################################

2) файлы в директориях сканить ккаждый раз когда юзер обращается к определеной директории - нет нужды делать это каждый раз для всех папок - только для конкретных

согласен. но это ведь база данных, в кторой в свою очередь находится ВСЯ информация. Соответственно не известно, какую именно директорию запросит пользователь. А как я в самом начале сказал, информация из базы НЕ ТОЧНО определяет директорию. Потому и мучаюсь...

#########################

1) например запускай переиндексацию при логине в базу, пока юзер входит, вторая база сканит файлы и апдейтит таблицы - юзер вошел, а структура директорий уже готова.

Согласен, как идея - самое то. Проблема состоит в том, что:
1- вход в базу пока "для всех только для чтения". Только избранные имеют доступ для редактирования. Соответственно при запуске сразу открывается главная форма. Т.К. на предприятии работает более 1000 человек, для каждого выдавать пароль нет смысла. А один для юзеров- тоже проблема, т.к. пользователи НЕ ВСЕ будут знать нужный пароль (пользоваться то должно ВСЁ предприятие). Далее- при индексации скажем раз в день должен быть полный доступ до базы, что тоже исключено. :-((
2- При индексации повисает компьютер (на 2-4мин). Мне же сделан доступ тоже только для чтения (это потому, что данные очень не хочется потерять). Я могу только начальнику принести новую версию и он заменит старую базу на новую. Хотя мне предлагали полный доступ- я сам отказался (если что случится, как вы думаете, кто останется виноватым?).


Всех с Праздником поздравляю! Счастья, радости, успехов пожелаю! Пусть невзгоды и сомненья растворятся на ходу, а здоровье и удача закрепятся с вами!
во как сходу сочинил :-)))

Хочу всех поблагодарить за советы! Решение по немногу прорисовывается. Если есть идеи- рад буду наблюдать их здесь.

Вроде что-то нашел, только у меня не работает- сплошные ошибки выдает. Если есть у кого желание- помогите разобраться с листнгом..
http://vbnet.mvps.org/index.html?code/fileapi/oldestfolder.htm

  Ответить  
 
 автор: Explorer   (14.01.2007 в 17:05)   личное сообщение
 
 

использовать для индексации файловой структуры внешню программу запускаемую на сервере и сбрасывающую данные в лог - текстовый файл например, его и подключать к базе

  Ответить  
 
 автор: akkorn   (14.01.2007 в 17:29)   личное сообщение
 
 

>использовать для индексации файловой структуры внешню
>программу запускаемую на сервере и сбрасывающую данные в лог
>- текстовый файл например, его и подключать к базе

согласен. но не годится, т.к. доступ должен быть только для чтения. разбрасывать же базу по всему серверу (там фейс, там данные, а там структура архива файловой системы) мне не позволят. начальник же (только у него пока полный доступ) обновлять инфу в базе не станет- у него своих дел много.
Я бы давно уже что-нибудь придумал, но в силу приведенных ограничений и решил задать вопрос здесь. Необходимо чтобы результат был сразу же получен пользователем при непосредственном "сканировании" файловой системы архива и отображал информацию В НАСТОЯЩИЙ момент. вот в этом то и загвоздка!

  Ответить  
 
 автор: Explorer   (15.01.2007 в 09:16)   личное сообщение
 
 

тогда только смириться с "потерей времени" хотя ИМХО 2-4 минуты это не так много,

в конце концов можно оптимизировать алгоритм сканирования структуры директорий

  Ответить  
 
 автор: akkorn   (15.01.2007 в 17:20)   личное сообщение
 
 

Уважаемый Explorer!
Вот в том то и вопрос стоит: КАК ИМЕННО можно его оптимизировать??

  Ответить  
 
 автор: Explorer   (15.01.2007 в 18:05)   личное сообщение
 
 

например не использовать treewiev и подобные-же парадигмы типа деревьев, не использовать рекурсии, и не лезть вглубь структуры, а граничиваться обзором только одного активного уровня

держать активной и проапдейченой только одну директорию, как в RAR'е например

  Ответить  
 
 автор: osmor   (15.01.2007 в 17:29)   личное сообщение
 
 


Sub lstFolders(strNameFolder As String) 
' процедура получения всех поддиректорий 
Dim subFolder As Object 
Dim folder As Object 
Dim fso As Object 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set folder = fso.GetFolder(strNameFolder) 
For Each subFolder In folder.SubFolders 
     Debug.Print subFolder.path 
   lstFolders(subFolder.Path) 
Next 

End Sub 


работает довольно шустро

  Ответить  
 
 автор: akkorn   (15.01.2007 в 21:41)   личное сообщение
 
 

пасибо большое! это именно то что необходимо.

можно 2 маааленьких вопросика? (я не могу разобраться)-

1)
на строчку
lstFolders (subFolder.Path)

ругается, говорит что нет такой ф-ции (Sub or Function not defined).
как я понимаю,- это просто принимающая адрес функция. если это не так- пожалуйста поправьте меня. спс!

2)
эта функция не ищет директории в поддиректориях (производит поиск только в той, которую указали при запуске ф-ции). можно ли это как-то изменить?


Большое Вам Спасибо!

  Ответить  
 
 автор: osmor   (16.01.2007 в 08:29)   личное сообщение
 
 

1. не совсем понятно почему... ну попробуйте так:

Public Function lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
     Debug.Print subFolder.Path
  Call lstFolders(subFolder.Path)
Next

End Function


2. эта функция возвращает имена ВСЕХ поддиректория находящихся внутри стартовой директории любого уровня вложенности. т.е. если ее вызвать так:
call lstFolders("c:\")
то будут выведены имена ВСЕХ директорий и поддиректорий которые есть на диске "С".

  Ответить  
 
 автор: akkorn   (16.01.2007 в 17:55)   личное сообщение
 
 

Добрый день, osmor!
Хочу Вас еще раз потревожить: функция
lstFolders(subFolder.Path) или
Call lstFolders(subFolder.Path)
все равно не работает! Пишет:
"Compile error:
Sub or Function not defined"
(Error 35)

Более того, ваша функция ищет папки ИМЕННО В КОРНЕ ЗАДАННОЙ, а глубже не лезет. Вот посмотрите, я изменил немного код и приведу Вам пример отработки этой функции:


Function a22()
Dim strNameFolder As String
strNameFolder = "c:\"
Dim Str01 As String
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
'Debug.Print subFolder.Path ' <<вследствии ненужности в данной модификации этой функции
'MsgBox subFolder.Path ' <<вследствии ненужности в данной модификации этой функции
'Call lstFolders(subFolder.Path) '<<вследствии невозможности запуска
Str01 = Str01 & " ; " & subFolder.Path
Next
[Form_Form1].Pole1 = Str01
End Function


А вот результат ее работы (из поля формы):
; C:\113 22 ; C:\Config.Msi ; C:\Documents and Settings ; C:\Program Files ; C:\RECYCLER ; C:\System Volume Information ; C:\WINDOWS


Помогите, плиз! Не бросайте на финише .. :-))



=====
Редактирование сообщения:
Опа! Только что заметил: у Вас происходит рекурсивный запуск функции (т.е. функция сама себя запускает много раз, перед тем как первая отрабатывает до конца и освобождает память). Скажите пожалуйста, если задать этой функции диск "c:\", а на компьютере установлена OS WinXP и памяти оперативной 256 мб, - со второго-третьего запуска, я полагаю, пользователь увидит стандартное сообщение Windows "Не достаточно оперативной памяти...".
А в связи с тем, что имя функции я поменял- соответственно все выше приведенные вопросы (кроме последнего) не имеют смысла. Зато последний..

Спасибо Вам, что написали эту функцию за меня
Выскажете, пожалуйста, Ваше мнение- очень хочется услышать.

  Ответить  
 
 автор: osmor   (16.01.2007 в 18:25)   личное сообщение
 
 

win xp Sp2
512 мег памяти
диск D - 5108 директорий
С выводом имен в окно отадки отработала за 2 мин 10 сек
без вывода имен за 1 мин 25 сек.
запускал 5 раз
ошибки не получил.
Для уменьшения объема занимаемой памяти можно вынести в Public переменную FSO
и тогда
Set fso = CreateObject("Scripting.FileSystemObject")
определять только один раз .
Наверное так будет правильнее. Даже не наверное, а точно.

а какой последний вопрос? про память?

  Ответить  
 
 автор: akkorn   (18.01.2007 в 00:06)   личное сообщение
 
 

Да, все верно. Последний вопрос был связан с памятью (точнее, с предположением вывода ошибки Windows о переполнении памяти при работе этой функции на компьютерах с малым ее обьемом (256 мб и менее)).

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


Option Compare Database

Public Fso As Object
Set Fso = CreateObject("Scripting.FileSystemObject")

Public Function lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Set folder = Fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
Debug.Print subFolder.Path
Call lstFolders(subFolder.Path)
Next
End Function


Правда, возникает ошибка на строке
Set Fso = CreateObject("Scripting.FileSystemObject")

Не подскажете, как от нее можно избавиться (необходимо ведь определять эту переменную только ОДИН раз).

Спасибо.

  Ответить  
 
 автор: osmor   (18.01.2007 в 08:36)   личное сообщение
 
 


Option Compare Database

Public Fso As Object

Public Function GetListFolders(strNameFolder As String)
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Call lstFolders(strNameFolder)
End Function

Private Function lstFolders(strNameFolder As String)
' процедура получения всех поддиректорий
Dim subFolder As Object
Dim folder As Object
Set folder = Fso.GetFolder(strNameFolder)
For Each subFolder In folder.SubFolders
   Debug.Print subFolder.Path
  Call lstFolders(subFolder.Path)
Next
End Function

  Ответить  
 
 автор: akkorn   (18.01.2007 в 22:41)   личное сообщение
 
 

Спасибо вам большое. Буду юзать.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList