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

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

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


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

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

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


Не флеймите, я имел ввиду датасет, привязанный к DBGrid. У датасета, надеюсь, есть записи?
...
Рейтинг: 0 / 0
Странное поведение TDBGrid
    #39943805
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;
...
Рейтинг: 0 / 0
Странное поведение TDBGrid
    #39943816
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Странное поведение TDBGrid
    #39943835
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge
Увы, я пользуюсь стандартным TDataSet. Нет в нем методов RecordSet или Clone. Да и трудозатратно все это.

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

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


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

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


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

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


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


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

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

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

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


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

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

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

Если есть привязанный к датасету грид, то он отрисуется так, чтобы текущая запись была посередине, не не передвинулась на несколько записей вперед (
...
Рейтинг: 0 / 0
Странное поведение TDBGrid
    #39945731
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если надо бегать по датасету без генерации событий то как вариант
Код: 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
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странное поведение TDBGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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