powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Позиционирование при перечитывании запроса и GridMode
25 сообщений из 84, страница 3 из 4
Позиционирование при перечитывании запроса и GridMode
    #39731093
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

опечатка, вот так в конце:
Код: pascal
1.
cxGrid1DBTableView1.Controller.TopRecordIndex := nextVisible;
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731541
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiJaDi,

опечатка, вот так в конце:
Код: pascal
1.
cxGrid1DBTableView1.Controller.TopRecordIndex := nextVisible;



Уже пробовал такое, при установке TopRecordIndex в датасете позиционирование идет на последнюю видимую в гриде запись, а это не то что нужно.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731542
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerУже много лет как сервермоде сделан в гриде, который умеет гораздо больше чем гридмоде... И способен обрабатывать многопользовательские коллизии

Для оракла не сделан сервермодный компонент. Можно конечно извратиться и по аналогии написать свой, но был опыт уже таких работ, именно с сервермодного режима на это и скатился
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731545
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл ЭраГлупый какой. Мало тебе датасета, который 7 минут открывается?

Ладно, вот тебе кактус:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  fBM: Pointer;
  fTRI: Integer;
begin

 fBM :=   Датасет.GetBookmark;
 fTRI :=  ЦэИксГридВью.Controller.TopRecordIndex;

 Датасет.CloseOpen

 Датасет.GotoBookmark(fBM);
 ЦэИксГридВью.Controller.TopRecordIndex := fTRI;



Во-первых, датасет открывается влет, за доли секунды
Во-вторых, этот пример тоже не работает как нужно. Позиционирование проходит правильно на запись, но сама запись относительно сетки грида съезжает вниз (опять становится на предпоследнюю запись)

