Да я вижу, но 10-й абзац я оставил на "десерт", так как там текст связан с картинками (если я не ошибаюсь, не хочется вносить путаницу, по этому последний абзац оставлю на выходные). Смотрел статью (нужно наверное на свежую голову ). Мне нужна программа, которая может заменить текст в уже готовом документе, бесплатная. Знаю что Open Office с плагином умеет это делать, но оригинальный документ он открывает не корректно (где то смещается текст, где то картинка...). Или может у кого установлено коммерческое ПО (только лицензионное)? не откажите в помощи.
Давайте начнем работать со строками. Я хочу, чтобы вы использовали для этого объекты "label" и "edit box controls" что бы получилось что то похожее на рисунок рядом. Я знаю, вы не использовали их в прошлом уроке, но здесь нет большой разницы между в использованием этих объектов и объекта "buttons".
В добавку, создайте сами обработчик для кнопки Quit, который закончит работу приложения. Вы знаете, как это сделать..
Как думаете товарищи, стоит переводить такие слова как "button", "edit box controls" и другие им подобные? В последнем переводе их пока не трогал.
Добавлено (29.06.2011, 19:01) --------------------------------------------- До "пилил" 10-й
Обо всем по порядку. Мы должны создать объект строки. Есть несколько способов сделать это, но я просто нажму на тип “Main” в верхней части Иерархии Проекта (дерева проекта). Вы увидите панель управления (раздел 3, если вы помните) которая измениться и станет проще. Эти иконки не представляют собой визуальных объектов таких как "buttons" или "labels" но являются памятью таким элементам как классы, объекты, функции и события. Выберите иконку “Create Object” как показано здесь слева. Это вызовет Диалог Списка объектов, который содержит много полезного. Если вы не знакомы с Seccia, я не советую вам поддаваться искушению с этим экспериментировать. Мы вернемся к этому ключевому диалогу позже, в серии учебных пособий. Обещаю.
Добавлено (30.06.2011, 00:16) --------------------------------------------- До "пилил" 2-й абзац.
Все компьютерные программы в той или иной степени зависят от данных. Имена клиентов заносятся в БД (Базы Данных), в 3D играх углы представляют собой тригонометрические функции, итоговые суммы подсчитанные на бланках заказа - все это примеры хранения данных и манипуляций с ними. Почти все, что вы делаете в Seccia, в той или иной форме будет связано с обработкой данных, это важно знать. Теперь, мы узнаем, как использовать Seccia IDE, чтобы понимать, как обращаться с числами и текстом. И еще, вам важно знать, я не собираюсь заменить документацию Seccia. Я просто покажу, как использовать различные типы данных с помощью выбранных для примера функций, но я буду охватывает не все из них.
Спасибо вам, без вас дело продвигалось бы хуже.
Добавлено (01.07.2011, 14:35) --------------------------------------------- Перевел 5-й и 9-й абзацы.
Let’s Get Going (Давайте продолжим)
Создайте новое VGC приложение (если вы не знаете, как это сделать, пожалуйста, обратитесь к разделу “Seccia Basics – 01” который находится на форуме Seccia в разделе “Tutorials”). Дайте название основному диалогу на свой выбор – я назвал “Seccia Basics - 02”. Информативно.
Прежде всего следует отметить, Seccia умеет работать с ограниченым количеством типов данных. Некоторые языки программирования умеют работать с несколькими десятками типов данных – один тип данных для одной цели – в Seccia их количество сведено к минимуму, это мы увидим позже. Это намного упрощает обучение новичка, не отвлекая его внимания на тонкости ЯП.
Давайте начнем, со строк
Установка значения для строки. Для этого, мы должны вызвать функцию “set” объекта строки. Например, нам нужно ввести текст сверху в объект "edit box" и когда мы нажимаем кнопку “Do Task”, значение которое мы ввели копирует содержание "edit box'а" в переменную и устанавливает значение нижнего "edit box'а", которое равно значению объекта строки. Давайте попробуем.
Мы создали строку объекта. Но, так как все действия, которые мы будем производить если кликнуть, то получается (если вы читали первый урок) что все действия происходят в обработчике OnClick если задана кнопка. Для этого выберите событие и в открывшемся редакторе кода вставьте новую команду.
Бяка, но можно потом отредачить Одинокий юзер
Сообщение отредактировал IIIypuk - Понедельник, 04 Июля 2011, 15:07
Все нормально IIIypuk, таже такой перевод мне сильно помогает До "пилил" 12-й абзац:
Мы создали объект строки . Но единственное действие которое будет иметь здесь место, это нажатие кнопки и вполне очевидно (если вы читали первый урок), что всё происходит в обработчике OnClick кнопки “Do Task”. Выберите событие в открывшемся редакторе кода и вставьте новую команду.
Нажмите на значок “Data”, как показано на рисунке, и вы увидите полный набор объектов данных, доступных в этой версии Seccia. Чуть ниже в списке, вы сможете найти объект строки. Дайте ему имя, например m_string1 и нажмите кнопку "ОК". Обратите внимание где этот объект оказывается в иерархии - не в разделе “Dialog Objects”, а в разделе “Objects” подчеркнув тем самым, что он не появится в вашем диалоге. Он не имеет видимого компонента.
Нам нужны два пункта - первый установит содержание объекта строки m_string1 к текущему содержимому первого "edit box'а" (который я назвал m_edtString1). Из моего первого учебника, как вы помните это, вероятно Set и Get. Итак, выберите m_string1 в проекте диалога и вы увидите все, что можно сделать с текстом, пока он принадлежит объкту строки . Среди этих частей-функций есть один, который называеться Set. Вот это нам и нужно.
Опять же, с первого урока как вы помните, фрагмент в скобках зеленого цвета, после команды представляет собой данные, которые нужно присвоить функции, что бы она работала. В этом случае это текст, который вы хотите задать объекту строки. Мы не знаем сам текст, но мы знаем, что в данный момент это для первого "edit box'а". И так, убедитесь, что фрагмент зеленного цвета выделен, и выберите m_edtString1. Среди его функций есть одна, которая называется GetText. Как следует из названия, эта функция будет получать содержимое этого "edit box'а", так как он находится внутри функции Set объекта m_string1, значение последнего будет изменено на новое. Команда, которая должна получится у вас вот так: m_string1.Set(m_edtString1.GetText())
. У меня есть подозрение что он требует доработки...
Что мы можем сделать со строкой? Рад что вы спросили, ответ - " целую кучу вещей ". Например, мы может получить (Get) содержимое строки, но с таким условием, чтобы данные были представлены особым способом - заглавными буквами, если нам захочется. Давайте попробуем это, обратив процесс который мы видим в строчке кода выше – мы установим (Set) содержание нижнего "edit box'а" (m_edtString3) до полученных (Get) данных в m_string1, только заглавными буквами. Догадались какие функции строк нам нужны? Да, это GetUpper. И команда которая изменит текст в "edit box'е" - SetCaption. Вставьте ещё одну линию в " Code Editor'е" чтобы получилось: m_edtString3.SetCaption(m_string1.GetUpper())
Добавлено (23.07.2011, 23:13) --------------------------------------------- До пилил 16-й, 17-й, 18-й и 19-й абзацы.
Так что у нас есть это - две строки кода обработчика OnClick объекта m_btnDoTask и одну строчку кода m_btnQuit для выхода из программы. Попробуйте - введите текст в первый "edit box", нажмите кнопку“Do Task” и посмотрите на результат в нижнем "edit box'е".
Попробуйте теперь со строчными буквами – просто изменив строку кода обработчика, там где у нас GetUpper.
И это все - заглавные и строчные буквы? Ни в коем случае! Используя встроенные функции объекта строки, мы можем, обрабатывать эти строки - делить и группировать их. Например, что вы думаете делает GetAt? Из документации, вы увидите, что она нужна для индексации номера. Измените вторую команду в вашем "Code Edit'оре" на эту функцию и перезапустите приложение, используя текст который использовался на рисунке выше и используя значение "10" для индекса.. Обратите внимание на нижний "edit box" – всё верно, там буква “b". Две вещи, которые нужно здесь запомнить – команда извлекает символ в "точке" указаной в индексе (хотя сама строка не изменилась) и сама индексация начинается с ноля – ни одного. Буква “b", на самом деле 11-й символ в тексте. Только если вы начинаете счет с ноля, буква “b” фактично будет 10-й
Ну это все конечно хорошо, но что если нам нужно вырезать не одну букву а часть текста? Очевидно, мы должны указать начальную точку (предыдущий пример индекса), а также указать индекс последнего символа в вырезаной части текста.Это обычно называют суб- строкой (sub-string) и команда соответствующая этому GetSub. Это требует два числа для проделывания описанного выше. Допустим, вы даёте значение "2" для начала индексаци и "21" для её конца. Используя текст показанный ранее, у нас получится:
Помните - вы начинаете индексацию от нуля (в обоих случаях). Другой способ получения участков строки более традиционный:
Left – Дает направление начала "отсчета" количества символов с крайней левой стороны. Mid – Дает направление начала "отсчета"количества символов с указанного индекса. Right – Дает направление начала "отсчета" количества символов с крайней правой стороны.
Попробуйте что то из них, используя выше изложенный подход.
Удаление части строки. Я говорил,что когда мы получаем под- строку (sub-string), исходная строка не изменяется, но что, если мы хотим все таки удалить фрагмент строки? Мы используем команду Delete. Теперь слова предупреждения - вы не может использовать эту команду и ожидать возможность восстановление строки, после того как ее подправите. Эта команда - для удаления в фоновом режиме, с последующим использованием команды Get для получения текста строки. Посмотрите на текст который я использовал в примерах выше. Давайте представим, что мы хотим удалить слово “quick” от сюда (заменив его пробелом). “q” имеет индексный номер 4 и количество символов которые мы хотим удалить равно 6 (включая один из пробелов). Используйте следующий код:
Булевы функции. Если вы обратите внимание на другие части функций объекта строки, вы увидите что некоторые из них начинаются со слова Is. Это традиционный способ именования функций, который возвращает значения true (истина) или false (ложь). Например, IsNumber возвратит вам true если текст состоит только из цифр (это не означает что текст является цыфрой – это означает, что часть текста содержит неалфавитнные символы, такие как номер телефона) и false ложно, если есть символ не пренадлежащий цифрам. Например: "12" true "12.2" true "-123.36" true "12 4" false (из-за пробела)
Кто-нибудь напечатайте здесь какой-то пост,у меня есть подозрения что количество символов в одном посте ограничено и я не смогу далее сюда печатать перевод. MaximTG
Продолжай. Любой дурак может написать программу, которую поймёт компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты.
Есть две другие функции, которые сообщат нам какого типа числа в строке, с запятой или без – isIntNumber и isFloatNumber. Вы можете проверить их работу прямо сейчас, но эти функции лучше использовать во время "более"сложного программирования который предполагает принятие конкретных действий если результат true, и принятие других действий в противном случае. Мы будем работать с такого рода вещами немного позже.
Конкатенация строк. Термин “Конкатенация ”(Объединение) означает процесс объединения строк вместе, то что очень часто делается в программах.
Итак, мы хотим например поместить текст в m_edtString, ещё какой-то текст в m_edtString2 а затем поместить объединенный результат этих двух "edit box'ов" m_edtString3. Мы уже знаем, как получить содержимое объекта строки – GetText – но как объединить эти две строки вместе? Это очень просто - мы просто используем знак плюс (+) как будто мы плюсуем их вместе. Мы не занимаемся здесь математикой. Знак "плюс" здесь работает как клей для "склеивания" двух строк вместе. Код можно напечатать в одну строку:
Кроме того запомните, если вам нужен пробел между запятой в конце первой строки перед второй, вам нужно завершить эту строку пробелом когда вы печатаете что то в m_edtString1. Также вы можете объединить три вещи в своем коде – содержание первого "edit box'а", пробел (в двойных кавычках) и содержание второго "edit box'а" – все это разделить знаком "плюс".
Добавлено (09.08.2011, 11:28) --------------------------------------------- Переведен 25-й, 26-й и 27-й абзацы:
Unicod строки. Вспомним начало этого урока, где я показал вам как выбрать объект из Object List (я снова показываю иллюстрации здесь). Вы теперь знаете, как выбрать объект строки, но если вы присмотритесь, немного ниже по списку вы увидеть что-то, что называется UniString. Что это такое? Ну “стандартная” строка использует нечто под названием ASCII (American Standard Code for Information Interchange). Это атавизм от старых времен телеграфных кодов. Каждый символ в тексте, находящийся в объекте строки занимает один байт. Это означает, что может быть выбран один из 256 различных видов символов - управляющих символов (например "carriage return"), цифр (0-9), прописных букв (А-Я), их строчные эквиваленты (а-я) и различных знаков препинания.
Проблема в том, что этот диапазон символов можно использовать только к полностью поддерживаемым языкам, чьи символы не акцентированные (например, английский - не удивительно, так как код был разработан американцами). Но как насчет французского, русского, хинди, иврита и так далее? С распространение компьютеров, эта проблема стала более серьезней, и поэтому был разработан новый способ представления символов в мировой системе писем - Unicode. Есть несколько стандартов Unicode и, если вам интересно, есть хорошая небольшая статья на Wikipedia по адресу http://en.wikipedia.org/wiki/Unicode. Символы хранятся не только в одном байте, а в двух, четыре или больше, чтобы расширить количество символов для разных языков. Seccia использует два байта для кодирования каждого символа в тексте, хранящийся в объекте UniString, кроме того объект UniString и объект String идентичны.
Посмотрите на предыдущей иллюстрации Object List.Там есть три объекты, которые явно представляют характер цифр:
Integer (целое число) Float (число с плавающей запятой) Money (деньги)
Как я сказал в начале урока, в других ЯП часто присутствуют много других типов чисел, делая обучение новичкам затруднительным. Seccia состоит из максимально простых вещей, но здесь нет такого понятия как "бесплатный обед". Эта простота является ценою более продвинутых программистов - как правило, отображаемой в производительности и предотвращение ошибок. Но это меньше всего должно беспокоить Seccia программистов.
Integers (Целые числа). Этот тип числа не имеет дробной части - например 13 является целым числом, а 13,2 - нет. На самом деле, последняй пример это пример числа с плавающей точкой. Целое число использует для хранения значения 8 байт и содержит ряд частей функций, которые позволяют пользователю манипулировать этими значениями. Это функции сложения, вычитания, умножение, деление, возведение в степень и так далее. Другого и не следовало ожидать.
Давайте попробуем какието простые вычисления. Удалить весь код, оставьте только обработчик событий для события OnClick объекта m_btnDoTask. Мы собираемся ввести одно число в m_edtString1 и другое в m_edtString2. После ввода чисел, выведем результат в m_edtString3. Вы заметили, что мы не может просто взять содержимое двух "edit box'ов" и объединить их вместе? Здесь можно было бы все объеденить как показано чуть выше. Но нет, мы должны внести контент первого "edit box'а" как объект целого числа, сделать арифметические действия над ним и поместить результат в третий "edit box". И так, вызовите диалог Object List и создайте новый объект целого числа. Имя его будет m_integer его я и буду использовать.
Протестируйте эту программу - введите числа в два верхних "edit box'а" и нажмите кнопку "Do Task". Должно получится так как и ожидалось. Всё в порядки - или здесь что то не так? Тех из вас, кто знаком с другими ЯП , будете говорить "подожди минуту - строки и целые числа несовместимы ", и вы будете правы. Новички же будут говорить “Ну и что?”
Видите ли, строка это просто текст - один байт на символ. В то время как целое число хранится в 8 байтах, независя от его величины (в разумных пределах). Я могу написать число из 16 цифр в m_edtString1 но оно все равно будет занимать 8 байт, как и приписано объекту целого числа. По этой причине, мы как правило конвертируем между собой форматы текста объекта m_edtString1 и чисел объекта m_integer. Это называется сортирование. Если вы посмотрите на функцию обработчика в m_string1, вы увидите GetIntValue. Это позволяет нам взять текст из "edit box'а", поместить в объект строки и затем установить значение целого числа, используя GetIntValue объекта строки. Дело в том, что Seccia автоматически сортирует целые числа, с запятой, строки и юникод-строки но есть функции, которые позволяют вам контролировать этот процес, если это действительно нужно.
Добавлено (11.08.2011, 21:39) --------------------------------------------- Перевел 32-й (по нему у меня есть сомнения, если не смогу его потом исправить, так и останется ):
Попробуйте некоторые другие функции целого числа внося изменения в код. Пробуйте так же вычитание, умножение, деление и не стесняйтесь вносить изменения в среднюю строчку кода указаного выше. Запомните, что также можно “add one” ("добавить один") (то есть увеличить значения целого числа) и “sub one”. По настоящему интересные (для новичков) модули (modulus) (или кратко “mod"). Это есть остаток, являющимся результатом деления целого числа. Например, если мы поделим 100 на 3, мы получим результат 33, здесь очевидно что число остается без 1(единицы). Попробуйте это
Заметка для опытных программистов, здесь вы можете использовать более традиционный подход: 1. string=”cool” 2. year = 2000 3. year += 2 4. year++
Перевел 34, 35,36-й абзацы:
Floats (Числа с плавающей точкой). Как вы видите, они являются десятичными. Они также хранятся в 8 байт. У них те же функции что и у целых чисел, но дают в результате десятичные числа. Создайте новый объект с плавающей точкой и измените код, чтобы его отделить, используя пример рядом ...
m_float.Set(m_edtString1.GetText())
m_float.Div(m_edtString2.GetText())
m_edtString3.SetCaption(m_float.Get())
Используйте в качестве параметров числа 100 и 3. Вместо 33, какой вы видите результат? Попробуйте также функцию округления.
Числа с плавающей запятой и деньги это очень похожие объекты - оба представляются в десятичном виде. Разница в том, что объект денег используется с весьма специфичной целью - работать с валютой – и по этому имеет свойства устанавливать и брать себе символ той же валюты, это как разделение её в разных странах.
Насчет него у меня есть сомнения в его правильности.
Деньги. Наконец мы подошли к деньгам. Они работают так же, как и числа с плавающей точкой, кроме того они имеют дополнительные функции для установки символа валюты и их разделитель. В основном всё работает так же.
The Value Object (Значение объекта)
В дополнение к strings, UniStrings, integers и floats, есть также объект под названием “Value” ("Значение"). Он может принимать любой вид из выше названых объектов, а также выводить результат работы в качестве любого из них. Как вариант, вы могли бы обойтись без других объектов, используя только объект Значения. Что впрочем не считается хорошим тоном в программировании – используйте правильный тип объекта к соответствующим типам данных.
Именно с именами фаилов связан этот объект, это может быть не сразу очевидно, но это особая форма строки которая используется для хранения имен путей и имеет дополнительную функциональность, позволяющая пользователю разделить имя файла на свои составные части. Это очень полезный объект, и мне приходилось писать код с такой функцией много раз на многих языках, неоднократно делая то же самое. Seccia имеет этот замечательный объект, который делает все это для вас.
Давайте попробуем несколько примеров. Удалите любой код находящийся в Code Editor'е. Создайте "Path object" обычным способом. Мы собираемся установить его значение, а затем отобразить расширение файла в m_edtString3. Код такой ...
Протестируйте программу и введите полный путь, как в примере приведенном рядом.
Вы видите, как часть функции "отделила" расширение файла. Это полезно, когда вам нужно понять тип файла для того, чтобы правильно с ним работать.
Если вам нужен "весь" файл, используйте GetFile - это даст вам имя файла и расширение. Функция GetFileName вернет только часть имени. Но как насчет пути к файлу? Мы используем GetParent для этого, как например здесь ...
m_edtString3.SetCaption(m_path.GetParent())
Если вы поробуете предыдущий пример с "путем", вы увидите следующее.
Попробуйте некоторые другие функции самостоятельно.
Color (Цвет)
Цвет сложен для вычислений - и здесь только вводный туториал для начинающих. Достаточно сказать, что существует много систем вывода цвета. Seccia работает только с двумя из них:
RGB - представляет цвет в количестве 3-х штук (красный, зеленый и синий), интенсивность каждого варьируется от 0 до 255 единиц.
YUV - более сложный. “Y” компонент представляет то, что называется luminance (освещенность) – другими словами, насолько bright (яркий) цвет. "U" и "V" вместе, используются как х-и у-координаты на графике возможных цветов, как показано здесь.
Давайте начнем с RGB, поскольку это наиболее известная среди программистов система. Мы собираемся измененить цвета фона m_dlg с помощью функции SetBackColor. Это получится только при правильных манипуляциях со значениями RGB.
Продолжаем дальше, как всегда удаляем любой код оставшихся в Code Editor'е. Создайте новый объект цвета – m_color. Мы собираемся использовать SetRed, SetGreen, и SetBlue функции m_color изменяя их значения в трех "edit box' ах". Когда мы нажмаем кнопку “Do Task”, цвет диалогового окна изменится. Код должен выглядеть следующим образом:
m_color.SetRed(m_edtString1.GetText())
m_color.SetGreen(m_edtString2.GetText())
m_color.SetBlue(m_edtString3.GetText())
m_dlg.SetBackColor(m_color)
Вставьте этот код в редактор, затем проверить его. Введите три числа "edit box'ы", каждое в диапазоне от 0 до 255, а затем нажмите кнопку "Do Task". Что произошло? Ничего! Ну, на самом деле "оно" хочет сделать что-то, но изменение не произойдет, пока диалоговое окно не перерисуется "Windows'ом". Просто переместите окно по экрану. Когда вы отпустите кнопку мыши, диалоговое окно перекрасится и в текущем местоположении будет с другим цветом. Существует однако, более элегантный способ сделать это. Вы можно заставить ОС Windows перекрасить окно с помощью функции Redraw . Просто внесите инструкцию ...
m_dlg.Redraw()
... после внесения кода, пртестируйте приложение. Изменение цвета должно произойти незамедлительно после нажатия кнопки кнопки. Вот пример.
А что делать, если мы хотим сохранить этот цвет и но сделать его более темным? В RGB вам придется вычесть равные числа для каждого из значений цвета. Таким образом, вместо значений 100 200 100, вы можете внести 75,175,75 (то есть "отминусовуем" по 25 единиц с каждого элемента цвета ). Попробуйте и посмотрите на разницу. Вы можете видеть на иллюстрации рядом, что верхняя часть окна, немного темнее тени того же цвета.
Что насчет YUV? Как вы видите на иллюстрация рядом, он имеет диапазон от -0,5 до +0,5 по U и V осям. Эта же система имеет диапазон от 0,0 до 1,0 для Y оси. Однако в Seccia на данный момент используются значения от 0 до 255 во всех трех осях. Sylvain намерен изменить это в будущих версиях Seccia на 0.0-1.0 для значения Y и - -0,5 до +0,5 для двух других осей. Можете попробовать команды SetY(), SetU() и SetV() так же как вы это делали с RGB.
Table (Таблица)
Объект таблицы позволяет нам создавать своего рода таблицы значений в памяти. Я оставлю эту тему на потом для главы по структуре сетки, нам легче будет понять этот объект, когда мы сможем использовать регулирование структуры.
Summary (Вывод)
Итак, что мы узнали в этом уроке? Мы увидели, что:
В Seccia собран разумно-ограниченный набор типов данных
В Seccia текстовые типы данных включают в себя: o String (Строку) o UniString (Unicode строку) o Path (Путь) Мы можем соединять строки вместе, используя знак плюс. Это называется конкатенация Части функций Strings и UniStrings имеют такие возможности работы со строками, как разделение перемешивание, поиск, и другое. Объект пути содержит конкретные команды для управления обработкой имен путей и типами файлов Объекты типа число, включают: o Integer (Целое число) o Float (Число с плавающей точкой) o Money (Деньги) Мы можем объединить возможности строк и чисел в единый тип: o Value (Значение) Тип данных Color (Цвет) позволяет использовать спецификации двух стандартов RGB или YUV
Поиграйте с тем что вы узнали - закрипите свои знания различных частей функций работая с ними.
Как обычно, любой отзыв на эту статью приветствуется. Удачи!
Перевод второго урока закончен, сейчас "запихиваю" все это обратно в PDF (так как бесплатного редактора этого формата файлов не нашел, пользуюсь портабельной версией фоксита). Первый туториал практически готовый, возможно совсем скоро добавлю его сюда на сайт. На будущее (как показала практика) не стОит пробовать делать колективные переводы, это не особо интересует товарищей игроделов . (Надеюсь что это была не очень интересная тема, я просто подумал - "ведь столько постов печатается каждый день на форуме, ведь если бы каждый учасник перевел бы по одному абзацу, перевод был бы готов за неделю!", но увы, посмотрите на дату создания первого поста...). Имена учасников перевода первого туториала будут обязательно указаны. Спасибо всем кто помогал. Тему можно закрывать. Но на последок скажу что есть еще третий туториал, а также справка по языку программирования в Seccia, если у кого-то будет желание их перевести, я помогу,напишите об этом в ЛС . MaximTG
Сообщение отредактировал burlachenko - Пятница, 06 Января 2012, 13:12