Доска почета

There are no members to show


Popular Content

Showing most liked content since 25.12.2016 in Комментарии к Article

  1. Ссылка: http://yaroslavbrovin.ru/object_life_cycle_in_delphi_part_1_windows_osx-ru/ Автор: Ярослав Бровин С появлением мобильных платформ в мире Delphi, произошли серьезные изменения в жизненном цикле объектов. Послужившие причиной многих проблем и вопросов, а как правильно кроссплатформенно удалять объекты. В этой статье детально рассматриваем жизненный цикл объектов на разных платформах и даём ответы на важные вопросы, которые могут побеспокоить даже опытных Delphi разработчиков.
    18 likes
  2. Эх, попкорн закончился) Доброго вечера всем. Вот вы тут развели ср..., прям диву даешься. Неужели тут кто то всерьез верит, что Rad Studio похоронят - вы чего? СМена кадровой политики - абсолютно нормальное явление в любой организации, которая не сидит на месте. Другой вопрос - что послужило толчком? Но не суть. Тут прочитал - вот мол никто на FMX не пишет - вы судите по тому, сколько информации (удивленный смайл). Неужто кто то всерьез думает, что солидные компании, которые базируются на Rad Studio, будет трубить на каждом углу - смотрите, у нас софт написан на Rad Studio? (если быть точным, то с использованием, не придирайтесь)) ЗАЧЕМ оно им? С такой ценовой политикой, достаточно нескольких сотен пользователей для безбедной жизни, хотя думаю их в разы больше. А вот про баги и тд - улыбнуло. Есть у меня опыт небольшой работы и с FMX под ANdroid, и куда больший по десктоп, естественно под VCL. Есть опыт с плюсами и шарпом на Visual Studio тоже под десктоп. Ну и Qt немного. И судя по своему скромному опыту, еще вопрос - где больше багов, когда начинаешь копать глубже. Тута вон галку снял, и софт с 99% уверенностью запустится у всех, а Visual Studio - без опыта, один процесс настройки зависимостей проекта в новых версиях - тот еще гемморой. А потом начинаешь пользователям долбить - скачайте рантайм, а вот еще ддлку эту, а у вас версия Фреймворка не та))) Адекватно собрать статически слинкованный Qt мне так и не удалось, точнее удалось под MinGW - не впечатлило. Похоже многие забыли - FMX, Rad, Visual, pascal, c++, c#, и тд, и тп - это только инструмент, все зависит от того, кто его держит. Kitty - мне очень интересно - отчего такая потребность - закопают или нет? А кто мешает перебраться, в случае необходимости в другую среду - знания то лишними не будут. Напоминает покупку первой машины - месяцами выбирают (количество критериев зашкаливает - и чтоб то не сломалось, и не устарело, и тд), в итоге покупается что то непотребное, просто из-за подхода, при этом количество нервов потраченных...) вы же не на всю жизнь покупаете) Так и тут - ну случится беда, закопают - так правильно сказали: может через пару лет и Андроид гавкнет - что теперь не писать под него. В крайнем случае можно на время перебирания в другую среду остаться на старой версии. Хотя, вынужден извиниться, возможно у вас действительно вперед смотрящие, долгосрочные проекты, тогда стоит думать сейчас (ни в коем случае не сарказм). Но положа руку на сердце, поверьте - выбор то не велик, к сожалению, когда дело доходит до чего - то большего, чем Hello World. P.S. не первый год пытаюсь переползти в Visual Studio - именно написание кода там куда более комфортное, но увы - так и не смог) сошелся на Dll-ках, из Visual Studio, и основе в Rad Studio - довольно удобно и комфортно.
    15 likes
  3. Уважаемые форумчане! Поздравляю Вас с Наступающим Новым Годом и Рождеством! Пусть 2017 год станет новым этапом на Вашем пути и принесет успех, самореализацию и, конечно же, счастье.
    13 likes
  4. По первому фото слева на право: @kami @Brovin Yaroslav @RoschinSpb @Error
    11 likes
  5. Ссылка: http://blog.rzaripov.kz/2017/01/blog-post.html Автор: Зарипов Равиль @ZuBy Описание: Онлайн-сервисы в помощь разработчику по дизайну
    10 likes
  6. Думаю пришло время и мне рассказать (еще) об одном своем проекте на FMX. С вашего позволения наименование программы убрал из описания. *******:ЕГАИС - это приложение для предпринимателей, которым необходимо (согласно новым требованиям закона) подтверждать любое движение алкоголя через систему учета ЕГАИС (Единая Государственная Автоматизированная Информационная Система). *******:КАССА - очень простой front-office для предпринимателей. Полная поддержка ЕГАИС и 54-ФЗ (об онлайн кассах). Работает с фискальными регистраторами АТОЛ, ШТРИХ-М и Viki-print. Сайт: https://www.ami-soft.ru/ Приложение для Android: ЕГАИС-приход Сейчас не развивается. Все усилия на WIndows версию. Но оба приложения используют единые формы и код. Прямая ссылка для загрузки ДЕМО-версии Используются: Delphi Berlin 10.1 upd 2 FireDac SQLITE FastReports FMX2 Parse (пока для системы активации, в разработке личный кабинет для пользователей с выгрузкой чеков и документов) Адаптировано для сенсорных экранов. Есть платные и бесплатные функции. Платных пользователей на 09.01.2017 - 1021. Программа позволяет: Подключение к УТМ по ip адресу или имени компьютера, возможность переключения между УТМ Просмотр входящих документов поставки алкоголя. Краткая информация о строках документа - сумма документа, поставщик, наименование товара Подтверждение, расхождение или отказ от получения накладной в ЕГАИС (платная функция) Запрос повторной отправки накладной на ее номеру Запрос всех неподтвержденных накладных Подтверждение или отказ приема накладной по ее номеру в ЕГАИС Отражение статуса накладной в системе ЕГАИС Отображение остатков в ЕГАИС по 1 и 2 регистру Списание продукции в ЕГАИС по данным остатков или приходной накладной Отправка актов постановки на баланс на 1 и 2 регистр Инвентаризация остатков в магазине Возврат поставщику, перемещение и продажа Передача товара в магазин и возврат на склад Работа с классификаторами товаров и партнеров в ЕГАИС Просмотр перечня служебных документов обмена (при включении режима Эксперт) Просмотр XML содержимого документов для анализа ошибок (при включении режима Эксперт) Автоматическое определение вашего ФСРАР ИД (уникального идентификатора по системе ЕГАИС)
    10 likes
  7. Ссылка: https://habrahabr.ru/post/318876/ Автор: Error Описание: Delphi и C++Builder разработчики, использующие VCL не по наслышке знают о вездесущей проблеме мерцания контролов. Мерцание происходит при перерисовке, вследствие того, что сначала отрисовываеться фон компонента, и только потом сам компонент. И если в случае с наследниками от TWinControl частичным решением проблемы является установка свойства DoubleBuffered в True, что заставляет контрол отрисовываться в буфере(однако DoubleBuffered работает тоже не идеально, к прим.: контрол перестает быть прозрачным), то в случае с TGraphicControl решение с DoubleBuffered просто невозможно, из-за отсутствия у TGraphicControl окна, установка же DoubleBuffered в True у родителя не помогает, из-за того что отрисовка вложенных TGraphicControl-ов происходит уже после прорисовки родителя в буфере. Обычно остается только одно — смириться с мерцанием, и максимально упростить отрисовку для минимизации эффекта, или использовать по возможности исключительно TWinControl-ы, что не всегда возможно и удобно. Однажды намучившись с мерцанием, я не выдержал и решил решить эту проблему, раз и навсегда! ...
    7 likes
  8. Шарик ветром развернуло. С Новым Годом!
    7 likes
  9. Сделал пример приложения для работы с Microsoft Word из приложения Delphi. Такое приложение может использоваться для обмена данными между объектами семейства Microsoft Office. Исходные коды приложения помогут вам понять, как работать с объектной моделью Microsoft Word. Чтобы лучше разобраться с нюансами Word, предлагаю ознакомиться со справочником Word VBA reference на MSDN. Проект создан в среде FireMonkey Delphi Berlin 10.1 Протестирован в MS Word 2010, 2016, Windows 7x64 и 10x64. Чтобы посмотреть пример, просто распакуйте zip-файл проекта и щелкайте по порядку кнопки на форме. Скачать Delphi Word Test WordTest.zip
    6 likes
  10. ну и кому хочется сделать Ballon, а не прямоугольник копируем в проект и открываем FMX.Controls.Win.pas Ctrl+F -> constructor TWindowsHint.Create(const AHandle: TWindowHandle); FToolTipHandle := CreateWindowEx(0, TOOLTIPS_CLASS, nil, WS_POPUP or TTS_ALWAYSTIP or TTS_BALLOON, 0, 0, 300, 300, FNativeControlHandle, 0, hInstance, nil); TTS_BALLON - сделает закругленные подсказки со стрелкой сохраняем Готово!
    6 likes
  11. я тут посидел немного, сделал костыль. особо не заморачивался копируем в проект и открываем FMX.Forms.pas Ctrl+F -> procedure TCommonCustomForm.SetShowHint(const Value: Boolean); procedure TCommonCustomForm.SetShowHint(const Value: Boolean); begin FShowHint := Value; ReleaseLastHinted; // ZuBy *** if (not(csDesigning in ComponentState)) then begin FreeAndNil(FSharedHint); FSharedHint := THint.CreateNewInstance(Handle); end; // *** ZuBy end; сохраняем в событии OnCreate, OnShow пишем ShowHint := true; Готово!
    6 likes
  12. Мое решение, все тоже - жду год, смотрю что происходит. Сейчас я стараюсь "доводить" свои наработки в OpenSource и выкладывать в бесплатном или нет варианте, делиться опытом, который есть в виде статей и заметок, чтобы оно не сгинуло если что...
    6 likes
  13. Описание Назначение: Компонент предназначен для отображения и ввода голоса. Поддерживает стилизацию. Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\RatingBarDemo\RatingBarDemo.dproj Возможности Стилизация через указание двух картинок отображающих голос и пустой голос Общее количество "звезд" - TfgRatingBar.TotalCount Текущее значение голоса - TfgRatingBar.Rating Возможность указывать дробное значение голоса Возможность указать шаг изменения голоса TfgRatingBar.StepSize
    6 likes
  14. Описание Назначение: Компонент предназначен для отображения правильного многоугольника. Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\RegularPolygonDemo\RegularPolygonDemo.dproj Возможности Округление к физическим пикселям - TfgRegularPolygon.AlignToPixels Количество сторон - TfgRegularPolygon.SidesCount Настройка цвета границы - TfgRegularPolygon.Stroke Настройка заливки - TfgRegularPolygon.Fill
    6 likes
  15. Первый набросок компонента, позволяющего организовать централизованное хранение графических ресурсов для всех платформ. Основные особенности: Спроектирован для использования одного экземпляра изображения во многих компонентах. Позволяет хранить все графические ресурсы любых размеров. В будущем не будет грузить картинки в память, если они не используются. А будет подгружать их из файла по мере необходимости. Тем самым будет значительно экономиться память. Хранение именованных графических ресурсов, а не по индексу. Это позволяет отразить в названии назначение картинки. Использование папок. Группировка изображений по смыслу для удобства работы с ними. Возможность загрузки разных картинок для разных устройств, или же загрузить один набор картинок для всех устройств. Удобная и быстрая загрузка изображений путем перетаскивания Хранение отступов изображения. Наглядное отображение картинки в свойствах компонентах. При изменении имени картинки, в компонентах используемых картинку идет автоматическое обновление имени картинки. В стандартном TImageList, из-за индексной структуру все картинки съезжают и при удалении картинки, компонент начинает отображать уже другую картинку.
    6 likes
  16. если уж до конца соблюдать стилистику магистра Йоды, то надо говорить примерно так: "в раздел интересующий зайти должен ты, сверху-справа кнопку нужную найдешь".
    5 likes
  17. 5 likes
  18. На других ПК рядом с Вашим ехе-файлом нужно положить dll-библиотеку SQLite
    5 likes
  19. Читать интересно Наверное вернулся только при том, что я действительно буду понимать, что компания выбрала правильный путь развития и очень сильно заинтересована в этом
    5 likes
  20. Присоединяюсь! Желаю всем здоровья, благополучия и успехов в работе и личной жизни! С наступающим Новым Годом!
    5 likes
  21. С Новым годом! Удачи, здоровья, всех благ!
    5 likes
  22. Так не устраивает? procedure TFormMain.sbSelectFolderClick(Sender: TObject); var PathFolder: string; begin if SelectDirectory('Выбор папки...', '', PathFolder) then ePathFolder.Text := PathFolder; end; SelectDirectory
    5 likes
  23. android-** (** - версия АПИ, чем выше цифра, тем больше нового поддерживает обёртка. Обратная совместимость поддерживается.) Выбираете файл по АПИ под которое пишите. По вашему примеру: JList уже определён в файле "Androidapi.JNI.JavaTypes.pas", т.е. нет необходимости подключать стороннюю обёртку. Указываете в uses Androidapi.JNI.JavaTypes и работаете с JList. p.s. Обёртки, которые вы скачали, необходимо проверять, т.к. многие из них сгенерены с ошибками.
    4 likes
  24. TGestureManager кинуть на форму связать контрол и TGestureManager через свойство Touch выбрать LongTap в InteractiveGestures в событии OnGesture контрола написать примерно такое if EventInfo.GestureID = igiLongTap then ShowMessage('Long Tap'); а меню это уже совсем другая тема
    4 likes
  25. uses FMX.Utils; procedure TForm7.Button1Click(Sender: TObject); var gamecanvas: TBitmap; i, j: integer; bitData: TBitmapData; p: PAlphaColorArray; begin gamecanvas := TBitmap.Create(256, 256); try if gamecanvas.Map(TMapAccess.ReadWrite, bitData) then begin for i := 0 to 255 do begin p := bitData.GetScanline(i); for j := 0 to 255 do p[j] := TAlphaColorF.Create(random(255) / 255, random(255) / 255, random(255) / 255, 1).ToAlphaColor; end; gamecanvas.Unmap(bitData); self.Canvas.BeginScene(); self.Canvas.DrawBitmap(gamecanvas, gamecanvas.BoundsF, RectF(0, 0, 256, 256), 1); self.Canvas.EndScene; end; finally gamecanvas.Free; end; end;
    4 likes
  26. System.IOUtils в uses поставить после модуля, в котором описан компонент TPath (делфи не под рукой, не скажу в каком конкретно).
    4 likes
  27. В любом случае ваше желание я вас понимаю :-) Поскольку рынок на делфи складывается в основном из старых проектов, то желания перенести старое на новое больше, чем написать это же с нуля. Была в свое время попытка сделать мида конвертер. Он, вроде, как умел базовые вещи делать: переименовывать свойства и тд. Но как-то новости о нём потихоньку затихли. Видимо, из-за того, что после его работы нужно все равно потратить время на перевод кода. На счет FMX я скажу так. Что мне лично не хватает в FMX тех минимальных вещей, которые в VCL работали хорошо: четкая графика на всех платформах, нормальный ввод текста, базовые настройки компонентов и скорости работы. Причем половина банально решается протягиванием или открытием скрытых свойств, что для меня тоже загадка (почему они скрыты).
    4 likes
  28. Кто-то ждет что делфи "оживет", а кто-то пишет на ней и радуется жизни.
    4 likes
  29. 4 likes
  30. "Будем лечить пациента, или пускай живет?" "- Хорошо ли живете, товарищи? (спрашивает оратор) - Хорошо, товарищ оратор (пошутили товарищи) - А будете жить еще лучше! (пошутил оратор)" Ну а если по факту - да, Делфи жить будет. И в наступающем году ему будет особенно хорошо: поддержка серверного линкуса (многие ждали), основной упор на багофиксы (по крайней мере - у Питерского офиса было именно так). В общем, в следующем году FMX будет стабильнее, лучше и ширше! А местами даже ширее!
    4 likes
  31. Можешь попробовать такой вариант:
    3 likes
  32. клиентскую часть, т.е. непосредственно само приложение - никак. Без доступа к серверу в моем случае оно бесполезно. Сервер может обладать информацией о всех устройствах, которые когда-либо к нему подключались и может блокировать новые, если лимит используемых устройств превышен. Или блокировать конкретные, если они выведены из эксплуатации. Или вообще залочить доступ всем устройствам клиента - по усмотрению. Но это в моем случае, т.к. приложение не общедоступно и не будет выкладываться в AppStore. Ну и "вылечивать" приложение в моем случае смысла нет - достаточно скоро его функционал просто устареет, и крякнутая программа просто станет не актуальной. В общем и целом, если программе требуется подключение к серверу - защиту нужно реализовывать имено на нем. Но от взлома защищаться бессмысленно - когда приложение станет действительно популярным, его все равно поломают. А до тех пор - можно спать спокойно, взломщики даже не посмотрят в вашу сторону.
    3 likes
  33. Решил вопрос своими силами. Может кому-то будет полезно. Такая ошибка возникает, если архитектура устройства отличается от разрядности приложения, которое пытаюсь запустить. iPad у меня оказывается 32 битный, приложение запускаю как x64. Переключился в Project Manager'е на 32bit и все запустилось! Вот документация по ошибкам http://docwiki.embarcadero.com/RADStudio/XE8/en/RunIOSDeviceFailedHelpPage
    3 likes
  34. А можно и не выходить из IDE: Ctrl+Shift+F, выбираем Search in directories.
    3 likes
  35. Утилита написана на JAVA, т.к. у вас уже установлен JRE, то просто скачиваете и запускаете. Более подробно про утилиту можно почитать по ссылке из статьи Улучшенный 9-patch редактор
    3 likes
  36. 3 likes
  37. да, смысл вопроса ускользает если нужно оставить прибор в покое на N мсек, заведите таймер, или сделайте поток, в нем сначала Sleep(N) а потом - запуск следующего шага
    3 likes
  38. Рисовать по нажатию на кнопке нельзя на канве формы. Рисовать на форме можно только в рамках общего процесса отрисовки. А именно в события OnPaint или методе Paint.
    3 likes
  39. 3 likes
  40. тут еще не совсем кроссплатформа, а только Вин и МакОС. мобильные платформы в следующей части и там есть нюансы
    3 likes
  41. думаю эти два куска показывают основную обработку OnCommandGet, из хедера: typedef std::deque< strDBQueueMember* > db_queue_deque; db_queue_deque db_queue; TCriticalSection *cs_pool, *cs_queue, *cs_files; TInterlocked *Interlocked; 3600 это запрос без обращения к бд, только данные из пула с критическими секциями ну и вот это обязательно в System.Classes.pas в Embarcadero\Studio\17.0\source\rtl\common\ constructor TThread.Create(CreateSuspended: Boolean); -//- {$IF Defined(MSWINDOWS)} //#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 - это для информации //#define CREATE_SUSPENDED 0x00000004 - это для информации // заменить FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID); // на FHandle := BeginThread(nil, 65536, @ThreadProc, Pointer(Self), $00010004, FThreadID); System.Classes.pas добавить в проект. и будет вам счастье
    3 likes
  42. Добавьте, пожалуйста, в список подсветки синтаксиса кода пункт Pascal/Delphi. Вроде самая необходимая на данном форуме подсветка, а её до сих пор нет Спасибо!
    3 likes
  43. 3 likes
  44. Глобальная оптимизация: друзья, в новой версии FastReport FMX изменения коснулись всего: от ядра отчетов до вывода текста на экран. Подробнее обо всех изменениях можно почитать на сайте. Если вы еще не обновились, скорее же обновляйтесь! Напоминаю, что если вы испытываете трудности в работе с нашими компонентами - мы будем рады помочь вам на страницах форума!
    3 likes
  45. Возможно, я рискую задать глупый вопрос, но что плохого в том, что Embarcadero переходит на аутсорсинг и переносит разработку из Испании и России в Украину? Оптимизация издержек. Главные архитекторы вроде Марко Канту остаются же, не? ИМХО, продукт будет жить и развиваться (за счет продаж корпоративным клиентам). TMS вон наклепали кучу компонентов для FMX. Если бы это было невыгодно, они бы не выпускали заплатки каждую неделю. Delphi хоронят с 2000-х годов, а курилка жив еще. Есть ли еще среды программирования, которые компилят программы под четыре разные операционки?
    3 likes
  46. VCL чуть более чем полностью завязан на WinAPI и виндовый механизм обработки сообщений. Обеспечение совместимости вылилось бы в гораздо большее количество костылей, имеющиеся баги при их "исправлении" порождали бы новые в абсолютно "не связанных" областях , ну и прочие прелести "гибкого" решения не заставили бы себя ждать. Посему - создать абсолютно новый фреймворк было правильным и взвешенным решением.
    3 likes
  47. 1. Создайте свой стиль для ListBoxItem, например 'listboxitemMystyle', скопировав стандартный и переобозвав его. В своем стиле Итемов просто сделайте невидимым Detail. Или, что еще лучше, - храните Ваши ссылки в TagString Итема. 2. В Style Designer, при редактировании Вашего listboxitemMystyle, вставьте TImage задайте ему необходимые свойства: выравнивание, размеры, отступы и т.д. (не забудьте сделать "растягивание" или что там Вам требуется - просто проверьте в дизайнере). И задайте Вашему TImage имя, например, 'myimagestyle'. 3. При загрузке изображения я бы рекомендовал сначала загрузить изображение в созданный TBitmap, а потом уже грузить его в наш 'myimagestyle'. А самое оптимальное решение - загрузка изображений в "контейнер", в фоновом режиме, а при окончании загрузки, по событию, - отрисовка уже в самом итеме. В любом случае - сначала в битмап, а потом этот битмап в Итем. Иначе, вероятность того что битмап отрисуется в вашем случае - практически нулевая. 4. Далее, при создании итемов: procedure ContactList_AddItem(Sender: TObject); var newItem : TListBoxItem; newBitmap : TBitmap; begin newItem := TListBoxItem.Create(nil); newItem.StyleLooup := 'listboxitemMystyle'; // хотя будет проще не писать этого, а прописать в ListBox1.DefaultItemStyles.ItemStyle newItem.Text := 'текст'; newItem.TagString := тут может быть Ваша ссылка newBitmap := TBitmap.Create; newBitmap.LoadFrom ....... // грузим картинку newItem.TagObject := newBitmap; newItem.OnApplyStyleLookup := MyItemApplyStyle; ListBox1.AddObject(newItem); end; procedure MyItemApplyStyle(Sender: TObject); var LI : TListBoxItem; tmpBitmap : TBitmap; begin LI := Sender as TListBoxItem; if Assigned(LI) then try LI.BeginUpdate; tmpBitmap := LI.TagObject as TBitmap; if Assigned(tmpBitmap) then LI.StylesData['myimagestyle.bitmap'] := tmpBitmap; // тут вообще можно обновлять все что угодно в этом Итеме finally LI.EndUpdate; end; end; Собственно все. Сорри если что не понятно - писал "от руки", без проверки. Но вроде все просто.
    3 likes
  48. @AlexG я проверил то что вы описали. в принципе работает, но для статики почему не работает для динамической подгрузке, точней не совсем работает. порядок действий 1) получаю с сервера список картинок 2) заполняю текстом Item'ы 3) присваиваю событие OnApplyStyleLookup для Item'а 4) в событии ItemApplyStyleLookup пишу следующее procedure TForm13.ItemApplyStyleLookup(Sender: TObject); begin LoadBitmapFromURL((Sender as TListBoxItem).TagString, (Sender as TListBoxItem).ItemData.Bitmap); end; как видим на картинках несколько айтемов не обновились, т.к. они не могут выйти за пределы области (чтобы обнулить стиль и вызвать событие OnApplyStyleLookup) и при таком подходе все время картинка будет скачиваться из интернета, что не есть хорошо UPDATE: добавил проект LB_dload.zip
    3 likes
  49. вооот поэтому надо, чтобы из очереди сообщений они ушли... у вас логическая ошибка на слове "пауза". не стоит в обработчике делать паузу вообще. запустили таймер или поток, и вышли. все остальные клики не сработают, пока кнопка задизаблена, но события обработаются штатно потом таймер или поток вернет ее в enabled и все будет работать без всяких пауз вот то, что вам нужно (uses system.treading) procedure TForm1.b1Click(Sender: TObject); begin b1.Enabled := false; m1.Lines.Add('test'); TTask.Run( procedure begin sleep(2000); TThread.Synchronize(nil, procedure begin b1.Enabled := True; end); end); end;
    3 likes
  50. Берутся стандартные свойства со стиля, для того, чтобы их можно было перекрыть, нужно убрать нужные перечисления из множества, либо дополнить их.
    3 likes
This leaderboard is set to Москва/GMT+03:00