x11 Posted April 23, 2020 Share Posted April 23, 2020 Предисловие. Есть события, которые касаются изменения внешнего вида сетки TUniDBGrid, т.е. когда пользователь столбцы перемещает (меняет местами), меняет размер, прячет или показывает. И после изменения программист должен предоставить пользователю возможность сохранить настройки сетки. Я так и делаю - показываю кнопку Сохранить настройки таблицы. Да, можно кнопку "Сохранить настройки" держать всё время видимой, но зачем нагружать интерфейс и показывать пользователю кнопку, которой он пользуется раз в месяц? Поэтому я показываю кнопку "Сохранить настройки таблицы" только, если пользователь изменил настройки таблицы. Теперь вопрос. У сетки есть события ColumnMove, ColumnResize, но нету события ColumnVisiblity. Т.е. программист не знает, что пользователь скрыл/показал какой-то столбец. Как узнать, что пользователь скрыл или показал столбец? Хотелось бы, чтобы разработчики фрейморка добавили событие, которое отвечает за показ и за скрытие столбца. Или какое-то одно единое событие, например, ColumnChange, которое будет срабатывать во всех этих трех случаях: Move, Resize, Visiblity. Спасибо. Quote Link to comment Share on other sites More sharing options...
Tokay Posted April 23, 2020 Share Posted April 23, 2020 Что-то ты куда-то в дебри полез Я делаю проще (так же как в вингуе): при закрытии сохраняю состояние всех столбцов. При открытии восстанавливаю состояние. Всё происходит на серверной стороне несколькими строками кода в общем-то. Никаких дополнительных действий со стороны пользователя делать не нужно вообще, ну и обработки событий тоже не нужно, только открытие/закрытие формы. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 13 minutes ago, Tokay said: при закрытии сохраняю состояние всех столбцов. Зачем, если пользователь ничего не менял? 1. Ненужная нагрузка на сервер БД. 2. Засоряет ненужными данными БД. 3. Ненужная нагрузка на HTTP-сервер. 4. Ненужная нагрузка в общем, на весь сервер. Ладно, я понимаю, если приложение с 1-2 таблицами для 1-2 пользователей, а если 100-200 таблиц и 10-50-100-500 пользователей? Я тоже так раньше делал, но потом перешел на более рациональную модель. Оптимизировать приложение нужно стараться уже на стадии разработки, а не когда оно начнет тормозить. Quote Link to comment Share on other sites More sharing options...
Tokay Posted April 23, 2020 Share Posted April 23, 2020 1. Я эти данные храню в реестре, а не в базе. 2. Пользователей у нас сотни и по 50-100 столбцов в гриде. Нагрузки в общем можно сказать что и нет. 3. Дополнительной нагрузки на http не будет потому что после любого изменения они всегда синхронно отражаются на стороне бэка, будешь ли ты к этим свойствам обращаться или нет - не имеет вообще никакого значения. 4. Если уж хочется оптимизации, то точно не стоит это делать событиями. А вот спрашивать и просить признак того, что были изменения в гриде вообще, по которому опционально и сохранять данные. Пока ты делаешь методом 'в лоб', это не оптимизация а непонятно что. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 У вас там что, одна настройка на всех пользователей? Quote Link to comment Share on other sites More sharing options...
Tokay Posted April 23, 2020 Share Posted April 23, 2020 Нет, конечно. Поюзерно хранится в реестре. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 Какой кошмар. Quote Link to comment Share on other sites More sharing options...
Tokay Posted April 23, 2020 Share Posted April 23, 2020 В чем кошмар то? Отлично работает всё. Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 23, 2020 Share Posted April 23, 2020 2 hours ago, x11 said: Как узнать, что пользователь скрыл или показал столбец? Вы также можете использовать ClientEvents для этого. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 1 hour ago, Tokay said: В чем кошмар то? Отлично работает всё. Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 59 minutes ago, Sherzod said: Вы также можете использовать ClientEvents для этого. А можно подробнее? Может есть пример? Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 Я примерно понимаю, что нужно использовать либо два события columnhide + columnshow, либо одно columnschanged. Как правильно? И в этих событиях что-то нужно отправить на сервер. 1. Я не знаю как и что именно отправлять. 2. Где на сервере в приложении ловить то, что отправлено с клиента? В событии AjaxEvent у сетки? Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 23, 2020 Share Posted April 23, 2020 16 minutes ago, x11 said: columnhide + columnshow Да 16 minutes ago, x11 said: 1. Я не знаю как и что именно отправлять. 2. Где на сервере в приложении ловить то, что отправлено с клиента? В событии AjaxEvent у сетки? Да, с помощью ajaxRequest... Чуть позже я постараюсь Вам отправить рабочий пример. Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 23, 2020 Share Posted April 23, 2020 Хотя, Вы также можете найти на форуме несколько примеров... Quote Link to comment Share on other sites More sharing options...
Tokay Posted April 23, 2020 Share Posted April 23, 2020 2 hours ago, x11 said: Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом. Нет. Работает согласно рекомендаций Майкрософт хранить данные в реестре. Дальше спорить действительно смысла не имеет. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 3 hours ago, Sherzod said: Хотя, Вы также можете найти на форуме несколько примеров... Ок, Нашёл этот пример сделал аналогию function columnhide(ct, column, eOpts) { ajaxRequest(this, 'columnhide', []); } function columnshow(ct, column, eOpts) { ajaxRequest(this, 'columnshow', []); } В событии OnAjaxEvent показываю сообщение: procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin MyMessageBox(EventName, Params.Text); end; Проблема в том, что скрываю ОДНУ колонку, а события ДВА. Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 почему-то оно и то же событие два раза, но только параметрами отличаются Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 23, 2020 Share Posted April 23, 2020 Можете сделать тестовый случай? Quote Link to comment Share on other sites More sharing options...
x11 Posted April 23, 2020 Author Share Posted April 23, 2020 Постаавил breake point в событии procedure TfrdSessions.dbgSessionsAjaxEvent() срабатывает 2 раза. Не знаю почему. Пока сам разбираюсь.... Quote Link to comment Share on other sites More sharing options...
x11 Posted April 24, 2020 Author Share Posted April 24, 2020 On 4/23/2020 at 4:48 PM, Sherzod said: Можете сделать тестовый случай? Вот, прикрепил. Когда запустите приложение, то щёлкните слева по "Монітор підключень" - кнопка с глазом. Появится новая вкладка с таблицей. Как воспроизвести проблему. В событии есть переменная-счетчик procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin Inc(count); end; При открытии фрейма сразу загрузятся данные в таблицу. Поэтому произойдет событие "load" и переменная будет иметь значение 2. Если вы скроете какой-нибудь столбец, то переменная будет иметь уже значение 4. Если вы нажмете над таблице кнопку, то всплывет окно сообщения и покажет результат переменной-счётчика unigui_event.rar Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 24, 2020 Share Posted April 24, 2020 8 minutes ago, x11 said: unigui_event.rar Здравствуйте, procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin Inc(count); end; Почему здесь Вы не используете if EventName = ''... ? Quote Link to comment Share on other sites More sharing options...
x11 Posted April 24, 2020 Author Share Posted April 24, 2020 да какая разница, факт в том, что событие dbgSessionsAjaxEvent срабатывает два раза а должно один раз Quote Link to comment Share on other sites More sharing options...
x11 Posted April 24, 2020 Author Share Posted April 24, 2020 Изменил код procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin if EventName = 'columnhide' then Inc(count); end; count всё равно возвращает 2 при скрытии столбца Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 24, 2020 Share Posted April 24, 2020 18 minutes ago, x11 said: да какая разница Разница в том, что здесь все "события" отрабатываются. 17 minutes ago, x11 said: count всё равно возвращает 2 при скрытии столбца Я проверю. Quote Link to comment Share on other sites More sharing options...
Sherzod Posted April 24, 2020 Share Posted April 24, 2020 1 hour ago, x11 said: count всё равно возвращает 2 при скрытии столбца ОК, пожалуйста используйте другое имя для произвольного события, которое отличается от стандартного... function columnhide(ct, column, eOpts) { ajaxRequest(this, '_columnhide', ['colIndx=' + column.dataIndex]) } procedure TMainForm.UniDBGrid1AjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin if EventName = '_columnhide' then begin //Params.Values['colIndx'] end; end; Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.