Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

Обновление в DbGrid   Найти похожие ветки 

 
Евгений Р.   (2008-07-19 15:30) [0]

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

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

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


 
turbouser ©   (2008-07-19 16:24) [1]

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


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

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


 
MsGuns ©   (2008-07-19 18:02) [3]

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


 
Johnmen ©   (2008-07-19 19:24) [4]


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

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


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


> MsGuns ©

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


 
turbouser ©   (2008-07-19 19:48) [6]


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

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


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

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


 
Johnmen ©   (2008-07-19 20:21) [8]


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

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


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

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


 
MsGuns ©   (2008-07-19 21:30) [10]

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

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


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


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

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


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


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

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


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


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

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


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


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


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


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


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

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


 
Плохиш ©   (2008-07-20 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 ©   (2008-07-21 15:13) [17]

>Плохиш ©   (20.07.08 23:32) [16]
>Если я всё правильно понял, то на
>type
TMyDBGrid = class(TrxDBGrid)

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

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


 
Плохиш ©   (2008-07-21 17:19) [18]


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

А я и не говорил, что этот код для копи-паста. Да и не собираюсь приглаживать работающие куски из проектов для использования кем-нибуть, каждый может довести их для себя. А возникающие вопросы задать.


 
Игорь Шевченко ©   (2008-07-21 21:38) [19]

MsGuns ©   (21.07.08 15:13) [17]


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


А тебе влом или впадлу дать заведомо работающий ?


 
Германн ©   (2008-07-22 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 ©   (2008-07-22 09:55) [21]

а если спозиционировать на 50й записи и послать 5раз нажатие клавиши курсор_вниз?


 
MsGuns ©   (2008-07-22 11:49) [22]

>Германн ©   (22.07.08 01:17) [20]
>А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005

Глупости.
Мне не "впадлу" (ИШ) написать 5 строчек кода (копи-пасте) в юните с гридами. Тащить же монстра RX ради скрола - все равно что не садиться за стол без жареного быка и ванны водки


 
Anatoly Podgoretsky ©   (2008-07-22 11:53) [23]

На наркотик сядет, потом постоянно будет по форумам бегать, дайте RX для ДельфиXXXX


 
Плохиш ©   (2008-07-22 12:18) [24]

Вообще-то в D7 TRxDBGrid скролится точно также как и нормальный...


 
dolmat   (2008-07-22 13:39) [25]

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


 
Johnmen ©   (2008-07-22 17:40) [26]


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

Вот так, по смешному чиху, увеличить ехешник на восемь метров...


 
Игорь Шевченко ©   (2008-07-22 21:16) [27]


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


Самолет продается только в комплекте с авианосцем


 
Petr V. Abramov ©   (2008-07-22 23:32) [28]

Удалено модератором


 
Евгений Р.   (2008-07-24 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}


работает так, как я хотел. Мерцание есть, но с ним пока мирюсь.
интересно послушать критику


 
Плохиш ©   (2008-07-24 11:21) [30]


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

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

PS. И куда делись BeginUpdate/EndUpdate?


 
Евгений Р.   (2008-07-24 12:05) [31]


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

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

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


 
Плохиш ©   (2008-07-24 14:00) [32]


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

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

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

В справке, например.


 
MsGuns ©   (2008-07-24 20:55) [33]

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


 
isasa ©   (2008-07-25 00:13) [34]

MsGuns ©   (24.07.08 20:55) [33]

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


Почему "иногда". Это один из "стандартных" обходных маневров для получения доступа к protected членам класса. :)


 
Германн ©   (2008-07-25 01:04) [35]


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


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


Аааа. Так вот что ты имел ввиду. Тут isasa © прав. .
ЮЗ для такого маневра даже изобрел имя THackxxxx. :)
И этот манёвр староизвестен ещё с Д1.


 
MsGuns ©   (2008-07-25 14:25) [36]

Под "иногда" я имел в виду не технологию, а сам совет, которым надо пользоваться ВДУМЧИВО.
В данном случае, ИМХО, именно так и произошло ;)



Страницы: 1 вся ветка

Текущий архив: 2009.03.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.021 c
15-1233142456
XeON
2009-01-28 14:34
2009.03.29
Обрезка изображения


9-1178217912
NDF
2007-05-03 22:45
2009.03.29
Помогите с DelphiX


2-1233221405
apic
2009-01-29 12:30
2009.03.29
64 bit


2-1233576454
MaxX
2009-02-02 15:07
2009.03.29
Отключить событие OnChange


2-1233322044
@!!ex
2009-01-30 16:27
2009.03.29
Как вычленить из строки кусок используя маску?