Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
andrey_k3
128 / 128 / 41
Регистрация: 17.10.2013
Сообщений: 333
#1

Позиционирование в DBGrid после обновления

12.08.2014, 09:44. Просмотров 999. Ответов 1
Метки нет (Все метки)

Задача: пользователь должен отмечать записи (checkbox в ячейке DBGrid'а), необходимые для дальнейшей работы. при этом позиция курсора должна оставаться на месте (чистый locate с позиционированием в первой видимой строке не устраивает). в DBGrid выводится нередактируемый набор
Текущая реализация:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
procedure spg{save position grid}(var sgrid{грид, в котором производится позиционирование}: TRxDBGrid; ds_input{датасет, отвечающий за редактирование данных}, ds_tbl{датасет, возвращающий нередактируемый набор}: TZQuery);
var
  cr, j, i: Integer;
begin
  sgrid.Enabled:= False;
  sgrid.Visible:= False;
  cr:= ds_tbl.FieldByName('id').Value;
    j:= sgrid.SelectedFieldRect.Bottom div sgrid.DefaultRowHeight -
      sgrid.Columns.Items[0].Grid.CellRect(0,0).Bottom div sgrid.DefaultRowHeight - 1;
  ds_input.DisableControls;
  with ds_tbl do
    begin
      DisableControls;
      Close;
      Open;
      Locate('id', cr, []);
      for i:= 1 to j do sgrid.Perform(WM_VSCROLL, SB_LINEUP, 0);
      for i:= 1 to j do Next;
      EnableControls;
    end;
  ds_input.EnableControls;
  sgrid.Visible:= True;
  sgrid.Enabled:= True;
end;
...
procedure TFormLogED.RxDBGrid1CellClick(Column: TColumn);
var
  cr: Integer;
begin
  try
    if Column.FieldName = 'block'
    then
      begin
        cr:= DM.ZQueryLogEd_tbl.FieldByName('id').Value;
        case DM.ZQueryLogEd_tbl.FieldByName('block').Value of
          0:
            with DM.ZQueryLogED_modif do
              begin
                Active:= False;
                Connection:= FormMain.ZConnectionData;
                SQL.Clear;
                SQL.Add
                  (
                    'UPDATE log_ed SET block = 1, block_user = :user WHERE id = :id'
                  );
                Params.ParamByName('user').Value:=
                  FormMain.ZQueryAuthorization.FieldByName('log').Value;
                Params.ParamByName('id').Value:= cr;
                ExecSQL;
              end;
          1:
            if
              DM.ZQueryLogEd_tbl.FieldByName('block_user').Value =
                FormMain.ZQueryAuthorization.FieldByName('log').Value
            then
              with DM.ZQueryLogED_modif do
                begin
                  Active:= False;
                  Connection:= FormMain.ZConnectionData;
                  SQL.Clear;
                  SQL.Add
                    (
                      'UPDATE log_ed SET block = DEFAULT, block_user = DEFAULT WHERE id = :id'
                    );
                  Params.ParamByName('id').Value:= cr;
                  ExecSQL;
                end;
        end;
        try
          spg(RxDBGrid1, DM.ZQueryLogED_input, DM.ZQueryLogEd_tbl);
        except
          with DM.ZQueryLogEd_tbl do
            begin
              DisableControls;
              Refresh;
              Last;
              EnableControls;
            end;
        end;
      end;
  except
    ShowMessage('ошибка установки/снятия блокировки');
  end;
end;
Проблема: при работе на удаленном сервере (узкий канал) время отклика (установки/снятия чека) составляет 1-2 секунды, причем если пользователь шустрый и кликнул 5-7 раз, то время отклика увеличивается соответственно. я понимаю, что задержка именно из-за визуального позиционирования (если закомменировать строки с циклами процедуры spg, то всё нормально), но не доходит, как её обойти...
Система: Lazarus 1.2.4 (32)/FPC 2.6.4, RxLib rev2903, Zeos 7.1.3, MySQL 5.5.25a

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 09:44
Ответы с готовыми решениями:

Отключить позиционирование
Делфи 2007 как отключить желание делфи привязывать элемент к другому...

Позиционирование курсора в DBGrid после добавления новой записи
Доброго времени суток всем. Подскажите, пожалуйста, решение вот такой задачки:...

Выделение той же записи после обновления в DbGrid
Всем привет. У меня такая проблема. Использую Alpha Control при разработке...

После перезагрузки, затребованной Центром обновления для начала установки обновления, установка не начинается
Центр обновления Windows все время требует перезагрузки для установки...

Центр обновления требует перезагрузку для начала установки обновления, но после неё ничего не устанавливается
Центр обновления Windows все время требует перезагрузки для установки...

1
andrey_k3
128 / 128 / 41
Регистрация: 17.10.2013
Сообщений: 333
14.08.2014, 12:56  [ТС] #2
РЕШЕНО.
Задействован компонент ZUpdateSQL, вызывается RefreshCurrentRow.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
procedure TFormLogED.RxDBGrid1CellClick(Column: TColumn);
var
  cr: Integer;
begin
  try
    if Column.FieldName = 'block'
    then
      begin
        cr:= DM.ZQueryLogEd_tbl.FieldByName('id').Value;
        case DM.ZQueryLogEd_tbl.FieldByName('block').Value of
          0:
            with DM.ZQueryLogED_modif do
              begin
                Active:= False;
                Connection:= FormMain.ZConnectionData;
                SQL.Clear;
                SQL.Add
                  (
                    'UPDATE log_ed SET block = 1, block_user = :user WHERE id = :id'
                  );
                Params.ParamByName('user').Value:=
                  FormMain.ZQueryAuthorization.FieldByName('log').Value;
                Params.ParamByName('id').Value:= cr;
                ExecSQL;
              end;
          1:
            if
              DM.ZQueryLogEd_tbl.FieldByName('block_user').Value =
                FormMain.ZQueryAuthorization.FieldByName('log').Value
            then
              with DM.ZQueryLogED_modif do
                begin
                  Active:= False;
                  Connection:= FormMain.ZConnectionData;
                  SQL.Clear;
                  SQL.Add
                    (
                      'UPDATE log_ed SET block = DEFAULT, block_user = DEFAULT WHERE id = :id'
                    );
                  Params.ParamByName('id').Value:= cr;
                  ExecSQL;
                end
            else
              with DM.ZQueryLogED_modif do  //список пользователей (исполнители)
                begin
                  Active:= False;
                  Connection:= FormMain.ZConnectionAuthorization;
                  SQL.Clear;
                  SQL.Add('SELECT nickname FROM fkuuser WHERE log LIKE :user');
                  Params.ParamByName('user').Value:=
                    DM.ZQueryLogED_input.FieldByName('block_user').Value;
                  Open;
                  MessageBox
                    (FormLogED.Handle
                    ,PChar(Utf8ToAnsi('Данная запись заблокирована пользователем "' +
                      FieldByName('nickname').AsString + '"'))
                    ,PChar(Utf8ToAnsi('Редактирование записи'))
                    ,MB_OK or MB_ICONWARNING or MB_DEFBUTTON1);
                  Close;
                end;
        end;
        with DM.ZUpdateSQLLogED_tbl do
          begin
            RefreshSQL.Clear;
            RefreshSQL.Add
              (
                'SELECT block, block_user FROM log_ed WHERE id = :id'
              );
            Params.ParamByName('id').Value:= cr;
          end;
        DM.ZQueryLogEd_tbl.RefreshCurrentRow(False);
      end;
  except
    ShowMessage('ошибка установки/снятия блокировки');
  end;
end;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 12:56

После обновления драйвера на видеокарту экран после запуска винды выключается
У меня Windows 7,ноутбук Asus N61J! Видеокарта:AMD Radeon Mobility HD 5730!...

После обновления драйверов Nvidia GTX 630 после загрузки чёрный экран
Вообщем расскажу по порядку: Я вообще люблю обновлять весь софт. Особенно...

После разворачивания списка страница обновляется. Нужно остаться на предыдущей позиции после обновления
Есть сайт http://landpda.ru/ На нём установлены 2 кнопки. Нажатие на любую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru