Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ Builder 6] Поиск файлов, Требуется кусочек кода с комментариями 
:(
    Опции темы
Eugene82
  Дата 30.5.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



smile Помогите первокласснику! Плиз smile

К сессии (13.06.2005) надо написать прогу "Чистка диска"

Cреда Borland C++ Builder 6

Исходные данные и основные требования: Написать программу, которая
а) будет удалять с указанного устройства все файлы, имеющие расширения BAK и $$$;
б) будет удалять с указанного устройства все файлы имеющие расширения EXE, если кроме этого будет существовать в этом каталоге и файл с таким же именем, но с расширением PAS ( или BAS, или C, или FOR), за исключением файлов с именем TURBO.

-----
Почитав мануалы и проч. описания на русском, какие смог найти (с английским плохо к собственному стыду), так же пошарив поиском по Инету и найдя исходник похожей проги, но только на Visual C++ (что большой помощи мне не оказало), убедился, что задача довольно конретная и, привыших абстрагироваться по полной программеров, мало интересует. Начал юзать англоязычный хелп. Даже узнал что мне нужно использовать функции FindFirst(), FindNext(), и FindClose(). Про эти функции в моих русскоязычных мануалах ни слова! smile

Я даже алгоритм слегка вкурил: Есть у меня на форме DriveComboBox, из которого в переменную должно записываться имя диска, есть две кнопочки Search и Delete, по которым соответственно должны вызываться функции FindFirst() и DeleteFile()... А вот какого типа должны быть переменные, и сколько мне их понадобиться, и как их объявлять я не представляю smile

Поможите кто чем может! Пожалуйста!

Это сообщение отредактировал(а) Eugene82 - 30.5.2005, 20:31
PM WWW ICQ   Вверх
gepard
Дата 31.5.2005, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Как получить список файлов в папке, смотри в FAQ.
Далее тебе надо просто разбирать строку: ищешь "." в имени файла, смотришь что после неё и выполняешь необход. действия:
Цитата(Eugene82 @ 30.5.2005, 20:30)
а) будет удалять с указанного устройства все файлы, имеющие расширения BAK и $$$;
б) будет удалять с указанного устройства все файлы имеющие расширения EXE, если кроме этого будет существовать в этом каталоге и файл с таким же именем, но с расширением PAS ( или BAS, или C, или FOR), за исключением файлов с именем TURBO.


Это сообщение отредактировал(а) gepard - 31.5.2005, 05:07


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Eugene82
Дата 1.6.2005, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



2gepard Спасибо. То что нужно. Но плюс поставить пока не способен - постов мало.


Это сообщение отредактировал(а) Eugene82 - 1.6.2005, 10:52
PM WWW ICQ   Вверх
Akina
Дата 1.6.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Цитата(gepard @ 31.5.2005, 06:06)
ищешь "." в имени файла, смотришь что после неё и выполняешь необход. действия:


ищешь "." в имени файла
смотришь что после неё
если нашел точку, возвращаешься на предыдущий шаг
выполняешь необход. действия


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Eugene82
  Дата 2.6.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



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

Подскажите, какого вида на входе CPP-FAQ-002435 должны быть значения переменных path, mask?

Я недавно узнал (smile), что:
Код

char a; //объявляет переменныю типа char, а
char* b: //объявляет указатель на переменную типа char

В связи с эти возник вопрос:

Как правильно присвоить значение const char, указателю на char?

Не уверен, что вопрос правильный поэтому привожу в пример кусочек кода:
Код

void FindDir(char* path,char* mask) { /*Тело функции*/}

char* path;
char* mask;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     path = DriveComboBox1->Drive; //не правильно: Error2034 Cannot convert 'const char' to 'char *'
     mask = "*.*";
     FindDir(path,mask);
}

а как написать правильно?
PM WWW ICQ   Вверх
Eugene82
  Дата 3.6.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



C вопросом "Как присвоить указателю значение?" разобрался:
Код

        char drive = DriveComboBox1->Drive;
        char* path = &drive;
        Edit1->Text = AnsiString(path);


Кстати, что с этим кодом может быть не так? Выдаёт значение path в виде: буква_дискаal- - откуда и почему появились последние 3 символа? Снова неверное преобразование?

И ведь ещё двоеточие после буквы диска должно быть! Подскажите, как вставить это двоеточие в путь?

--------------
Разобрался со всеми вышеописанными проблемами благодаря _hunter.

Завтра буду мучать удаление найденных файлов... smile

Это сообщение отредактировал(а) Eugene82 - 3.6.2005, 19:24
PM WWW ICQ   Вверх
Eugene82
  Дата 5.6.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Akina @ 1.6.2005, 11:21)
ищешь "." в имени файла
смотришь что после неё
если нашел точку, возвращаешься на предыдущий шаг
выполняешь необход. действия


