|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWistПро связку ФормаСправочник вызывает ФормаРедактирование ссылка на ФормаСправочник передаётся непосредственно форме ФормаРедактирование или через посредника МенеджерФорм, код схематично покажи? Никаких МенеджерФорм. А это что такое вообще? Какой-то объект управляющий работой всех форм? Вызов справочника из контрола editTovar.sprGroup.OpenSpr() Код: sql 1. 2. 3.
Переданное запоминается в sprGroup.oParent При возврате обратно из sprGroup Код: sql 1. 2. 3. 4. 5.
Это схематично. На самом деле все немного сложнее. Я догадываюсь к чему ты ведешь. Есть такая фича/бага фокса: если где-то хранится ссылка на объект формы то форма не закроется. Поэтому у меня добавлен механизм уничтожения ссылок. В данном случае форма sprGroup получив ссылку на объект формы editTovar делает встречное обращение на editTovar и регистрирует себя как хранителя ссылки. editTovar запоминает ссылку на sprGroup. по закрытии sprGroup сообщает что ссылка удалена и editTovar удаляет sprGroup из списка хранителей ссылок на него. Если пользователь хочет закрыть editTovar до sprGroup, то editTovar вызывает метод sprGroup для удаления ссылки на него в sprGroup.oParent. Перечитал, мудрено, извиняюсь если написал инструкцию по взрыву мозга :) Механизм уничтожения ссылок встроен в класс БазоваяФорма. Реализовано примерно так: есть массив ThisForm.oChildLink[100] куда запоминаются ссылки на все формы хранящие ссылки на объекты данной формы. В вышеописанном это editTovar editTovar.Destroy() Код: sql 1. 2. 3. 4. 5.
PS Код схематичный. Возможно еще какие-то ньюансы забыл, давно писал. Много чего у меня в классах понаписано, старался показать только необходимое. Если не заработает, готов помочь в создании работающего примера. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2013, 21:20 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
Dima TПростой вопрос: ты планируешь писать хэлп по результату своего творчества? По сути ты замахнулся на создание новой среды разработки. А без описания она понятна только ее разработчику. Все эти объекты это набор абстрактного кода, который очень не просто сходу понять непосвященному человеку. Иногда даже сам не понимаешь почему на ровном месте что-то работать перестало после вроде бы незначительного изменения в конечном коде. Оказывается просто забыл про некоторые незначительные ограничение своих же классов. Так что советую по минимуму отходить от штатных возможностей фокса. Выводить в классы то что действительно необходимо, а не все подряд. Хотя бы просто из уважения к тем кто будет сопровождать этот код после тебя. Извините, встречный вопрос, не с целью обидеть - вы понимаете, что с умным видом написали ерунду? Неужели вы всерьез думаете, что способный создать среду разработки стал бы спрашивать мнение человека, который даже не знает, что это такое и где это находится. Вместо того, чтобы заявки принимать по переводу с FPD на VFP9. Большинство этих вопросов я решил еще семь-восемь лет назад. А сейчас просто сдул пыль с чудом сохранившихся кусков архивов и чуток подправил. Действительно, время в Фоксе словно остановилось. И не собираюсь я никому запрещать с гордым видом изобретать велосипед, если кому-то не жалко тратить на это годы своей жизни. Дело в том, что этот ваш путь ведет в тупик, и вопрос только времени, когда вы в этом тупике окажетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2013, 21:56 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
Dima TЭто схематично. На самом деле все немного сложнее. Я догадываюсь к чему ты ведешь. Есть такая фича/бага фокса: если где-то хранится ссылка на объект формы то форма не закроется. Поэтому у меня добавлен механизм уничтожения ссылок. В данном случае форма sprGroup получив ссылку на объект формы editTovar делает встречное обращение на editTovar и регистрирует себя как хранителя ссылки. editTovar запоминает ссылку на sprGroup. по закрытии sprGroup сообщает что ссылка удалена и editTovar удаляет sprGroup из списка хранителей ссылок на него. Если пользователь хочет закрыть editTovar до sprGroup, то editTovar вызывает метод sprGroup для удаления ссылки на него в sprGroup.oParent. Перечитал, мудрено, извиняюсь если написал инструкцию по взрыву мозга :) С мозгом действительно верно. А что мешает вам этот вызов делать через какую-либо обертку команды DO FORM. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2013, 22:06 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist Эту статью читали? Вернемся к этому вопросу, как договорились. Смотрим на дату создания статьи: Последние обновление: 2005-02-13 17:20 Опубликовал: Максимов Владимир Извините, первый вопрос - а где вы были восемь лет? Быстро пробежимся взглядом - главный файл, процедурное программирование, TasTrade ... Набираем в хелпе TasTrade ... Второй вопрос - о чем это? Вы в каком году живете, друзья? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2013, 18:48 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
ВладимирМ Теперь вернемся к вашим вопросам. Вы спрашивали, как я собираюсь реализовать ... да много что вы поднаписали. Насколько я понял, вы надеялись, что я ринусь разгребать ваши перечисления. Нет, пока все также остается, только меняется строка вызова. К примеру, было: oTable.Add() Стало: oTable.DoEdit("Add") Понадобится небольшая перестройка параметров. Использование DO CASE это довольно мощный механизм и не я его придумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2013, 23:18 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12PaulWist Эту статью читали? Вернемся к этому вопросу, как договорились. Смотрим на дату создания статьи: Последние обновление: 2005-02-13 17:20 Опубликовал: Максимов Владимир Извините, первый вопрос - а где вы были восемь лет? Быстро пробежимся взглядом - главный файл, процедурное программирование, TasTrade ... Набираем в хелпе TasTrade ... Второй вопрос - о чем это? Вы в каком году живете, друзья? 1. Ну а теперь смотрим на дату производства самого фокса 9-ой версии, ... VFP 9 (выпущен в производство 17 декабря 2004 г.) , и сравниваем с датой статьи,... теперь ответьте на вопрос что кардинально поменялось в фоксе с выходм SP1, SP2 да так, что бы это повлекло изменение "стартового" файла? 2. Действительно "пробежался" взглядом А теперь прочтите внимательно, что там написано: Код: plaintext 1. 2. 3.
По сути, если опустить некоторые детали, содержимое главного файла в этом случае будет выглядеть примерно так: Код: sql 1. 2. 3. 4.
В чем тут "фокус"? А "фокус" в том, что в момент создания объекта на базе класса TasTrade выполняется его событие Init. А уже из события Init этого класса осуществляется вызов всех тех методов, которые необходимы в данном приложении в момент загрузки приложения Метод goApp.Do() содержит собственно команду READ EVENTS, что и обеспечивает "точку останова" всего приложения. Команда CLEAR EVENTS дается в одном из методов класса goApp. В данном случае - это метод goApp.CleanUp2() Методы, которые необходимо выполнить при закрытии приложения можно вызвать в том же методе goApp.Do() после команды READ EVENTS или в событии goApp.Destroy() Все те процедуры, которые были описаны в данной статье, оформляются как отдельные методы класса TasTrade. И вызываются в соответствующем месте класса. Обратите внимание, что собственно класс TasTrade из библиотеки классов Main.vcx является наследником другого класса Application из библиотеки классов TSGen.vcx. Такая "иерархия" вовсе не случайна. В этом случае Вы можете использовать класс Application во всех Ваших приложениях, создавая на его основе собственный класс, например, MyClass в собственной библиотеке классов MyClass.vcx. Т.е. Вы получите некую общую библиотеку классов вообще для всех ваших проектов, как заготовку для класса конкретного приложения. Несколько слов о том, чего не должно быть в классе goApp. Дело в том, что возникает большое искушение "впихнуть" в класс goApp вообще все глобальные методы, переменные памяти и разные обработчики. Так вот, не надо этого делать. Цель класса goApp - это организовать корректную загрузку и выгрузку вашего приложения. Все! Все что "сверх" этой задачи должно быть выделено в отдельные классы. Например: Объект - обработчик ошибок Объект - стек активных объектов (форм) приложения Объект, содержащий глобальные настройки приложения Список можно продолжать. Но основной принцип: не смешивать в одном объекте разные задачи. Будьте осторожны с использованием класса из проекта TasTrade.pjx. Он достаточно далек от идеала. Его следует рассматривать скорее как учебное пособие, но не как объект готовый к использованию. Не надо слепо копировать его в свое приложение. Лучше напишите свой собственный класс. Да, это займет больше времени, но Вы лучше поймете что это такое и для чего это используется. Всего лишь приводится пример учебного пособия с разбором ошибок и предложением как делать "правильно". Так о чём Вы хотели сказать своим постом? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 10:12 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
Dima Tdo form &lcSprForm name loform Есть такая фича/бага фокса: если где-то хранится ссылка на объект формы то форма не закроется. Из хелпа: Включите ключевое слово LINKED для установки ссылки формы на переменную, ассоциированную с ней, для того, чтобы форма высвобождалась, когда переменная уходила из области видимости. Если вы не включите LINKED, форма останется активной, несмотря на то, что не имеется объектной переменной, ассоциированной с формой. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 10:13 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12Dima Tdo form &lcSprForm name loform Есть такая фича/бага фокса: если где-то хранится ссылка на объект формы то форма не закроется. Из хелпа: Включите ключевое слово LINKED для установки ссылки формы на переменную, ассоциированную с ней, для того, чтобы форма высвобождалась, когда переменная уходила из области видимости. Если вы не включите LINKED, форма останется активной, несмотря на то, что не имеется объектной переменной, ассоциированной с формой. И что это изменит в моем случае? Что-то изменит конечно, только не то что надо. Переменная loform локальная и при добавке LINKED запущенную форму пользователь вообще не увидит, т.к. она тут же закроется после отработки приведенного мной кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 10:30 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist, Спасибо за пост, но могли бы вы писать более короткими строками? Читать не очень удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 11:47 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist Фокус в том, что смотрим на название темы. Свои интерпретации устаревших версий VFP3-VFP5 на примере учебного пособия вы выдаете за эти "Основы". Хотя в VFP9 уже "17 декабря 2004г.", где проекты строятся на несколько иным приципах, без них обошлись и даже не включили в хелп. И очень бы хотелось, чтобы ваши "основы" хотя бы к десятилетнему юбилею соответствовали девятой версии, RS. Что поменялось, чем отличаются версии - это у вас, у гуру надо спросить. RS2. Можем не только пробежаться взглядом, а пройтись построчно. Не думаю, что от этого вы будете в восторге. RS3. Уточняю - я ничего не имею против простых и понятных решений Tastrade. Только не надо их выдавать за основы VFP9. Тем более, что в перестроенную структуру Главного модуля они прекрасно вписываются. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 12:31 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
Dima TЧто-то изменит конечно, только не то что надо. Переменная loform локальная и при добавке LINKED запущенную форму пользователь вообще не увидит, т.к. она тут же закроется после отработки приведенного мной кода. Что мешает вам сохранить вашу переменную хотя бы где-нибудь в Главном проекте в массиве. В VFP9 этот механизм встроен, можете оттуда выдернуть необходимое. RS. Не хочу вас обидеть, но с вашим примером я не вижу причин для гордости. Если точнее, не вижу даже приложения. Набор типовых решений, выполненных в собственном изготовлении и собранных в одну корзину. Если не ошибаюсь, по памяти - у Алексея Климова в его запутанном Smart-е подобный вызов форм редактирования в единой сессии вообще был решен мимоходом, между строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 12:32 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12Dima TЧто-то изменит конечно, только не то что надо. Переменная loform локальная и при добавке LINKED запущенную форму пользователь вообще не увидит, т.к. она тут же закроется после отработки приведенного мной кода. Что мешает вам сохранить вашу переменную хотя бы где-нибудь в Главном проекте в массиве. В VFP9 этот механизм встроен, можете оттуда выдернуть необходимое. Задлянафига? Писать LINKED потом хранить его в каком-то самопальном массиве, когда без LINKED все произойдет автоматом. Для этого есть коллекция _screen.forms PS Ответа не надо. Не хочу тебя отвлекать от написания oTable. А то боюсь мы так и не узнаем чего там внутри CASE :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 12:54 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
Dima TЗадлянафига? Почему обязательно нужно "так, но не так". У любой задачи может быть несколько решений. Вы же все равно их изобретаете заново в каждом приложении. Да и на чужие решения не грех порой взглянуть. Соберите их в главном модуле, а из приложения только вызывайте, по вкусу. Они ведь кушать не просят. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 13:34 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12 Фокус в том, что смотрим на название темы. Свои интерпретации устаревших версий VFP3-VFP5 на примере учебного пособия вы выдаете за эти "Основы". Хотя в VFP9 уже "17 декабря 2004г.", где проекты строятся на несколько иным приципах, без них обошлись и даже не включили в хелп. И очень бы хотелось, чтобы ваши "основы" хотя бы к десятилетнему юбилею соответствовали девятой версии, 1. Да не вопрос, приведите пример своего framework-a, приаттачте к сообщению. sg12RS. Что поменялось, чем отличаются версии - это у вас, у гуру надо спросить. 2. Сервиспаки никаких кардинальных изменений не внесли, поэтому статья написанная сразу после выхода фокса актуальна и сейчас. sg12RS2. Можем не только пробежаться взглядом, а пройтись построчно. Не думаю, что от этого вы будете в восторге. 3. Готов "пробежаться", ... учиться никогда не поздно. sg12RS3. Уточняю - я ничего не имею против простых и понятных решений Tastrade. Только не надо их выдавать за основы VFP9. Тем более, что в перестроенную структуру Главного модуля они прекрасно вписываются. 4. Если бы Вы внимательно прочли цитату из статьи: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 13:50 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12Dima TЗадлянафига? Почему обязательно нужно "так, но не так". У любой задачи может быть несколько решений. Может быть. Но прежде чем предлагать альтернативное решение будь готов обосновать его плюсы. А так непонятно почему вместо пары строк кода надо городить какие-то массивы? sg12Вы же все равно их изобретаете заново в каждом приложении. На чем данное утверждение основано? Я выше продемонстрировал обратное - показал свою возможность быстро создать почти готовое приложение без написания кода. sg12Да и на чужие решения не грех порой взглянуть. Я не против. Думал тут увижу код oTable. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 13:55 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist Вы невнимательно читаете. 1. Речь шла о родном framework от VFP9, а не моем. 2. Речь шла о версиях, а не сервиспаках. Напомню, VFP9 это не VFP3. 3. Если вы решили учиться, то запустите для этого какой-нибудь учебный проект согласно хелпу VFP9. Он на русском языке. 4. Предложение не знающим куда как тыкаться новичкам написать собственный Главный модуль вообще глупость. Надо быть "семи пядей во лбу", чтобы прочитав вашу статью, каждый смог бы начать изобретать свой framework. Учебный пример вам надо было предоставить восемь лет назад, до сих пор его нет, и вы опять предлагаете написать его самим новичкам, чтобы у каждого был свой паровоз. Надеюсь, хотя бы к десятилетнему юбилею VFP9 вы напишете подобный образец. А потом вы покажете, как в него вписать многочисленные решения с форумов, среди которых немало и находок. ДимаТ, на эти ваши вопросы я уже отвечал, зачем повторяться. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 18:24 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12PaulWist Вы невнимательно читаете. Ну что же давайте внимательно читать. sg12 1. Речь шла о родном framework от VFP9, а не моем. Дык, где поправленный Вами "родной" framework, который Вы хотите использовать, приводите код, пока вижу только одни "общие" слова? sg12PaulWist 2. Речь шла о версиях, а не сервиспаках. Напомню, VFP9 это не VFP3. Хорошо, тогда приведите кардинальные отличия VFP3 от VFP9, что в 3-ке не было обьектов, не было событий или обработчик событий был иным? sg12PaulWist 3. Если вы решили учиться, то запустите для этого какой-нибудь учебный проект согласно хелпу VFP9. Он на русском языке. Стоп-стоп, не надо уходить от ответа, вот Ваши слова: sg12RS2. Можем не только пробежаться взглядом, а пройтись построчно. Не думаю, что от этого вы будете в восторге Я готов пройтись построчно. Начинайте, что конкретно Вам не нравится в статье и какие на Ваш взгляд необходимы решения. sg12PaulWist 4. Предложение не знающим куда как тыкаться новичкам написать собственный Главный модуль вообще глупость. Надо быть "семи пядей во лбу", чтобы прочитав вашу статью, каждый смог бы начать изобретать свой framework. Учебный пример вам надо было предоставить восемь лет назад, до сих пор его нет, и вы опять предлагаете написать его самим новичкам, чтобы у каждого был свой паровоз. Надеюсь, хотя бы к десятилетнему юбилею VFP9 вы напишете подобный образец. А потом вы покажете, как в него вписать многочисленные решения с форумов, среди которых немало и находок. Понимаете в чём дело, что бы научиться надо "потыкаться", нельзя по книжке написать прогу,... или Вы хотите использовать готовый framework, ... тогда это надо смотреть коммерческие продукты, там и описалово и техподдержка. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 09:38 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist Не хитрите. Вы обошли одну фразу: "запустите какой-нибудь учебный проект согласно хелпу VFP9". Базу данных можете взять из Tastrade. Сделайте это и выложьте его сюда, пожалуйста. Тогда вы увидите и код, и что он не коммерческий, и что в VFP3 такого нет, и в вашей исторической статье о нем не строчки. И что даже особо не "потыкаясь", вы получили работоспособное приложение. И все это было решено еще в вашем 2005 г. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 11:37 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist RS. И заодно выложьте образец того, что вы советуете новичкам в своей статье. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 12:06 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist Давайте уточним. Вот коды Главного модуля приложения, что у меня получилось. А у вас что? *-- Class: app_application (c:\zz\libs\zz_app.vcx) *-- ParentClass: _application (c:\program files\microsoft visual foxpro 9\wizards\_framewk.vcx) *-- BaseClass: container *-- Time Stamp: 10/25/04 06:55:08 PM * DEFINE CLASS app_application AS _application Name = "_application" cusError.Name = "cusError" cusDataSession.Name = "cusDataSession" cusWindowHandler.Name = "cusWindowHandler" cusTableSort.Name = "cusTableSort" cusTableNav.Name = "cusTableNav" tmrRefresh.Name = "tmrRefresh" cCaption = "zz" cProjectName = "zz" cgomenufile = "zz_go" cstartupmenu = "zz_main" cmetatable = "zz_app" caboutboxclass = "app_aboutbox" cerrorviewerclass = "app_errorlogviewer" cstartupformclass = "app_favoritepicker" cnavtoolbarclass = "app_navtoolbar" cstartuptoolbarclass = "app_standardtoolbar" cnewopenclass = "app_newopen" coptionsdialogclass = "app_options" creportdialogclass = "app_reportpicker" cuserloginclass = "app_userlogin" cchangepasswordclass = "app_changepassword" lAboutbox = .T. lStartupForm = .T. lUserPreferences = .F. lFavorites = .T. lStartupToolbar = .T. ENDDEFINE *-- EndDefine: app_application ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 12:50 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist Вот как смотрятся эти коды Главного модуля приложения после того, как я вынесу все параметры в отдельный глобальный класс как свойства класса: goSet = CREATECLASS('EMPTY') DEFINE CLASS app_application AS _application ENDDEFINE А что у вас, дела подвигаются? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 13:05 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12PaulWist Вот как смотрятся эти коды Главного модуля приложения после того, как я вынесу все параметры в отдельный глобальный класс как свойства класса: goSet = CREATECLASS('EMPTY') Вы сами-то попробовали запустить предложенную строчку с фоксе, и чЁ в итоге создалось библиотека классов, обьект ... поясните пожалуйста :) sg12А что у вас, дела подвигаются? Если интересно, прочтите ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 13:25 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
PaulWist К вашим SQL-печалям еще вернемся, будет время. Зачем все в кашу перемешивать. За ошибку извиняюсь, поторопился: Глобальный объект goSet = CREATEOBJECT('EMPTY') Остальное в силе, жду. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 13:53 |
|
Общие принципы построения приложения в FoxPro
|
|||
---|---|---|---|
#18+
sg12PaulWist К вашим SQL-печалям еще вернемся, будет время. Зачем все в кашу перемешивать. За ошибку извиняюсь, поторопился: Глобальный объект goSet = CREATEOBJECT('EMPTY') Остальное в силе, жду. 1. ОК 2. У меня всё скромнее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 14:45 |
|
|
start [/forum/topic.php?fid=41&msg=38128478&tid=1583148]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 406ms |
0 / 0 |