Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление в DbGrid [D7, fb]


Страницы:   1 2

Евгений Р. ©   (2008-07-19 15:30:00) 

dbGrid отражает информацию tIbQuery
необходимо обновить информацию
делаю:

key:=quKey.asInteger;
qu.close;
qu.open;
qu.locate('key',variant(key),[]);  (или BookMark)

все работает, но информация в гриде смещается. Можо ли сделать, сохранить одновременно позицию первой строки грида и текущей записи?


Плохиш   (2008-07-20 23:32:00) [21]


> Евгений Р.   (19.07.08 15:30)  

Если я всё правильно понял, то на

....
   grdInfo: TRxDBGrid;
....
type
 TMyDBGrid = class(TrxDBGrid)
 end;
...
procedure TfrmOwnerList.ScrollActiveToRow(AGrid: TDBGrid; ARow: Integer);
var
    FTitleOffset, SDistance : Integer;
    NewRect : TRect;
    NewRow : Integer;
begin
 with TMyDBGrid(AGrid) 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);
     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 TfrmOwnerList.DBRefresh;
var
   save_Cur:   TCursor;
   save_LCol:  Integer;
   oldRow:     Integer;
   oldKey:     Variant;
   bRestore:   Boolean;
begin
 oldRow := 0;
 save_Cur := Screen.Cursor;
 if Active and CanRefresh then
 try
   Screen.Cursor := crSQLWait;
   bRestore := (not cdsInfo.IsEmpty) and (IndexField <> '');
   save_LCol := grdInfo.LeftCol;
   if bRestore then
   begin
      oldRow := grdInfo.Row;
     oldKey := cdsInfo.FieldByName(IndexField).Value;
   end;
   try
     cdsInfo.Active := false;
     qryInfo.Active := false;
     qryInfo.Active := true;
     cdsInfo.Active := true;
     if bRestore then
     begin
       if cdsInfo.Locate(IndexField, oldKey, [loCaseInsensitive]) then
          ScrollActiveToRow(grdInfo, oldRow);
     end;
   finally
     grdInfo.LeftCol := save_LCol;
   end;
 finally
   Screen.Cursor := save_Cur;
 end;
end;

думаю разберёшься.


Правильный$Вася   (2008-07-20 20:22:00) [22]


> qu.locate('key',variant(key),[]);  (или BookMark)

выделенное - глупость
букмарки имеют смысл только в рамках одного набора данных
переоткрытие дает много шансов смены адресов, что либо (в хорошем случае) позиционирует на неверную запись, либо (в плохом случае) бросит на AV


Евгений Р.   (2008-07-20 02:04:00) [23]


> Германн ©   (20.07.08 01:21) [11]


типа того. Но это не "моргание", а полная смена картинки. ([2] п.6)


Германн   (2008-07-20 01:58:00) [24]


> неужели в таких случаях обязательно городить наследника?
>
>

Не обязательно "городить".
Но я пока не получил сведений, что это "тот" случай.


Евгений Р.   (2008-07-20 01:52:00) [25]


> MsGuns ©   (19.07.08 21:30) [10]

согласен, но это решается через пару ифов.
но указанные свойства - протектед
неужели в таких случаях обязательно городить наследника?


Германн   (2008-07-20 01:21:00) [26]


> turbouser ©   (19.07.08 19:48) [6]
>
>
> > Евгений Р.   (19.07.08 19:28) [5]
>
> Если внятно скажешь что надо - будут ответы. А так...
>

<telepator>
Автор хочет чтоб "не моргало" при обновлении.
</telepator>


MsGuns   (2008-07-19 21:30:00) [27]

>Евгений Р.   (19.07.08 19:28) [5]
>речь ведете о дедушкином protected TopRow?

Да, о нем. Но есть вероятность при перечитке получить не то кол-во записей, которое было до нее (см. [8]). В этом случае есть веротность, что "картинку" физически нельзя будет восстановить. Во всяком случае надо городить целый огород. А стОит ли оно того ?


Евгений Р.   (2008-07-19 20:26:00) [28]

в [7] разжован [2]. (в НД 100 записей)


Johnmen   (2008-07-19 20:21:00) [29]


> открыть дбГрид таким образом, чтобы в первой строке (topRow)
> была 51я запись НД

Если в НД всего 50, то можно 49?


Евгений Р.   (2008-07-19 20:12:00) [30]

открыть дбГрид таким образом, чтобы в первой строке (topRow) была 51я запись НД, а выделенной была 55я строка НД (row=5).


turbouser   (2008-07-19 19:48:00) [31]


> Евгений Р.   (19.07.08 19:28) [5]

Если внятно скажешь что надо - будут ответы. А так...


Евгений Р.   (2008-07-19 19:28:00) [32]


> MsGuns ©

речь ведете о дедушкином protected TopRow?


Johnmen   (2008-07-19 19:24:00) [33]


> Евгений Р.   (19.07.08 17:16) [2]

Забей. Ибо существующая реализация того не стОит.


MsGuns   (2008-07-19 18:02:00) [34]

См. дедушку грида TCustomGrid


Евгений Р.   (2008-07-19 17:16:00) [35]

наверное Вы не поняли. на примере:
1.в гриде отражается 20 записей
2.в нд - 100 записей
3.сейчас грид показывает записи с 51й по 70ю, курсор на 5й строке грида (запись 55)
4.закрываю-открываю нд
5.позиционирую курсор на 55ю запись (locate)
6.грид показывает с 55й по 74ю. курсор на первой строке грида (запись 55)
7.необходимо чтобы в п.6 грид отражался также, как и в п.3


turbouser   (2008-07-19 16:24:00) [36]

Как-то все непонятно.
Скорее всего отсортировать нд по ид деск


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо