Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странное поведение TDBGrid / 19 сообщений из 19, страница 1 из 1
03.04.2020, 17:28
    #39943595
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Добрый день всем!

Заметил странное поведение TDBGrid, если есть обработчик DataSet.AfterScoll и в этом обработчике нужно "пробежаться" по записям грида. Если использовать код ниже, во время скроллинга текущая запись всегда остается в середине грида (за исключением начальных и конечных записей датасета).
Код: pascal
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.
procedure TfrmEqSrchRes.DataSetAfterScroll(DataSet: TDataSet);
var
 BM :TBookMark;
begin
 with dbgResultItems  do //  :TDBGrid;
   with DataSource.DataSet do
    begin
     DisableControls;
     AfterScroll := nil;
     BM := GetBookmark;
     try

//    здесь код по "пробежке" по записям датасета

     finally
      if Assigned(BM)then
       begin
        if BookmarkValid(BM)then GotoBookmark(BM);
        FreeBookmark(BM);
       end;

      AfterScroll := DataSetAfterScroll; 
      EnableControls;
     end;
    end;
end;


Вся соль в коде
Код: pascal
1.
2.
     
     if BookmarkValid(BM)then GotoBookmark(BM);


Если его убрать, перемещение по записям грида идет стандартное.
Хотелось бы избавиться от нежелательного поведения.

Заранее благодарен за идеи!
...
Рейтинг: 0 / 0
03.04.2020, 17:56
    #39943611
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
03.04.2020 17:28, Belotsky Serge пишет:
> Заметил странное поведение TDBGrid, если есть обработчик DataSet.AfterScoll и в этом обработчике нужно "пробежаться" по записям грида.

