-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80




Форум на Исходниках.RU


Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://forum.sources.ru.
Данный дневник сформирован из открытого RSS-источника по адресу http://forum.sources.ru/yandex.php, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Помогите разобраться с макросом и сохранении значений работы в книге Excel

Вторник, 21 Июля 2020 г. 12:44 + в цитатник
User32: Доброго времени суток всем.

В VBA я не силен, и не знаю многих моментов. Порошу помочь всех гуру VBA.
Собственно задача стоит такая: есть макрос сохранёный в файле .xla в папке %UserProfile%\AppData\Roaming\Microsoft\AddIns
Код модуля:
    Attribute VB_Name = "Module1"
    Dim Chr(32) As String
    Option Compare Text ' эта строка нужна обязательно! (сравнение без учёта регистра)
    Private Function DativeCase(sSurname$, Optional sName$, Optional sPatronymic$) As String
    ' Функция формирует дательный падеж из ФИО
    ' Параметры: sSurname - фамилия, sName - имя, sPatronymic - отчество
    Application.Volatile True ' автопересчёт формулы на листе
    sSurname$ = Replace(sSurname$, " - ", "-"): sSurname$ = Replace(Replace(sSurname$, " -", "-"), "- ", "-")
    On Error Resume Next
    If sName$ = "" And sPatronymic$ = "" Then
    arr = Split(Application.Trim(sSurname$))
    sSurname$ = arr(0): sName$ = arr(1): sPatronymic$ = Replace(arr(2), ".", "")
    End If
    ' пол теперь определяется иначе: что заканчивается на "вна" или "кызы" - то женщины, остальные - мужчины.
    Dim bMaleSex As Boolean: ' bMaleSex = (Right(sPatronymic, 1) = "ч" Or Right(sPatronymic, 4) = "оглы")
    bMaleSex = Not (Right(sPatronymic, 2) = "на" Or Right(sPatronymic, 4) = "кызы")
    If Len(sSurname) > 0 Then ' Фамилия
    arrSurname = Split(sSurname, "-")
    For i = LBound(arrSurname) To UBound(arrSurname) ' перебираем все части фамилий, содержащих дефис
    sRes = "": sSurnamePart = arrSurname(i)
    If bMaleSex Then ' мужские фамилии
    Select Case Right(sSurnamePart, 1)
    Case "о", "и", "ы", "у", "э", "е", "ю": sRes = sSurnamePart
    Case "ь", "й": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ю"
    Case "я", "а": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "е"
    If UBound(arrSurname) > 0 And i = 0 Then sRes = sSurnamePart
    Case Else: sRes = sSurnamePart & "у"
    End Select
    Select Case Right(sSurnamePart, 2) ' добавлено, для редких фамилий
    Case "ец": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "цу"
    If LCase(sSurnamePart) Like "*[уеыаоэяиюё]ец" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "цу"
    If LCase(sSurnamePart) Like "*[!уеыаоэяиюё][!уеыаоэяиюё]ец" Then sRes = sSurnamePart & "у"
    Case "зе", "их", "ых": sRes = sSurnamePart
    Case "ый": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ому"
    Case "ий", "ой": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ому"
    If Len(sSurnamePart) <= 4 Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ю"
    If Right(sSurnamePart, 3) = "чий" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ему"
    Case "уй": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ую"
    End Select
    Else ' женские фамилии
    Select Case Right(sSurnamePart, 1)
    Case "о", "е", "э", "и", "ы", "у", "ю", "б", "в", "г", "д", "ж", "з", "к", "л", "м", "н", "п", _
    "р", "с", "т", "ф", "х", "ц", "ч", "ш", "щ", "ь", "й": sRes = sSurnamePart
    Case "я": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ой"
    Case Else: sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ой"
    End Select
    Select Case Right(sSurnamePart, 2) ' добавлено, для редких фамилий
    Case "ха", "ла", "ее": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "е"
    End Select
    End If
    ' не склоняются мужские и женские фамилии, оканчивающиеся на -о, -е, -э, -и, -ы, -у, -ю,
    ' а также на -а с предшествующей гласной
    If LCase(sSurnamePart) Like "*[уеыаоэяиюё]а" Then sRes = sSurnamePart
    arrSurname(i) = sRes
    Next
    DativeCase = Join(arrSurname, "-") & " " ' соединяем части склоняемой фамилии обратно в одну строку
    End If
    If Len(sName) > 0 Then ' Имя
    NameException$ = GetDativeException(sName)
    If Len(NameException$) Then ' для имен-исключений
    DativeCase = DativeCase & NameException$
    Else ' имя не найдено в списке исключений
    If bMaleSex Then
    Select Case Right(sName, 1)
    Case "й", "ь": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "ю"
    Case "я", "а": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "е"
    Case "о": DativeCase = DativeCase & sName
    Case Else: DativeCase = DativeCase & sName & "у"
    End Select
    Else
    Select Case Right(sName, 1)
    Case "а", "я"
    If Mid(sName, Len(sName) - 1, 1) = "и" Then
    DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "и"
    Else
    DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "е"
    End If
    Case "ь": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "и"
    Case Else: DativeCase = DativeCase & sName
    End Select
    End If
    End If
    DativeCase = DativeCase & " "
    End If
    If Len(sPatronymic) > 0 Then ' Отчество
    If Right(sPatronymic, 4) = "оглы" Or Right(sPatronymic, 4) = "кызы" Then
    DativeCase = DativeCase & sPatronymic
    Else
    If bMaleSex Then
    DativeCase = DativeCase & sPatronymic & "у"
    Else
    DativeCase = DativeCase & Mid(sPatronymic, 1, Len(sPatronymic) - 1) & "е"
    End If
    End If
    End If
    DativeCase = Replace(DativeCase, "-", "- ")
    DativeCase = StrConv(DativeCase, vbProperCase)
    DativeCase = Replace(DativeCase, "- ", "-")
    End Function
    Private Function GetDativeException(ByVal txt$) As String ' склонение имён-исключений
    Select Case txt$
    Case "Павел": GetDativeException = "Павлу"
    Case "Лев": GetDativeException = "Льву"
    Case "Пётр": GetDativeException = "Петру"
    ' список расшинен
    Case "Михайло": GetDativeException = "Михайлу"
    Case "Мария": GetDativeException = "Марии"
    Case "Зоя": GetDativeException = "Зои"
    Case "Игор": GetDativeException = "Игорю"
    Case "Олеся": GetDativeException = "Олеси"
    Case "Дмитро": GetDativeException = "Дмитру"
    Case "Валерия": GetDativeException = "Валерии"
    Case "Любов": GetDativeException = "Любови"
    ' без изменения (не склоняются) - перечисляем через запятую
    Case "Али", "Бали": GetDativeException = txt$
    End Select
    End Function
    Function ДательныйФИО(FIO$) As String
    'ДательныйФИО = DativeCase(FIO$)
    ' возвращаем пустую строку при нулевом аргументе
    If ДательныйФИО = "" Then
    ДательныйФИО = Chr(32)
    End If
    ДательныйФИО = ДательныйФИО
    End Function


