Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 06:31
Оценка:
Как запомнить строку на которой стоищь.А то при сортировке перекидывает на первую.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Запомнить позицию в dbgrid
От: SdrCoder Украина  
Дата: 29.04.05 06:57
Оценка:
Здравствуйте, linker, Вы писали:

L>Как запомнить строку на которой стоищь.А то при сортировке перекидывает на первую.


можно так:

bm := DataSet.Bookmark;
RefreshDataSet;
try
DataSet.Bookmark := bm;
except
end;
Re[2]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 07:00
Оценка:
Здравствуйте, SdrCoder, Вы писали:

SC>Здравствуйте, linker, Вы писали:


L>>Как запомнить строку на которой стоищь.А то при сортировке перекидывает на первую.


SC>можно так:


SC> bm := DataSet.Bookmark;

SC> RefreshDataSet;
SC> try
SC> DataSet.Bookmark := bm;
SC> except
SC> end;
А зачем здесь try/except?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[2]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 07:30
Оценка:
Здравствуйте, SdrCoder, Вы писали:

SC>Здравствуйте, linker, Вы писали:


L>>Как запомнить строку на которой стоищь.А то при сортировке перекидывает на первую.


SC>можно так:


SC> bm := DataSet.Bookmark;

SC> RefreshDataSet;
SC> try
SC> DataSet.Bookmark := bm;
SC> except
SC> end;

Почему-то присортировке так не прокатывает.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[3]: Запомнить позицию в dbgrid
От: Diouzshev Россия  
Дата: 29.04.05 07:35
Оценка:
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.
Т.е. Запоминай ключ и ищи его после пересортировки....

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9
Re[4]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 07:55
Оценка:
Здравствуйте, 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>Т.е. Запоминай ключ и ищи его после пересортировки....

А пример можно, что-то не получается.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[4]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 08:01
Оценка:
Здравствуйте, Diouzshev, Вы писали:

D>Тогда используй Locate.

D>Т.е. Запоминай ключ и ищи его после пересортировки....
function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions
): Boolean; virtual;

Как запомнить этот ключ?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: Запомнить позицию в dbgrid
От: Diouzshev Россия  
Дата: 29.04.05 10:26
Оценка:
Hello, linker!
You wrote on Fri, 29 Apr 2005 08:01:37 GMT:

l> Здравствуйте, Diouzshev, Вы писали:


D>> Тогда используй Locate.

D>> Т.е. Запоминай ключ и ищи его после пересортировки....
l>
 l> function Locate(const KeyFields: string; const KeyValues: Variant;
 l> Options: TLocateOptions ): Boolean; virtual;
 l>

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;


Только сдается мне, что все равно все скакать будет, но это уже другая песня.

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9
Re[6]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 10:43
Оценка:
Здравствуйте, Diouzshev, Вы писали:

D>Только сдается мне, что все равно все скакать будет, но это уже другая песня.


Да все равно скачет,как это можно побороть.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[7]: Запомнить позицию в dbgrid
От: Diouzshev Россия  
Дата: 29.04.05 11:32
Оценка: 2 (1)
Hello, linker!
You wrote on Fri, 29 Apr 2005 10:43:56 GMT:

D>> Только сдается мне, что все равно все скакать будет, но это уже

D>> другая песня.

l> Да все равно скачет,как это можно побороть.


"А я дам тебе клубочек, держи его за кончик. Будет он катиться, а ты следом иди." /"СЕСТРИЦА АЛЕНУШКА И БРАТЕЦ ИВАНУШКА", Русская народная сказка/

Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния.

ИМХО пора подумать об овчинке и выделке %).

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9
Re[8]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 29.04.05 11:39
Оценка:
Здравствуйте, 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, то запомненая строка вполне может быть не отфетчена (это смотря какой метод навигации используется). И вообще, иногда полезно сортировать сервером, а не локально.
Re[9]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 03.05.05 06:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