Это если использовать StrScan(), которая возвращает уазатель на первый найденный символ, но ведь можно использовать StrRScan(), которая возвращает указатель на последний найденный символ в строке. Тогда проверка на единственность точки в файле не нужна:
Цитата
смотришь что после неё
если нашел точку, возвращаешься на предыдущий шаг


Я правильно рассудил?

И таким же макаром мне надо определить расширение теперь?

И ещё. Вопрос знатокам ОС Windows:

Будет ли прорамма ищущая файлы *.BAK находить файлы *.bak?
PM WWW ICQ   Вверх
Eugene82
  Дата 5.6.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Появилось две идеи реализации проги:

1. Передавать в переменной mask в FindDir() "*.*", а потом разбором строки определять, что находиться в расширении.

2. Передавать в переменной mask в FindDir() сразу необходимые мне расширения "*.bak", "*.$$$" и т.д. Или даже в самой FinDir() запустить ещё одну рекурсию для смены расширений.

Что будет рациональнее:
- с позиции использования ресурсов компа,
- с позиции написания небольшого/несложного кода?

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

Это сообщение отредактировал(а) Eugene82 - 5.6.2005, 16:57
PM WWW ICQ   Вверх
Eugene82
  Дата 5.6.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Решил что вариант первый более приемлим, хотя файлы типа: *.BaK удалятся не будут - иначе придётся все варианты прописывать. И поскольку файлы типа *.bak создаются приложениями автоматически, то я оставил поверку только *.bak и *.BAK, ну и *.$$$ конечно (хорошо что с последним вариантов нет smile).

Моя программа уже удаляет файлы. Но так тихо и незаметно (а мне для курсовой надо чтобы результаты работы было видно или до удаления файлов, или хотя бы в виде лога), что я всё таки хочу сначала вывести файлы в список.

Хочу вывести найденные файлы в имеющийся FileListBox1:
Код

FileListBox1->Items->Add(wfd.cFileName); //Выдаёт ошибку "Access violation at address ...  in module ... Read of address 00000000"

Есть вариант:
Код

FileListBox1->AddItem(wfd.cFileName,TObject); //Но что нужно написать вместо TObject?

И вообще как можно вывести список найденых файлов? Ещё желательно в активный компонент, а не какой-нить Label!
PM WWW ICQ   Вверх
Eugene82
  Дата 6.6.2005, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Понял, что FileListBox для моих целей не подходит. Заменил его на простой ListBox. Научил программу выводить в него найденные файлы - файлы выводятся с полным путём.

Теперь надо реализовать удаления файлов(!!!) по сответствующим выделенным строкам.

Проблема первая:
В выделении может быть более одной строки. Т.е надо создать массив и поместить в него выделенные строки. А потом передавать по одному элементу в DeleteFile().

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

Проблема вторая (может саморазрешиться после решения первой?):
Тип строк ListBox TString, а тип аргумента для DeleteFile() есть AnsiString.

Как преобразовать TString в AnsiString?
PM WWW ICQ   Вверх
Akina
Дата 6.6.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Цитата(Eugene82 @ 6.6.2005, 11:35)
В выделении может быть более одной строки. Т.е надо создать массив и поместить в него выделенные строки. А потом передавать по одному элементу в DeleteFile().

У тебя список строк уже есть массив, причем у выбранных строк Selected = True...

Цитата(Eugene82 @ 6.6.2005, 11:35)
Тип строк ListBox TString, а тип аргумента для DeleteFile() есть AnsiString.

Заведи под это дело переменную типа AnsiString и копируй nels имя с явным либо неявным (буде можно) приведением.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Eugene82
  Дата 6.6.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



2Akina Готов расцеловать!!! smile smile

Сначала хотел спросить, что такое "nels имя", но подумал, что возможно ты не пользуешься програми типа Punto Switcher и "nels" есть "туды" smile

Реализовал кнопочку Delete. Первоначальный вариант был, как ты и советовал:
Код

for (int i = 0; i < ListBox1->Items->Count; i++) //Нашёл в хелпе примерчик: TCustomListBox::Items ...
{
        if (ListBox1->Selected[i])
        {
           AnsiString str = ListBox1->Items->Strings[i]; //Завёл "под это дело" переменную :)
           DeleteFile(str); //Удалил файл
        }
}
ListBox1->DeleteSelected(); //Очитстил от выделенных записей ListBox

Но проверил и следующий вариант воплотился в код smile:
Код

        if (ListBox1->Selected[i])DeleteFile(ListBox1->Items->Strings[i]); //Тоже работает


Спасибо огромное!!! smile Жаль не могу плюс поставить, но это дело поправимое - ещё постов 80 и я со всеми расчитаюсь smile ...Ещё часть б) надо доделать... ;)

Это сообщение отредактировал(а) Eugene82 - 9.6.2005, 18:59
PM WWW ICQ   Вверх
Eugene82
Дата 8.6.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



В части б) задания необходимо находить файлы с расширением exe. Написаная мною программа уже умеет находить файлы с заданым расширением.

Как теперь мне из имени файла взять всё кроме расширения?