В Екселе мы добавляем Параметры Excel -> Надстройки ...
И в новых документах можем вызывать пользовательские функции.
В ячейке A1 пропишем Ф.И.О. - Иванов Иван Иванович, а в ячейку B1 нашу функцию =ДательныйФИО(A1) получим результат Иванову Ивану Ивановичу
Ивсе хорошо, но стоит только сохранить файл и открыть на другом ПК где нет нашей условной библиотеки функций то вместо результата будет ссылка на наш файл и функцию а не полученый результат - Иванову Ивану Ивановичу.
Как сохранять результат чтобы он был доступен на любом ПК без нашей условной библиотеки функций?

https://forum.sources.ru/index.php?showtopic=419201&view=findpost&p=3834790


Метки:  

Клуб любителей Unreal Tournament

Вторник, 21 Июля 2020 г. 11:56 + в цитатник
B.V.:
Цитата Mikle @
Порт то на dx9 у меня давно есть

Если что, выше речь идёт исключительно об рендерере, dll-ке в папке System

Цитата Mikle @
Вообще, в UT99 есть один неприятный для сетевой игры баг

Проявляется на всех рендерерах?

https://forum.sources.ru/index.php?showtopic=271526&view=findpost&p=3834785


Метки:  

Черный список нечестных работодателей

Вторник, 21 Июля 2020 г. 11:05 + в цитатник
Chilling0ut:
Цитата Chilling0ut @
Спасибо, сейчас они все такие официальные, Черный список нечестных работодателей фотошопом научились пользоваться, делают липовые даже документы.