Уже начинаю сомневаться, что что-то получится((
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731550
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийДля оракла не сделан сервермодный компонент.В смысле? В сервермоде с ораклом можно работать через FireDac, ADO, DBX/ Чем не устраивает?
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731569
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийJaDiJaDi,

опечатка, вот так в конце:
Код: pascal
1.
cxGrid1DBTableView1.Controller.TopRecordIndex := nextVisible;



Уже пробовал такое, при установке TopRecordIndex в датасете позиционирование идет на последнюю видимую в гриде запись, а это не то что нужно.
РАБОТАЕТ. Корректно. Даже в грид моде. См. свой код, который где-то переоткрывает грид после восстановления фокуса. И восстановление надо делать уже после всех операций первооткрытия и EndUpdate'ов:

...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731639
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerЛеонов ЮрийДля оракла не сделан сервермодный компонент.В смысле? В сервермоде с ораклом можно работать через FireDac, ADO, DBX/ Чем не устраивает?
Пример работы с ODAC-овскими датасетами можете привести? Которые через Direct подключаются к БД?
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731644
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiРАБОТАЕТ. Корректно. Даже в грид моде. См. свой код, который где-то переоткрывает грид после восстановления фокуса. И восстановление надо делать уже после всех операций первооткрытия и EndUpdate'ов:


у меня отработал нормально только если стою на первой условной странице данных или на второй. На всех остальных - проблема.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731695
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийПример работы с ODAC-овскими датасетами можете привести? Которые через Direct подключаются к БД?Third-party компоненты не поддерживаем, хотя если не ошибаюсь, был пример адаптера для Unidac-а. А что в ODAC для этого грида есть такого, чего нет в том же FireDac?
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731703
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийJaDiРАБОТАЕТ. Корректно. Даже в грид моде. См. свой код, который где-то переоткрывает грид после восстановления фокуса. И восстановление надо делать уже после всех операций первооткрытия и EndUpdate'ов:


у меня отработал нормально только если стою на первой условной странице данных или на второй. На всех остальных - проблема.

На dxMemData работает, с TOraQuery - нет...
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731724
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийНа dxMemData работает, с TOraQuery - нет...

Хотя вру, работает... Походу наворотил в проекте лишнего, буду посмотреть.
Чуть позже отпишусь о результатах
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731727
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

хмм, действительно, при большом кол-ве данных на dxmem тоже не будет работать... Вот новый способ по сохранению и восстановлению данных с совсем другим подходом (через универсальные букмарки грида, работающие в любом режиме). Работает как в гриде моде, так и без него одинакового. Минимальный код (проверки при добавлении/удалении записей оставляю автору):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TForm16.cxButton2Click(Sender: TObject);
var
  difTopIndex: Integer;
begin
  cxGrid1DBTableView1.DataController.SaveBookmark;
  difTopIndex := cxGrid1DBTableView1.Controller.FocusedRecordIndex - cxGrid1DBTableView1.Controller.TopRecordIndex;

  // server changes simulate
  dxMemData1.Edit;
  dxMemData1.FieldByName('a').AsString := TimeToStr(Now);
  dxMemData1.Post;
  dxMemData1.SaveToTextFile('test.txt');
  dxMemData1.LoadFromTextFile('test.txt');

  // restore focus and scroll
  cxGrid1DBTableView1.DataController.GotoBookmark;
  cxGrid1DBTableView1.Controller.TopRowIndex := cxGrid1DBTableView1.Controller.FocusedRecordIndex - difTopIndex;
end;
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731761
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerЛеонов ЮрийПример работы с ODAC-овскими датасетами можете привести? Которые через Direct подключаются к БД?Third-party компоненты не поддерживаем, хотя если не ошибаюсь, был пример адаптера для Unidac-а. А что в ODAC для этого грида есть такого, чего нет в том же FireDac?
Оффтоп: вообще-то у одаков есть direct mode, который позволяет работать с базой напрямую без установки оракловского клиента одним экзешником (фаердак же требует установки клиента, который тянет за собой десятки файлов и кучу настроек). А вообще, тут ведь проблема в старом коде -- если есть проекты на одаках, то никто их просто так на фаердаки переписывать явно не будет.

Можно взять пример с того же FastReport'а -- который вместе с компонентами поставляет дополнительные адаптеры под те или иные базы/даки, и которые по желанию можно поставить.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731798
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TForm16.cxButton2Click(Sender: TObject);
var
  difTopIndex: Integer;
begin
  cxGrid1DBTableView1.DataController.SaveBookmark;
  difTopIndex := cxGrid1DBTableView1.Controller.FocusedRecordIndex - cxGrid1DBTableView1.Controller.TopRecordIndex;

  // server changes simulate
  dxMemData1.Edit;
  dxMemData1.FieldByName('a').AsString := TimeToStr(Now);
  dxMemData1.Post;
  dxMemData1.SaveToTextFile('test.txt');
  dxMemData1.LoadFromTextFile('test.txt');

  // restore focus and scroll
  cxGrid1DBTableView1.DataController.GotoBookmark;
  cxGrid1DBTableView1.Controller.TopRowIndex := cxGrid1DBTableView1.Controller.FocusedRecordIndex - difTopIndex;
end;


для ODAC-овского датасета подошел вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  LBookMark: TBookmark;
begin
  LBookMark := cxGrid1DBTableView1.DataController.GetBookmark;
  ... 
  cxGrid1DBTableView1.DataController.GotoBookmark(LBookMark);
end;


Наверное для GridMode большой индекс топа не понятен, сваливался в начало
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731799
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

неправильно скопировал, вот так надо
Код: 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.
27.
procedure TForm1.btnReloadClick(Sender: TObject);
var
  difTopIndex: Integer;
  LBookMark: TBookmark;
begin
  LBookMark := oqMain.GetBookmark;
  difTopIndex := gdbbtvMain.Controller.FocusedRecordIndex - gdbbtvMain.Controller.TopRecordIndex;

  meLog.Lines.Add('===' + TimeToStr(Time) + '===');
  meLog.Lines.Add('TopRecordIndex=' + IntToStr(difTopIndex));
  meLog.Lines.Add('RecNo=' + IntToStr(oqMain.RecNo));
  meLog.Lines.Add('Refresh data...');

  // server changes simulate
  oqMain.Close;
  oqMain.Open;

  // restore focus and scroll
  oqMain.GotoBookmark(LBookMark);
  gdbbtvMain.Controller.TopRecordIndex := gdbbtvMain.Controller.FocusedRecordIndex - difTopIndex;
  //gdbbtvMain.Controller.MakeFocusedRecordVisible;

  meLog.Lines.Add('Date refreshed');
  meLog.Lines.Add('TopRecordIndex=' +
    IntToStr(gdbbtvMain.Controller.TopRecordIndex));
  meLog.Lines.Add('RecNo=' + IntToStr(oqMain.RecNo));
end;
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731802
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

потому что это разные закладки... Для фокуса есть универсальная SaveBookmark и Goto. В справке написано именно ее использовать.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731837
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий, в gridmode еще могут поджидать сюрпризы при попытке работать с (множественным) выделением записей и букмарками
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731892
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiЛеонов Юрий,

потому что это разные закладки... Для фокуса есть универсальная SaveBookmark и Goto. В справке написано именно ее использовать.Для сабжа букмарки неприменимы.

при любом апдейте данных может произойти:
* изменение значений полей как в текущей записи, так и в других.
* изменение позиции в датасете (или даже в дереве) из-за апдейта сортированного поля.
* исчезновение из выборки, т.к. наложеный фильтр может выбросить обновленную запись.

Поэтому единственный выход: запоминание ключа, апдейт данных, переоткрытие датасета, попытка найти запомненный ключ.
Ну и проверка на то, был ли критичный апдейт, тогда переоткрытие может не понадобиться.
Если апдейт данных, это "удаление", то в некот. случаях можно виртуально удалить запись из датасета, не перечитывая заново весь датасет.
Это возможно в ФайрДАКе.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731900
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoДля сабжа букмарки неприменимы.

при любом апдейте данных может произойти:
* изменение значений полей как в текущей записи, так и в других.
* изменение позиции в датасете (или даже в дереве) из-за апдейта сортированного поля.
* исчезновение из выборки, т.к. наложеный фильтр может выбросить обновленную запись.

Поэтому единственный выход: запоминание ключа, апдейт данных, переоткрытие датасета, попытка найти запомненный ключ.
И как же "память о ключе" спасет, например, от "исчезновения" по условиям фильтрации?
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731954
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoДля сабжа букмарки неприменимы.

при любом апдейте данных может произойти:
* изменение значений полей как в текущей записи, так и в других.
* изменение позиции в датасете (или даже в дереве) из-за апдейта сортированного поля.
* исчезновение из выборки, т.к. наложеный фильтр может выбросить обновленную запись.

Поэтому единственный выход: запоминание ключа, апдейт данных, переоткрытие датасета, попытка найти запомненный ключ.
Ну и проверка на то, был ли критичный апдейт, тогда переоткрытие может не понадобиться.
Если апдейт данных, это "удаление", то в некот. случаях можно виртуально удалить запись из датасета, не перечитывая заново весь датасет.
Это возможно в ФайрДАКе.
Ключ и так запоминаю. Модель такая:
1. Если установили пользовательский фильтр, то без вариантов переходим на первую запись в гриде
2. Если это первоначальное заполнение грида (открытие формы например), то тоже идем на первую запись
3. Если хотим обновить данные, то сохраняем позицию "до" и восстанавливаем ее "после" перечитки данных
4. При совершении каких либо операций над записью, пытаемся стать на нее. Если по условиям фильтрации или сортировки запись меняет свое расположение в наборе данных, то становимся на нее, не учитывая предыдущую позицию. Если при фильтрации этой записи в обновленном наборе нет, то идем на первую запись в гриде.

Как видите, ключ я использую.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731973
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий...
4. При совершении каких либо операций над записью, пытаемся стать на нее. Если по условиям фильтрации или сортировки запись меняет свое расположение в наборе данных, то становимся на нее, не учитывая предыдущую позицию. Если при фильтрации этой записи в обновленном наборе нет, то идем на первую запись в гриде.

...
Т.обр., после удаления текущей записи ты каждый раз переходишь на первую запись? Прэлестно.
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731978
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoДля сабжа букмарки неприменимы.

при любом апдейте данных может произойти:
* изменение значений полей как в текущей записи, так и в других.
* изменение позиции в датасете (или даже в дереве) из-за апдейта сортированного поля.
* исчезновение из выборки, т.к. наложеный фильтр может выбросить обновленную запись.

Поэтому единственный выход: запоминание ключа, апдейт данных, переоткрытие датасета, попытка найти запомненный ключТа не, это же вопрос реализации букмаркинга датасетом и вполне есть такие в к-х всяческие изменения позиций не страшны (и ключ может запоминаться)
но конечно с выбытием по условиям фильтрации особо ничего не поделаешь, не положено если показывать
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731992
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanL_argoДля сабжа букмарки неприменимы.

при любом апдейте данных может произойти:
* изменение значений полей как в текущей записи, так и в других.
* изменение позиции в датасете (или даже в дереве) из-за апдейта сортированного поля.
* исчезновение из выборки, т.к. наложеный фильтр может выбросить обновленную запись.

Поэтому единственный выход: запоминание ключа, апдейт данных, переоткрытие датасета, попытка найти запомненный ключТа не, это же вопрос реализации букмаркинга датасетом и вполне есть такие в к-х всяческие изменения позиций не страшны (и ключ может запоминаться)
но конечно с выбытием по условиям фильтрации особо ничего не поделаешь, не положено если показывать

Вопрос вообще из серии "никакой", ТС сам себя напугал выдуманной проблемой и теперь героически ее преодолевает, непонятно для чего. Результат известен заранее: не он первый... :)
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731996
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл ЭраВопрос вообще из серии "никакой"я касательно "неприменимости" букмарков для сабжа, а этот вопрос вполне даже "какой". когда-то девэксы починили мне в частности B192042, но ряд траблов с gridmode и закладками таки помнится остался
...
Рейтинг: 0 / 0
Позиционирование при перечитывании запроса и GridMode
    #39731999
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,
ОК, реализацию букмарков нужно смотреть по месту в каждом конкретном классе датасета, но обычно, если в данных есть за что зацепиться - проблем нет.
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 3 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Позиционирование при перечитывании запроса и GridMode
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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