Jump to content

Recommended Posts

Posted

Предисловие.

Есть события, которые касаются изменения внешнего вида сетки TUniDBGrid, т.е. когда пользователь столбцы перемещает (меняет местами), меняет размер, прячет или показывает. И после изменения программист должен предоставить пользователю возможность сохранить настройки сетки. Я так и делаю - показываю кнопку Сохранить настройки таблицы.

Да, можно кнопку "Сохранить настройки" держать всё время видимой, но зачем нагружать интерфейс и показывать пользователю кнопку, которой он пользуется раз в месяц? Поэтому я показываю кнопку "Сохранить настройки таблицы" только, если пользователь изменил настройки таблицы.

Теперь вопрос.

У сетки есть события ColumnMove, ColumnResize, но нету события ColumnVisiblity. Т.е. программист не знает, что пользователь скрыл/показал какой-то столбец.

Как узнать, что пользователь скрыл или показал столбец?

Хотелось бы, чтобы разработчики фрейморка добавили событие, которое отвечает за показ и за  скрытие столбца. Или какое-то одно единое событие, например, ColumnChange, которое будет срабатывать во всех этих трех случаях: Move, Resize, Visiblity.

Спасибо.

Posted

Что-то ты куда-то в дебри полез :) Я делаю проще (так же как в вингуе): при закрытии сохраняю состояние всех столбцов. При открытии восстанавливаю состояние. Всё происходит на серверной стороне несколькими строками кода в общем-то. Никаких дополнительных действий со стороны пользователя делать не нужно вообще, ну и обработки событий тоже не нужно, только открытие/закрытие формы.

Posted
13 minutes ago, Tokay said:

при закрытии сохраняю состояние всех столбцов.

Зачем, если пользователь ничего не менял?

1. Ненужная нагрузка на сервер БД.

2. Засоряет ненужными данными БД.

3. Ненужная нагрузка на HTTP-сервер.

4. Ненужная нагрузка в общем, на весь сервер.

Ладно, я понимаю, если приложение с 1-2 таблицами для 1-2 пользователей, а если 100-200 таблиц и 10-50-100-500 пользователей?

Я тоже так раньше делал, но потом перешел на более рациональную модель.

Оптимизировать приложение нужно стараться уже на стадии разработки, а не когда оно начнет тормозить.

Posted

1. Я эти данные храню в реестре, а не в базе.
2. Пользователей у нас сотни и по 50-100 столбцов в гриде. Нагрузки в общем можно сказать что и нет.
3. Дополнительной нагрузки на http не будет потому что после любого изменения они всегда синхронно отражаются на стороне бэка, будешь ли ты к этим свойствам обращаться или нет - не имеет вообще никакого значения.
4. Если уж хочется оптимизации, то точно не стоит это делать событиями. А вот спрашивать и просить признак того, что были изменения в гриде вообще, по которому опционально и сохранять данные.

Пока ты делаешь методом 'в лоб', это не оптимизация а непонятно что.

Posted

У вас там что, одна настройка на всех пользователей?

Posted
2 hours ago, x11 said:

Как узнать, что пользователь скрыл или показал столбец?

Вы также можете использовать ClientEvents для этого. 

Posted
1 hour ago, Tokay said:

В чем кошмар то? :) Отлично работает всё.

Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом.

 

Posted
59 minutes ago, Sherzod said:

Вы также можете использовать ClientEvents для этого. 

А можно подробнее?

Может есть пример?

Posted

Я примерно понимаю, что нужно использовать либо два события columnhide + columnshow, либо одно columnschanged. Как правильно?

И в этих событиях что-то нужно отправить на сервер.

1. Я не знаю как и что именно отправлять.

2. Где на сервере в приложении ловить то, что отправлено с клиента? В событии AjaxEvent у сетки?

 

Screenshot_5.jpg

Posted
16 minutes ago, x11 said:

columnhide + columnshow

Да

16 minutes ago, x11 said:

1. Я не знаю как и что именно отправлять.

2. Где на сервере в приложении ловить то, что отправлено с клиента? В событии AjaxEvent у сетки?

Да, с помощью ajaxRequest... 

Чуть позже я постараюсь Вам отправить рабочий пример. 

 

Posted
2 hours ago, x11 said:

Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом.

 

Нет. Работает согласно рекомендаций Майкрософт хранить данные в реестре. Дальше спорить действительно смысла не имеет.

Posted
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;

Проблема в том, что скрываю ОДНУ колонку, а события ДВА.

 

Screenshot_6.jpg

Posted

почему-то оно и то же событие два раза, но только параметрами отличаются

Screenshot_8.jpg

Posted

Постаавил breake point в событии

procedure TfrdSessions.dbgSessionsAjaxEvent()

 

срабатывает 2 раза.

Не знаю почему. Пока сам разбираюсь....

Posted
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

Screenshot_1.jpg

Posted
8 minutes ago, x11 said:

unigui_event.rar

Здравствуйте,

procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent;  EventName: string; Params: TUniStrings);
begin
  Inc(count);

end;

Почему здесь Вы не используете 

if EventName = ''...

?

Posted

да какая разница, факт в том, что событие

dbgSessionsAjaxEvent

  срабатывает два раза а должно один раз

Posted

Изменил код

procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent;  EventName: string; Params: TUniStrings);
begin
  if EventName = 'columnhide' then
    Inc(count);
end;


count всё равно возвращает 2 при скрытии столбца

Posted
18 minutes ago, x11 said:

да какая разница

Разница в том, что здесь все "события" отрабатываются.

17 minutes ago, x11 said:

count всё равно возвращает 2 при скрытии столбца

Я проверю.

Posted
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;

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...