https://forum.sources.ru/index.php?showtopic=102647&view=findpost&p=3834783


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 11:02 + в цитатник
D_KEY:
Цитата Wound @
Чем то похоже на идиому copy-and-swap

Ну да. Что бы ни произошло в методе load, это не затронет состояние, пока работа не будет завершена. Сначала делаем все операции, которые могут привести к ошибке, потом меняем состояние (тут уже ошибок быть не может).

Хотя конкретно тот мой код просто пример, а не реальный код.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834782


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 10:46 + в цитатник
Wound:
Цитата D_KEY @
Это передача владения ресурсом.

Чем то похоже на идиому copy-and-swap https://ru.wikipedia.org/wiki/Copy-and-swap

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834781


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 10:32 + в цитатник
D_KEY:
Цитата JoeUser @
Говоришь нет дурацких if'ов

Да, нет. Конкретно этот if не дурацкий, кроме того, его вполне может не быть, он там лишь для примера, чтоб ты мог управлять успешным/не успешным завершением.

Цитата
В твоем варианте - обеспечить передачу владения.

В чем тут трудность или проблема-то? У ресурсов должны быть владельцы - это хороший подход, очень многие вещи упрощает.

Цитата
Но раз, ты нагородил еще более моего

Меньше :)
И код гораздо проще. И ошибиться в нем довольно сложно, гораздо сложнее, чем у тебя.

Но кто я такой, чтобы мешать тебе продолжать писать говнокод? :D

Добавлено
Цитата JoeUser @
В моем варианте - обеспечить неудаление нужного. В твоем варианте - обеспечить передачу владения. Что по сути звучит. и то, и то одинаково: не потерять лишнее.

Я не понимаю тебя, если честно.

Давай начнем с простого.
Вот это, на твой взгляд, одинаково "звучит":

    int * p = new 10;
    // ...
    delete p;


И

    auto p = std::make_unique(10);
    // ...


?

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834780


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 10:27 + в цитатник
Wound:
Цитата JoeUser @
Не разобравшись - советуешь!
При чем тут вообще исключения? Вопрос в другом. В случае успешного прохождения полной цепочки инициализаций - ничего освобождать не нужно. После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.

Почитай как работает система исключений в С++ при конструировании объекта.
На ка тебе пример еще в догонку, расскажи пожалуйста что тут работает не так, как ты описал? Очень интересно послушать.
https://ideone.com/SI8Kz6
    #include
    using namespace std;
    struct Resource
    {
    Resource(int id)
    {
    m_id = id;
    if(id == 3)
    {
    throw "Error during initialize: id can't be 3";
    }
    std::cout << "initialize resource with id: " << id << std::endl;
    }
    ~Resource()
    {
    std::cout << "Destroy Resource with id: " << m_id << std::endl;
    }
    private:
    int m_id;
    };
    struct ResourceWrapper
    {
    ResourceWrapper(int id1, int id2, int id3, int id4, int id5)
    : m_rc1(id1),
    m_rc2(id2),
    m_rc3(id3),
    m_rc4(id4),
    m_rc5(id5)
    {
    }
    private:
    Resource m_rc1;
    Resource m_rc2;
    Resource m_rc3;
    Resource m_rc4;
    Resource m_rc5;
    };
    int main()
    {
    {
    std::cout << "without errors:" << std::endl;
    ResourceWrapper rc(5,6,7,8,9);
    }
    std::cout << "==========================" << std::endl;
    try
    {
    std::cout << "with errors:" << std::endl;
    ResourceWrapper rc(1,2,3,4,5);
    }
    catch(const char* error)
    {
    std::cout << "Error: " << error << std::endl;
    }
    // your code goes here
    return 0;
    }

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834779


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 09:26 + в цитатник
JoeUser: И у меня нет "дурацких флагов", есть описатели состояния. И goto уже нет. Говоришь нет дурацких if'ов:

    if (success) {
    init_.swap(init);
    });

По-моему уже пришли к вопросу бутерброда, с какой стороны правильно намазывать масло. В моем варианте - обеспечить неудаление нужного. В твоем варианте - обеспечить передачу владения. Что по сути звучит. и то, и то одинаково: не потерять лишнее. Но раз, ты нагородил еще более моего, обеспечивая, по сути, тоже самое - вот я и говорю. Антипаттерном попахивает.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834775