Дано: AnsiString str1 = "filename.ext"

Надо получить: AnsiString str2 = "filename"

PM WWW ICQ   Вверх
Akina
Дата 9.6.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Если заведомо расширение ЕХЕ - кто мешает от строки откусить последние 4 байта?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Eugene82
Дата 9.6.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Akina @ 9.6.2005, 13:29)
Если заведомо расширение ЕХЕ - кто мешает от строки откусить последние 4 байта?


_hunter мне так и сказал:
Код

ChangeFileExt(ExtractFileName(), "");

PM WWW ICQ   Вверх
En_t_end
Дата 9.6.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Akina - парень smile
___первоначальный вариант был, как ты и советовала:____
PM MAIL ICQ Skype GTalk Jabber   Вверх
Eugene82
Дата 9.6.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(En_t_end @ 9.6.2005, 18:54)
Akina  - парень smile


Упс!!! smile

Akina - мои извинения! smile
PM WWW ICQ   Вверх
Poseidon
Дата 10.6.2005, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 5
Всего: 133



smile
Цитата(En_t_end @ 9.6.2005, 18:54)
Akina - парень

Вот оно! Нужда вынести пол пользователя к аватору! smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Eugene82
  Дата 12.6.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Послезавтра уезжаю в командировку, а сразу после командировки на сессию. Публикую окончательный вариант моей программы и кусочек моей курсовой работы smile
Код

//----------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void TestFile(char* delpath,char* filename)
{
        AnsiString lowname = AnsiLowerCase(AnsiString(filename));
        filename = lowname.c_str();
        AnsiString ext = AnsiStrRScan(filename,'\.');
        if(ext==".exe")
        {
                AnsiString name = ChangeFileExt(filename, "");
                if(name!="turbo")
                {
                        if(FileExists(delpath+ChangeFileExt(filename, ".pas")) || FileExists(delpath+ChangeFileExt(filename, ".bas")) || FileExists(delpath+ChangeFileExt(filename, ".for")) || FileExists(delpath+ChangeFileExt(filename, ".c")))
                        Form1->ListBox1->Items->Add(AnsiString(delpath)+filename);
                }
        }
        if(ext==".bak" || ext==".$$$")
        Form1->ListBox1->Items->Add(AnsiString(delpath)+filename);
}
void FindDir(char* path,char* mask)
{
WIN32_FIND_DATA wfd;
HANDLE hfound;
char newpath[MAX_PATH];
char fpath[MAX_PATH];
char delpath[MAX_PATH];
strcpy(fpath,path);
strcat(fpath,"\\");
strcpy(delpath,fpath);
strcat(fpath,mask);
if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)
{
if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
//нашли первый файл в папке path
        TestFile(delpath,wfd.cFileName);
}
while(FindNextFile(hfound,&wfd))
{
if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
//нашли ещё файл в папке path
        TestFile(delpath,wfd.cFileName);
}
}
}
FindClose(hfound);
//поиск файлов закончили, теперь ищем подпапки
strcpy(fpath,path);
strcat(fpath,"\\*.*");
if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)
{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
strcpy(newpath,path);
strcat(newpath,"\\");
strcat(newpath,wfd.cFileName);
FindDir(newpath,mask); //Рекурсивный вызов
}
while(FindNextFile(hfound,&wfd))
{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
strcpy(newpath,path);
strcat(newpath,"\\");
strcat(newpath,wfd.cFileName);
FindDir(newpath,mask); //Рекурсивный вызов
}
}
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Form1->ListBox1->Clear(); //Очистка поля вывода
        AnsiString drive = AnsiString(DriveComboBox1->Drive) + ":"; //Запись имени диска в виде «Диск:»
        char* path = drive.c_str();
        char* mask = "*.*";
        FindDir(path,mask); //Вызов функции поиска и вывода файлов в директории
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        for (int i = 0; i < ListBox[b]1->Items->Count; i++)[quote][quote]
        {[b]
                if (ListBox1->Selected[i])DeleteFile(ListBox1->Items->Strings[i]);
        }
        ListBox1->DeleteSelected();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        ListBox1->SelectAll();
}
//---------------------------------------------------------------------------

Цитата
Заключение
Разработка программы началась 30 мая 2005 года. Для написания данной программы использовался Borland С++ Builder 6. Автор впервые пользовался данной средой разработки, в связи с чем возникало множество вопросов. Основными вопросами были: связь визуальных компонентов на форме между собой; связь визуальных компонентов на форме с пользовательскими функциями, а так же преобразование типов данных, которые компилятор не может преобразовать автоматически. Автор благодарит за помощь в поиске ответов, на ставящиеся компилятором вопросы, и написании данной программы, своего друга Дубинина Антона Сергеевича, студента III курса РГПУ и всех участников форума программистов www.forum.vingrad.ru, которые нашли время чтобы ответить на мои вопросы.

Особую благодарность выражаю _hunter, Akina, Duster, gepard!!!

PM WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1235 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.