Конференция "Базы" » Обновление в DbGrid [D7, fb]
 
  • Евгений Р. (19.07.08 15:30) [0]
    dbGrid отражает информацию tIbQuery
    необходимо обновить информацию
    делаю:

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

    все работает, но информация в гриде смещается. Можо ли сделать, сохранить одновременно позицию первой строки грида и текущей записи?
  • turbouser © (19.07.08 16:24) [1]
    Как-то все непонятно.
    Скорее всего отсортировать нд по ид деск
  • Евгений Р. (19.07.08 17:16) [2]
    наверное Вы не поняли. на примере:
    1.в гриде отражается 20 записей
    2.в нд - 100 записей
    3.сейчас грид показывает записи с 51й по 70ю, курсор на 5й строке грида (запись 55)
    4.закрываю-открываю нд
    5.позиционирую курсор на 55ю запись (locate)
    6.грид показывает с 55й по 74ю. курсор на первой строке грида (запись 55)
    7.необходимо чтобы в п.6 грид отражался также, как и в п.3
  • MsGuns © (19.07.08 18:02) [3]
    См. дедушку грида TCustomGrid
  • Johnmen © (19.07.08 19:24) [4]

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

    Забей. Ибо существующая реализация того не стОит.
  • Евгений Р. (19.07.08 19:28) [5]

    > MsGuns ©

    речь ведете о дедушкином protected TopRow?
  • turbouser © (19.07.08 19:48) [6]

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

    Если внятно скажешь что надо - будут ответы. А так...
  • Евгений Р. (19.07.08 20:12) [7]
    открыть дбГрид таким образом, чтобы в первой строке (topRow) была 51я запись НД, а выделенной была 55я строка НД (row=5).
  • Johnmen © (19.07.08 20:21) [8]

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

    Если в НД всего 50, то можно 49?
  • Евгений Р. (19.07.08 20:26) [9]
    в [7] разжован [2]. (в НД 100 записей)
  • MsGuns © (19.07.08 21:30) [10]
    >Евгений Р.   (19.07.08 19:28) [5]
    >речь ведете о дедушкином protected TopRow?

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

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

    <telepator>
    Автор хочет чтоб "не моргало" при обновлении.
    </telepator>
  • Евгений Р. (20.07.08 01:52) [12]

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

    согласен, но это решается через пару ифов.
    но указанные свойства - протектед
    неужели в таких случаях обязательно городить наследника?
  • Германн © (20.07.08 01:58) [13]

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

    Не обязательно "городить".
    Но я пока не получил сведений, что это "тот" случай.
  • Евгений Р. (20.07.08 02:04) [14]

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


    типа того. Но это не "моргание", а полная смена картинки. ([2] п.6)
  • Правильный$Вася (20.07.08 20:22) [15]

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

    выделенное - глупость
    букмарки имеют смысл только в рамках одного набора данных
    переоткрытие дает много шансов смены адресов, что либо (в хорошем случае) позиционирует на неверную запись, либо (в плохом случае) бросит на AV
  • Плохиш © (20.07.08 23:32) [16]

    > Евгений Р.   (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;


    думаю разберёшься.
  • MsGuns © (21.07.08 15:13) [17]
    >Плохиш ©   (20.07.08 23:32) [16]
    >Если я всё правильно понял, то на
    >type
    TMyDBGrid = class(TrxDBGrid)

    Замечательный совет ;)

    ЗЫ Вот зачем давать заведомо неработающий код ?
  • Плохиш © (21.07.08 17:19) [18]

    > MsGuns ©   (21.07.08 15:13) [17]
    > ЗЫ Вот зачем давать заведомо неработающий код ?

    А я и не говорил, что этот код для копи-паста. Да и не собираюсь приглаживать работающие куски из проектов для использования кем-нибуть, каждый может довести их для себя. А возникающие вопросы задать.
  • Игорь Шевченко © (21.07.08 21:38) [19]
    MsGuns ©   (21.07.08 15:13) [17]


    > ЗЫ Вот зачем давать заведомо неработающий код ?


    А тебе влом или впадлу дать заведомо работающий ?
  • Германн © (22.07.08 01:17) [20]

    > MsGuns ©   (21.07.08 15:13) [17]
    >
    > >Плохиш ©   (20.07.08 23:32) [16]
    > >Если я всё правильно понял, то на
    > >type
    > TMyDBGrid = class(TrxDBGrid)
    >
    > Замечательный совет ;)
    >
    > ЗЫ Вот зачем давать заведомо неработающий код ?
    >

    А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005, если Джо не соврал. Я лично, его (нормальный скролл в TDBGrid) увидел только в BDS2006.
  • Vlad Oshin © (22.07.08 09:55) [21]
    а если спозиционировать на 50й записи и послать 5раз нажатие клавиши курсор_вниз?
  • MsGuns © (22.07.08 11:49) [22]
    >Германн ©   (22.07.08 01:17) [20]
    >А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005

    Глупости.
    Мне не "впадлу" (ИШ) написать 5 строчек кода (копи-пасте) в юните с гридами. Тащить же монстра RX ради скрола - все равно что не садиться за стол без жареного быка и ванны водки
  • Anatoly Podgoretsky © (22.07.08 11:53) [23]
    На наркотик сядет, потом постоянно будет по форумам бегать, дайте RX для ДельфиXXXX
  • Плохиш © (22.07.08 12:18) [24]
    Вообще-то в D7 TRxDBGrid скролится точно также как и нормальный...
  • dolmat (22.07.08 13:39) [25]
    уж если менять grid то на devexpress ExpressQuantumGrid и более не мучится
  • Johnmen © (22.07.08 17:40) [26]

    > dolmat   (22.07.08 13:39) [25]
    > уж если менять grid то на devexpress ExpressQuantumGrid
    > и более не мучится

    Вот так, по смешному чиху, увеличить ехешник на восемь метров...
  • Игорь Шевченко © (22.07.08 21:16) [27]

    > уж если менять grid то на devexpress ExpressQuantumGrid
    > и более не мучится


    Самолет продается только в комплекте с авианосцем
  • Petr V. Abramov © (22.07.08 23:32) [28]
    Удалено модератором
  • Евгений Р. (24.07.08 02:11) [29]
    Большое спасибо всем, особенно Плохишу.
    Не все понял, но в азах разобрался. Последовал совету, не использовать доп.компонентов. Сделал так:

    type tMyGrid=class(TCustomDbGrid);
    procedure TfzvkJourn.RefreshData;
      var idfD:integer;
          OldActiveRecord:integer;
    Begin
      idfD:=quZvkIdfD.AsInteger;
      OldActiveRecord:=tMyGrid(dbg).DataLink.ActiveRecord;
      ta.Commit;
      quZvk.Open;
      quZvk.Locate('idfD',variant(idfD),[loPartialKey]);

      quZvk.MoveBy(tMyGrid(dbg).RowCount-OldActiveRecord-2);

      quZvk.MoveBy(-(tMyGrid(dbg).RowCount-OldActiveRecord-2));
    End;{RefreshData}



    работает так, как я хотел. Мерцание есть, но с ним пока мирюсь.
    интересно послушать критику
  • Плохиш © (24.07.08 11:21) [30]

    > Евгений Р.   (24.07.08 02:11) [29]
    > type tMyGrid=class(TCustomDbGrid);

    Настойчиво советую убрать выделенное, т.к. нужен наследник TDBGrid-a, а не его брат :-)

    PS. И куда делись BeginUpdate/EndUpdate?
  • Евгений Р. (24.07.08 12:05) [31]

    > Плохиш ©   (24.07.08 11:21) [30]

    TDBGrid - согласен, но не понимаю. Для доступа к Row работало даже при tCustomGrid.

    BeginUpdate/EndUpdate - часто встречаю, но не понимаю их назначения. Если возможно - киньте где почитать. Но, к статьи и без них все работает.
  • Плохиш © (24.07.08 14:00) [32]

    > TDBGrid - согласен, но не понимаю. Для доступа к Row работало
    > даже при tCustomGrid.

    Для доступа к protected-свойствам необходимо создавать класс-наследник от класса, к свойствам которого мы хотим получить доступ. В данном случае тебе просто повезло :-)

    > BeginUpdate/EndUpdate - часто встречаю, но не понимаю их
    > назначения. Если возможно - киньте где почитать.

    В справке, например.
  • MsGuns © (24.07.08 20:55) [33]
    Снимаю свое замечание в [17]
    Иногда такое действует ;)
  • isasa © (25.07.08 00:13) [34]
    MsGuns ©   (24.07.08 20:55) [33]

    Снимаю свое замечание в [17]
    Иногда такое действует ;)


    Почему "иногда". Это один из "стандартных" обходных маневров для получения доступа к protected членам класса. :)
  • Германн © (25.07.08 01:04) [35]

    > MsGuns ©   (24.07.08 20:55) [33]
    >
    > Снимаю свое замечание в [17]
    > Иногда такое действует ;)


    > isasa ©   (25.07.08 00:13) [34]


    Аааа. Так вот что ты имел ввиду. Тут isasa © прав. .
    ЮЗ для такого маневра даже изобрел имя THackxxxx. :)
    И этот манёвр староизвестен ещё с Д1.
  • MsGuns © (25.07.08 14:25) [36]
    Под "иногда" я имел в виду не технологию, а сам совет, которым надо пользоваться ВДУМЧИВО.
    В данном случае, ИМХО, именно так и произошло ;)
 
Конференция "Базы" » Обновление в DbGrid [D7, fb]
Есть новые Нет новых   [134473   +28][b:0.001][p:0.003]