Метки:  

Клуб любителей Unreal Tournament

Вторник, 21 Июля 2020 г. 09:18 + в цитатник
Mikle: Порт то на dx9 у меня давно есть, а вот текстуры вечером посмотрю.
Вообще, в UT99 есть один неприятный для сетевой игры баг - когда один игрок стоит в таком месте, где центр его модели закрыт геометрией сцены от второго игрока, второй игрок через пару секунд перестаёт видеть первого. Срабатывает какая-то оптимизация рендера - если закрыт, можно не рисовать. На скриншоте в окне башенки вполне может находиться игрок 1, но для игрока 2 он сейчас не виден.
Причём это проявляется только тогда, когда игрок 2 - клиент, не на сервере.
Я всё надеюсь, что это исправят в каком-нибудь апдейте, а то получается нечестная игра.
UT99bug.jpg (, : 7)

https://forum.sources.ru/index.php?showtopic=271526&view=findpost&p=3834774


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 05:35 + в цитатник
D_KEY: Это передача владения ресурсом.
Код простой, никаких дурацких флагов, if, goto, понятно, кто ресурсом владеет. Не надо даже деструктор у my_struct писать. Да даже guard и лямбд.
Просто сравни с твоей лапшой.

По поводу локальных объектов и обмена - гугли про безопасность исключений (на самом деле это касается любой обработки ошибок, если подумать). Если сам не найдешь толкового материала, я позже могу раскрыть тему.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834769


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 04:41 + в цитатник
JoeUser: Не, это уже чересчур! Еще и локальные переменные заводить дополнительно, потом их обменивать ... ради чего? Попахивает антипаттерном.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834768


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 03:11 + в цитатник
D_KEY:
Цитата JoeUser @
После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.

Это решается путём передачи владения ресурсом полю или передачи его(владения) наружу.

Добавлено
Цитата JoeUser @
В данном случае никаких противоречий не вижу. Класс изначально проектировался для соблюдения состояний:

1) Ожидает
2) В состоянии соединения
3) В состоянии ошибки
4) В состоянии передачи

Причем возможные переходы между состояниями заранее предопределены. В этом случае инвариантность не нарушается.

Допустим. ИМХО, тогда лучше воспользоваться паттерном state и управление ресурсами в этом случае будет примерно такое, как я описал. Но дело твое. В методе load в случае успеха передать владение от локального объекта полю все равно никто не мешает. Если не понятно, то могу код привести чуть позже.

Добавлено
https://godbolt.org/z/zbhGr5

    #include
    #include
    struct my_initializer {
    my_initializer()
    {
    std::cout << "init" << std::endl;
    }
    ~my_initializer()
    {
    std::cout << "deinit" << std::endl;
    }
    };
    struct my_struct {
    void load()
    {
    auto init = std::make_unique();
    // ...
    bool success = true;
    // ...
    if (success) {
    init_.swap(init);
    }
    }
    private:
    std::unique_ptr init_;
    };
    int main()
    {
    my_struct a;
    {
    std::cout << "enter" << std::endl;
    a.load();
    std::cout << "exit" << std::endl;
    }
    }


Поигравшись с переменной success сможешь понять, в чем суть.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834767


Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 03:08 + в цитатник
JoeUser:
Цитата Qraizer @
Быстренько налобал правильный тест.

Скинь, плс, исходники потестить.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834766


Метки:  

Клуб любителей Unreal Tournament

Вторник, 21 Июля 2020 г. 01:07 + в цитатник

Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 00:45 + в цитатник

Метки:  

goto vs break & continue

