Здравствуйте, SdrCoder, Вы писали:
SC>Здравствуйте, linker, Вы писали:
L>>Как запомнить строку на которой стоищь.А то при сортировке перекидывает на первую.
SC>можно так:
SC> bm := DataSet.Bookmark; SC> RefreshDataSet; SC> try SC> DataSet.Bookmark := bm; SC> except SC> end;
А зачем здесь try/except?
Hello, linker!
You wrote on Fri, 29 Apr 2005 07:30:53 GMT:
L>>> Как запомнить строку на которой стоищь.А то при сортировке L>>> перекидывает на первую.
SC>> можно так:
SC>> bm := DataSet.Bookmark; SC>> RefreshDataSet; SC>> try SC>> DataSet.Bookmark := bm; SC>> except end;
l> Почему-то присортировке так не прокатывает.
Тогда используй Locate.
Т.е. Запоминай ключ и ищи его после пересортировки....
Здравствуйте, Diouzshev, Вы писали:
D>Hello, linker! D>You wrote on Fri, 29 Apr 2005 07:30:53 GMT:
L>>>> Как запомнить строку на которой стоищь.А то при сортировке L>>>> перекидывает на первую.
SC>>> можно так:
SC>>> bm := DataSet.Bookmark; SC>>> RefreshDataSet; SC>>> try SC>>> DataSet.Bookmark := bm; SC>>> except end;
l>> Почему-то присортировке так не прокатывает.
D>Тогда используй Locate. D>Т.е. Запоминай ключ и ищи его после пересортировки....
Hello, linker!
You wrote on Fri, 29 Apr 2005 08:01:37 GMT:
l> Здравствуйте, Diouzshev, Вы писали:
D>> Тогда используй Locate. D>> Т.е. Запоминай ключ и ищи его после пересортировки.... l>
Все очень просто. Ведь у тебя есть в таблице ключевое поле?
Вот его и используй!
var
KeyValues : Variant;
....
MyDataSet.DisableControls;
try
KeyValues:= MyDataSet.FieldByName('ID').Value;
// если два ключевых поля то :
// KeyValues:= VarArrayOf([MyDataSet.FieldByName('ID1').Value, MyDataSet.FieldByName('ID2').Value]);
// Твоя сортировка
MyDataSet.Locate('ID', KeyValues, []);
// если два ключевых поля то :
// MyDataSet.Locate('ID1;ID2', KeyValues, []);finally
MyDataSet.EnableControls;
end;
Только сдается мне, что все равно все скакать будет, но это уже другая песня.
Hello, linker!
You wrote on Fri, 29 Apr 2005 10:43:56 GMT:
D>> Только сдается мне, что все равно все скакать будет, но это уже D>> другая песня.
l> Да все равно скачет,как это можно побороть.
"А я дам тебе клубочек, держи его за кончик. Будет он катиться, а ты следом иди." /"СЕСТРИЦА АЛЕНУШКА И БРАТЕЦ ИВАНУШКА", Русская народная сказка/
Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния.
Здравствуйте, Diouzshev, Вы писали:
D>Hello, linker! D>You wrote on Fri, 29 Apr 2005 10:43:56 GMT:
D>>> Только сдается мне, что все равно все скакать будет, но это уже D>>> другая песня.
l>> Да все равно скачет,как это можно побороть.
D>"А я дам тебе клубочек, держи его за кончик. Будет он катиться, а ты следом иди." /"СЕСТРИЦА АЛЕНУШКА И БРАТЕЦ ИВАНУШКА", Русская народная сказка/
D>Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния.
D>ИМХО пора подумать об овчинке и выделке %).
D>With best regards, Alexander Diouzshev-Maltsev.
Для меня в данном случае овчинка стоит выделке.Спасибо за подкинутую идею.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[8]: Запомнить позицию в dbgrid
От:
Аноним
Дата:
30.04.05 20:06
Оценка:
D>"А я дам тебе клубочек, держи его за кончик. Будет он катиться, а ты следом иди." /"СЕСТРИЦА АЛЕНУШКА И БРАТЕЦ ИВАНУШКА", Русская народная сказка/ D>Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния. D>ИМХО пора подумать об овчинке и выделке %).
Извиняюсь, но несколько предложений бреда, включая "Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния."
— DBGrid не скроллится "до какого-то состояния". Он всего лишь отображает положение курсора в Dataset`e. Поэтому рулить гридом — заранее бесполезно. Следует пользоваться методами Dataset`а, памятуя о идеологии, что Grid всего-навсего лишь отображает состояние и положение курсора в Dataset`е.
При сортировке порядок записей меняется. Но нам хочется вернуться на текущую запись, на ту, на которой находился КУРСОР[i] Dataset`а. По идее, для этого предназначаются механизм с TBookmark и одноименное свойство Dataset`а. Но не все так просто. Чаще всего Bookmark не работает (причины объяснять долго, это свойство конкретной реализации TDataset`а), и при его использовании следует проверять валидность текущего Bookmark`а.
Поэтому проще воспользоваться методами TDatset, теми которые осуществляют поиск и позиционирование на запись по какому-то условию. Для этого стоит потратить время и внимательно изучить справку по методам TDataset — там много полезного.
Очевидно, что до того как осуществлять навигацию до интересующей записи, следует
запомнить ее [i]ключевые поля. В случае если сорировка осуществляется на сервере — полезно не забывать что запрос фетчится по частям, и если выполнить пере-запрос с другим ORDER BY, то запомненая строка вполне может быть не отфетчена (это смотря какой метод навигации используется). И вообще, иногда полезно сортировать сервером, а не локально.
Здравствуйте, <Аноним>, Вы писали:
D>>"А я дам тебе клубочек, держи его за кончик. Будет он катиться, а ты следом иди." /"СЕСТРИЦА АЛЕНУШКА И БРАТЕЦ ИВАНУШКА", Русская народная сказка/ D>>Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния. D>>ИМХО пора подумать об овчинке и выделке %).
А>Извиняюсь, но несколько предложений бреда, включая "Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния."
А>- DBGrid не скроллится "до какого-то состояния". Он всего лишь отображает положение курсора в Dataset`e. Поэтому рулить гридом — заранее бесполезно. Следует пользоваться методами Dataset`а, памятуя о идеологии, что Grid всего-навсего лишь отображает состояние и положение курсора в Dataset`е.
А>При сортировке порядок записей меняется. Но нам хочется вернуться на текущую запись, на ту, на которой находился КУРСОР[i] Dataset`а. По идее, для этого предназначаются механизм с TBookmark и одноименное свойство Dataset`а. Но не все так просто. Чаще всего Bookmark не работает (причины объяснять долго, это свойство конкретной реализации TDataset`а), и при его использовании следует проверять валидность текущего Bookmark`а.
А>Поэтому проще воспользоваться методами TDatset, теми которые осуществляют поиск и позиционирование на запись по какому-то условию. Для этого стоит потратить время и внимательно изучить справку по методам TDataset — там много полезного. А>Очевидно, что до того как осуществлять навигацию до интересующей записи, следует А>запомнить ее [i]ключевые поля. В случае если сорировка осуществляется на сервере — полезно не забывать что запрос фетчится по частям, и если выполнить пере-запрос с другим ORDER BY, то запомненая строка вполне может быть не отфетчена (это смотря какой метод навигации используется). И вообще, иногда полезно сортировать сервером, а не локально.
Hello, !
You wrote on Sat, 30 Apr 2005 20:06:30 GMT:
> Извиняюсь, но несколько предложений бреда, включая "Запомнить > положение строки на экране (как вертикальное, так и горизонтальное), и > потом проскролить грид до этого состояния." > — DBGrid не скроллится "до какого-то состояния". Он всего лишь > отображает положение курсора в Dataset`e. Поэтому рулить гридом > — заранее бесполезно. Следует пользоваться методами Dataset`а, памятуя > о идеологии, что Grid всего-навсего лишь отображает состояние и > положение курсора в Dataset`е.
> При сортировке порядок записей меняется. Но нам хочется вернуться на > текущую запись, на ту, на которой находился [i]КУРСОР[i] Dataset`а.
[Sorry, skipped]
> Поэтому проще воспользоваться методами TDatset, теми которые > осуществляют поиск и позиционирование на запись по какому-то > условию. Для этого стоит потратить время и внимательно изучить > справку по методам TDataset — там много полезного.
[Sorry, skipped]
Дорогой Аноним, настоятельно рекомендую читать все сообщения топика, а не только последнее и вникать в то, о чем идет речь.
Все вышесказанное тобой уже было обсуждено в этом топике, вот только остается одна проблема, которая решается непросто (по крайней мере решения я не видел) — это, по возможности, не менять положения текущей записи _на экране_, для этого то и нужно "Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния.". И ты своими, хоть местами и правильными, но неактуальными заявлениями, сбиваешь с толку человека, которому надо решать проблему .
Вот здесь код который вроде отрабатывает нормально,т.е запись стоит на месте, а grid скролится при сортировке как надо. Re[9]: Запомнить позицию в dbgrid
D>Посмотрел еще при посте... Разберусь обязательно. D>У тебя TMyDBCrid = class (TCustomGrid). D>я правильно понял?
D>With best regards, Alexander Diouzshev-Maltsev.
TMyDBGrid = class(TDBGridEh); //использую Grid из ExLib
D>Посмотрел еще при посте... Разберусь обязательно. D>У тебя TMyDBCrid = class (TCustomGrid). D>я правильно понял?
D>With best regards, Alexander Diouzshev-Maltsev.
Нашел проблему, если в grid'е нету скролинга, то код отрабатывает неверно.