В ГРИДЕ ДАННЫХ НЕТ!
(С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.04.2020, 19:56
    #39943663
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge
Заранее благодарен за идеи!
Вопрос напишите. Или вы хотите от нас разрешения выбросить из вашего кода GotoBookmark(BM)? Ну выбросите, "не знаю как остальная братва, а я не возражаю".
...
Рейтинг: 0 / 0
04.04.2020, 07:43
    #39943789
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
bk0010
Belotsky Serge
Заранее благодарен за идеи!
Вопрос напишите. Или вы хотите от нас разрешения выбросить из вашего кода GotoBookmark(BM)? Ну выбросите, "не знаю как остальная братва, а я не возражаю".


Вопрос: как "пробежаться" по записям датасета внутри DataSet.AfterScroll, потом вернуться на активную запись при вызове AfterScroll и при этом, чтобы DBGrid вел себя обычно (стандартным образом).
...
Рейтинг: 0 / 0
04.04.2020, 07:44
    #39943790
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Мимопроходящий

03.04.2020 17:28, Belotsky Serge пишет:
> Заметил странное поведение TDBGrid, если есть обработчик DataSet.AfterScoll и в этом обработчике нужно "пробежаться" по записям грида.

В ГРИДЕ ДАННЫХ НЕТ!
(С)


Не флеймите, я имел ввиду датасет, привязанный к DBGrid. У датасета, надеюсь, есть записи?
...
Рейтинг: 0 / 0
04.04.2020, 11:15
    #39943805
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge,

Для ADO и MSSQL
Код: pascal
1.
2.
3.
4.
5.
6.
7.
rs:=ADODataSet.RecordSet.Clone(1);
rs.MoveFirst;
while Not rs.Eof()
 do begin
  ...
  rs.MoveNext;
      end;
...
Рейтинг: 0 / 0
04.04.2020, 11:54
    #39943816
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Gerasimenko
Belotsky Serge,

Для ADO и MSSQL
Код: pascal
1.
2.
3.
4.
5.
6.
7.
rs:=ADODataSet.RecordSet.Clone(1);
rs.MoveFirst;
while Not rs.Eof()
 do begin
  ...
  rs.MoveNext;
      end;


Увы, я пользуюсь стандартным TDataSet. Нет в нем методов RecordSet или Clone. Да и трудозатратно все это.
Я подозреваю, что в момент DataSet.EnableControls, DBGrid обновляет себя таким образом, чтобы текущая запись была по середине грида (если она не в начале или в конце).
Если бы DBGrid было свойство TopRow (как у TStringGrid), я бы попробовал запомнить его и вернуть его обратно после DataSet.EnableControls.
...
Рейтинг: 0 / 0
04.04.2020, 13:22
    #39943835
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge
Увы, я пользуюсь стандартным TDataSet. Нет в нем методов RecordSet или Clone. Да и трудозатратно все это.

Стандартный TDataSet - это абстрактный класс, который САМ ничего не умеет
...
Рейтинг: 0 / 0
04.04.2020, 14:16
    #39943848
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
DimaBr
Belotsky Serge
Увы, я пользуюсь стандартным TDataSet. Нет в нем методов RecordSet или Clone. Да и трудозатратно все это.

Стандартный TDataSet - это абстрактный класс, который САМ ничего не умеет


В моем случае - TOraQuery (TOraDataSet)
...
Рейтинг: 0 / 0
06.04.2020, 09:39
    #39944193
Hammer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge,
Можете описать изначальную задачу, которую вы решили столь нестандартным образом?
...
Рейтинг: 0 / 0
06.04.2020, 10:42
    #39944201
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge
DimaBr
пропущено...

Стандартный TDataSet - это абстрактный класс, который САМ ничего не умеет


В моем случае - TOraQuery (TOraDataSet)
как вариант задействовать что-то вроде cds наполняемый данными из исходного и позволяющий создать клон по к-му и ходить, не трогая оригинальный привязанный к гриду
...
Рейтинг: 0 / 0
06.04.2020, 11:46
    #39944219
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge,

Написать хранимую процедуру, которая сделает необходимые манипуляции с данными. Потом сделать Refresh вашей Query и отобразить изменения.
...
Рейтинг: 0 / 0
06.04.2020, 15:17
    #39944283
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
vavan
Belotsky Serge
пропущено...


В моем случае - TOraQuery (TOraDataSet)
как вариант задействовать что-то вроде cds наполняемый данными из исходного и позволяющий создать клон по к-му и ходить, не трогая оригинальный привязанный к гриду


Клонирование трудозатратно. Да и "бегаю" я только по записям выделенным в гриде. Условно говоря, юзер выделяет записи в гриде, а программа считает статистику "на лету". Выделяет он зажав Shift, при этом происходит вызов AfterScroll, после очередной выделенной записи.

Задачу можно решить по-другому, просто хотелось бы решить задачу без лишних телодвижений минимальными усилиями. Да и самому интересно стало, можно ли перемещаться по записям в AfterScroll и сохранить стандартное поведение грида.
...
Рейтинг: 0 / 0
06.04.2020, 15:27
    #39944284
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge,

На время "хождения по записям" - отключить грид от датасета. Потом - вернуть взад?
...
Рейтинг: 0 / 0
06.04.2020, 16:06
    #39944291
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
DarkMaster
Belotsky Serge,

На время "хождения по записям" - отключить грид от датасета. Потом - вернуть взад?


Это вряд ли, как только подключается датасет, пропадет все выделение, это если еще и позиция записи не изменится.
...
Рейтинг: 0 / 0
06.04.2020, 22:30
    #39944416
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge,

Пробежатся перед по гриду/дадасету, запомнить ИД выделенных записей? Без этого AfterScroll?
...
Рейтинг: 0 / 0
07.04.2020, 09:24
    #39944478
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Belotsky Serge
Клонирование трудозатратно
клонирование-то как раз практически бесплатно. затраты времени/памяти лишь чтобы в инмем засосать из исходного
...
Рейтинг: 0 / 0
07.04.2020, 16:41
    #39944592
Belotsky Serge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
DarkMaster
Belotsky Serge,

Пробежатся перед по гриду/дадасету, запомнить ИД выделенных записей? Без этого AfterScroll?
Я не знаю, какую следующую запись выделит юзер. Это становится известно только в AfterScroll (записи не обязательно выделяются последовательно). После разблокировки (EnableControls), грид рисует себя таким образом, чтобы выделенная запись была посередине грида.
Простой код:
Код: pascal
1.
DataSet.DisableControls; DataSet.Next; ... DataSet.Next; DataSet.EnableControls;

Если есть привязанный к датасету грид, то он отрисуется так, чтобы текущая запись была посередине, не не передвинулась на несколько записей вперед (
...
Рейтинг: 0 / 0
10.04.2020, 10:55
    #39945731
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение TDBGrid
Если надо бегать по датасету без генерации событий то как вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TMyDataLink = class(TDataLink)

 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMyDataLink := TMyDataLink.Create;
  FMyDataLink.DataSource := DataSource1;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  FMyDataLink.ActiveRecord := FMyDataLink.ActiveRecord + 1;
end;



Только возвращать позицию на место не забудь.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странное поведение TDBGrid / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]