Вторник, 21 Июля 2020 г. 00:41 + в цитатник
Qraizer:
Цитата JoeUser @
Типа, если действительно была ошибка - освобождать, а если нет - пропустить. И только в одной лямбде это не потребовалось.
Ну так это не RAII. В RAII нужно оборачивать ресурс, для которого известно время жизни, обозначив его {}, а не который когда захотел, получил, когда захотел, освободил. Если когда захотел, то это ж ничем не отличается от ручного управления. Посмотри в пример использования во втором "костыле", это пример из реальной программы... впрочем, мне не жалко скопипастить и даже прокомментировать:
    // Атомарно получить ресурс монопольного доступа к образу приложения и захватить его
    HANDLE sameApp = CreateMutex(NULL, TRUE, uniqName.c_str());
    // Вручную проверить успех получения ресурса
    if (sameApp == NULL)
    return static_cast(logMsg("CreateMutex() failed", GetLastError()));
    // Зарегистрировать освобождение ресурса
    Guard sameAppGuarded([=]() { CloseHandle(sameApp); });
    // Проверить, удалось ли захватить монополию или же доступ уже ранее (GetLastError() будет равен ERROR_ALREADY_EXISTS) был кем-то захвачен
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    if (WaitForSingleObject(sameApp, INFINITE) != WAIT_OBJECT_0) // подождать возможности монопольного доступа
    // При ошибке монополизации гвард сам освободит ресурс
    return static_cast(logMsg("Recursive run detected for " + name.filename().string(), GetLastError()));
    // Монополия успешно получена, зарегистрировать его отдачу другим страждущим
    Guard sameAppLocked([=]() { ReleaseMutex(sameApp); });
    // Локальные границы времени жизни файлов, в которые перенаправляется консольный ввод/вывод
    {
    SECURITY_ATTRIBUTES attr = { sizeof(attr), NULL, TRUE };
    // Файл для перенаправленного консольного ввода
    HANDLE hIn = CreateFile((newName.parent_path() / "stdin.txt").string().c_str(),
    FILE_GENERIC_READ, FILE_SHARE_DELETE,&attr, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, NULL);
    // Зарегистрировать его закрытие
    Guard hInGuarded ([=]() { CloseHandle(hIn); });
    /* и так для всех трёх стандартных консольных устройств,
    ну и кроме того там ещё куча логики работы с образом приложения */
    }
    // и тут эти локальные границы заканчиваются, файлы с консольным вводов/выводом закрываются гвардами.
    // Ниже есть ещё чуток кода для логгирования и ещё по мелочи, и гварды позаботятся и об освобождении образа приложения от монополии, и об освобождении ресурса
В твоём случае тебе достаточно чётко определить времена жизни своих ресурсов и обозначить их {}, в частности вложенными функциями, если надо. И всё. Изнутри наружу хоть экспешном выходи.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834762


Метки:  

ЕГЭ по информатике 2020, часть 1, № 18

Вторник, 21 Июля 2020 г. 00:23 + в цитатник
swf: ЕГЭ по информатике 2020, вариант Москва
Часть 1, № 18
Математическая логика
Задание взято с сайта
http://kotolis.ru/realegeinf_2020

Условие.
Для какого наибольшего целого неотрицательного числа A выражение
(x > A) V (y > A) V (2y + x < 110)
тождественно истинно, т.е. принимает значение 1 при любых целых неотрицательных x и y?

Решение.
Если выражение (x > A) V (y > A) истинно, то исходное выражение истинно при любом A.
Возьмём отрицание от (x > A) V (y > A):
not ((x > A) V (y > A)) = (x <= A) & (y <= A).
Если и x <= A, и y <= A должно выполняться 2y + x < 110.
2y + x достигает максимального значения при x = y = A, и это значение должно быть меньше 110:
2A +A < 110, 3A < 110, A < 36,6
Максимальное A = 36.
При A = 37 и x = y = 37 исходное выражение будет ложным.

Ответ: 36 .

https://forum.sources.ru/index.php?showtopic=419199&view=findpost&p=3834761


Метки:  

Клуб любителей Unreal Tournament

Вторник, 21 Июля 2020 г. 00:04 + в цитатник
Gonarh: Текстурки без рендера ничего не дадут.

https://forum.sources.ru/index.php?showtopic=271526&view=findpost&p=3834760


Метки:  

goto vs break & continue

Понедельник, 20 Июля 2020 г. 23:49 + в цитатник
D_KEY:
Цитата JoeUser @
Тогда нарушается логика поведения класса
...
Если логин не прошел - экземпляр класс болтается с состоянием ошибки

Плохая практика, не надо так делать. Прочитай про инварианты класса.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834759


Метки:  

ЕГЭ по информатике 2020, часть 1, № 17

Понедельник, 20 Июля 2020 г. 18:08 + в цитатник

Метки:  

Поиск сообщений в rss_forum_sources_ru
Страницы: 2628 ... 2381 2380 [2379] 2378 2377 ..
.. 1 Календарь