D>>"А я дам тебе клубочек, держи его за кончик. Будет он катиться, а ты следом иди." /"СЕСТРИЦА АЛЕНУШКА И БРАТЕЦ ИВАНУШКА", Русская народная сказка/

D>>Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния.
D>>ИМХО пора подумать об овчинке и выделке %).

А>Извиняюсь, но несколько предложений бреда, включая "Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния."


А>- DBGrid не скроллится "до какого-то состояния". Он всего лишь отображает положение курсора в Dataset`e. Поэтому рулить гридом — заранее бесполезно. Следует пользоваться методами Dataset`а, памятуя о идеологии, что Grid всего-навсего лишь отображает состояние и положение курсора в Dataset`е.


А>При сортировке порядок записей меняется. Но нам хочется вернуться на текущую запись, на ту, на которой находился КУРСОР[i] Dataset`а. По идее, для этого предназначаются механизм с TBookmark и одноименное свойство Dataset`а. Но не все так просто. Чаще всего Bookmark не работает (причины объяснять долго, это свойство конкретной реализации TDataset`а), и при его использовании следует проверять валидность текущего Bookmark`а.


А>Поэтому проще воспользоваться методами TDatset, теми которые осуществляют поиск и позиционирование на запись по какому-то условию. Для этого стоит потратить время и внимательно изучить справку по методам TDataset — там много полезного.

А>Очевидно, что до того как осуществлять навигацию до интересующей записи, следует
А>запомнить ее [i]ключевые поля
. В случае если сорировка осуществляется на сервере — полезно не забывать что запрос фетчится по частям, и если выполнить пере-запрос с другим ORDER BY, то запомненая строка вполне может быть не отфетчена (это смотря какой метод навигации используется). И вообще, иногда полезно сортировать сервером, а не локально.

А примера, простого нету?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[9]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 03.05.05 07:03
Оценка:
Такой сопсоб позиционирования имеет право на жизнь?
procedure TformMain.ScrollActiveToRow(Grid: TDBGridEh; ARow: Integer);
var
     FTitleOffset, SDistance : Integer;
     NewRect : TRect;
     RowHeight : Integer;
     NewRow : Integer;
begin
 with TMyDBGrid(Grid) do begin
   NewRow:= Row;
   FTitleOffset:= 0;
   if dgTitles in Options then inc(FTitleOffset);
   if ARow = NewRow then Exit;
   with DataLink, DataSet do
    try
      BeginUpdate;
      Scroll(NewRow - ARow);
      if (NewRow - ARow) < 0 then
       ActiveRecord:= 0
      else
        ActiveRecord:= VisibleRowCount - 1;
      SDistance:= MoveBy(NewRow - ARow);
      NewRow:= NewRow - SDistance;
      MoveBy(ARow - ActiveRecord - FTitleOffset);
      RowHeight:= DefaultRowHeight;
      NewRect:= BoxRect(0, FTitleOffset, ColCount - 1, 1000);
      ScrollWindowEx(Handle, 0,0, @NewRect, @NewRect, 0, nil, SW_Invalidate);
      MoveColRow(Col, NewRow, False, False);
    finally
      EndUpdate;
    end;
 end;

end;


procedure TformMain.DBGridMainTitleClick(Column: TColumnEh);
var
 sFieldName,sSQLReq:string;
 KeyValues : Variant;
 OldRow: Integer;
begin
 OldRow := TMyDBGrid(DBGridMain).Row;
 DM.qMain.DisableControls;
try
  KeyValues:= Dm.qMain.FieldByName('ID').Value;
  sSQLReq:=DM.qMain.SQL.Text;
  if (Column.ID = 2) then
    sFieldName:='order by CAST(' + Column.FieldName + ' as UNSIGNED)'
  else
    sFieldName:='order by '+Column.FieldName;
  sSQLReq:=StringReplace(sSQLReq,sOrderBy,sFieldName,[rfReplaceAll]);
  sOrderBy:=sFieldName;
  if (iFlag = 1) then
    begin
    DM.qMain.Sql.Clear;
    DM.qMain.Sql.Add(sSQLReq+sOrderBy);
    DM.qMain.Open;
    iFlag := iFlag + 1;
  end
  else
    begin
        DM.qMain.Sql.Clear;
        DM.qMain.Sql.Add(sSQLReq);
        DM.qMain.Open;
    end;
  DM.qMain.Locate('ID', KeyValues, []);
finally
  DM.qMain.EnableControls;
end;
  ScrollActiveToRow( DBGridMain , OldRow);
end;
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[9]: Запомнить позицию в dbgrid
От: Diouzshev Россия  
Дата: 03.05.05 09:02
Оценка:
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]

Дорогой Аноним, настоятельно рекомендую читать все сообщения топика, а не только последнее и вникать в то, о чем идет речь.
Все вышесказанное тобой уже было обсуждено в этом топике, вот только остается одна проблема, которая решается непросто (по крайней мере решения я не видел) — это, по возможности, не менять положения текущей записи _на экране_, для этого то и нужно "Запомнить положение строки на экране (как вертикальное, так и горизонтальное), и потом проскролить грид до этого состояния.". И ты своими, хоть местами и правильными, но неактуальными заявлениями, сбиваешь с толку человека, которому надо решать проблему .


With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9
Re[10]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 03.05.05 09:25
Оценка:
Вот здесь код который вроде отрабатывает нормально,т.е запись стоит на месте, а grid скролится при сортировке как надо.
Re[9]: Запомнить позицию в dbgrid
Автор: linker
Дата: 03.05.05
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[11]: Запомнить позицию в dbgrid
От: Diouzshev Россия  
Дата: 04.05.05 06:41
Оценка:
Hello, linker!
You wrote on Tue, 03 May 2005 09:25:50 GMT:

l> Вот здесь код который вроде отрабатывает нормально,т.е запись стоит

l> на месте, а grid скролится при сортировке как надо.
l> Re[9]:<br />
<span class='lineQuote level1'> l&gt; Запомнить позицию в dbgrid</span>
Автор: linker
Дата: 03.05.05


Посмотрел еще при посте... Разберусь обязательно.
У тебя TMyDBCrid = class (TCustomGrid).
я правильно понял?

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9
Re[12]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 04.05.05 06:49
Оценка:
Здравствуйте, Diouzshev, Вы писали:

D>Hello, linker!

D>You wrote on Tue, 03 May 2005 09:25:50 GMT:

l>> Вот здесь код который вроде отрабатывает нормально,т.е запись стоит

l>> на месте, а grid скролится при сортировке как надо.
l>> Re[9]:<br />
<span class='lineQuote level2'> l&gt;&gt; Запомнить позицию в dbgrid</span>
Автор: linker
Дата: 03.05.05


D>Посмотрел еще при посте... Разберусь обязательно.

D>У тебя TMyDBCrid = class (TCustomGrid).
D>я правильно понял?

D>With best regards, Alexander Diouzshev-Maltsev.


TMyDBGrid = class(TDBGridEh); //использую Grid из ExLib
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[12]: Запомнить позицию в dbgrid
От: linker Россия  
Дата: 04.05.05 09:44
Оценка:
Здравствуйте, Diouzshev, Вы писали:

D>Hello, linker!

D>You wrote on Tue, 03 May 2005 09:25:50 GMT:

l>> Вот здесь код который вроде отрабатывает нормально,т.е запись стоит

l>> на месте, а grid скролится при сортировке как надо.
l>> Re[9]:<br />
<span class='lineQuote level2'> l&gt;&gt; Запомнить позицию в dbgrid</span>
Автор: linker
Дата: 03.05.05


D>Посмотрел еще при посте... Разберусь обязательно.

D>У тебя TMyDBCrid = class (TCustomGrid).
D>я правильно понял?

D>With best regards, Alexander Diouzshev-Maltsev.


Нашел проблему, если в grid'е нету скролинга, то код отрабатывает неверно.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.