-
dbGrid отражает информацию tIbQuery
необходимо обновить информацию
делаю:
key:=quKey.asInteger;
qu.close;
qu.open;
qu.locate('key',variant(key),[]); (или BookMark)
все работает, но информация в гриде смещается. Можо ли сделать, сохранить одновременно позицию первой строки грида и текущей записи?
-
Как-то все непонятно.
Скорее всего отсортировать нд по ид деск
-
наверное Вы не поняли. на примере:
1.в гриде отражается 20 записей
2.в нд - 100 записей
3.сейчас грид показывает записи с 51й по 70ю, курсор на 5й строке грида (запись 55)
4.закрываю-открываю нд
5.позиционирую курсор на 55ю запись (locate)
6.грид показывает с 55й по 74ю. курсор на первой строке грида (запись 55)
7.необходимо чтобы в п.6 грид отражался также, как и в п.3
-
См. дедушку грида TCustomGrid
-
> Евгений Р. (19.07.08 17:16) [2]
Забей. Ибо существующая реализация того не стОит.
-
> MsGuns ©
речь ведете о дедушкином protected TopRow?
-
> Евгений Р. (19.07.08 19:28) [5]
Если внятно скажешь что надо - будут ответы. А так...
-
открыть дбГрид таким образом, чтобы в первой строке (topRow) была 51я запись НД, а выделенной была 55я строка НД (row=5).
-
> открыть дбГрид таким образом, чтобы в первой строке (topRow)
> была 51я запись НД
Если в НД всего 50, то можно 49?
-
в [7] разжован [2]. (в НД 100 записей)
-
>Евгений Р. (19.07.08 19:28) [5]
>речь ведете о дедушкином protected TopRow?
Да, о нем. Но есть вероятность при перечитке получить не то кол-во записей, которое было до нее (см. [8]). В этом случае есть веротность, что "картинку" физически нельзя будет восстановить. Во всяком случае надо городить целый огород. А стОит ли оно того ?
-
> turbouser © (19.07.08 19:48) [6]
>
>
> > Евгений Р. (19.07.08 19:28) [5]
>
> Если внятно скажешь что надо - будут ответы. А так...
>
<telepator>
Автор хочет чтоб "не моргало" при обновлении.
</telepator>
-
> MsGuns © (19.07.08 21:30) [10]
согласен, но это решается через пару ифов.
но указанные свойства - протектед
неужели в таких случаях обязательно городить наследника?
-
> неужели в таких случаях обязательно городить наследника?
>
>
Не обязательно "городить".
Но я пока не получил сведений, что это "тот" случай.
-
> Германн © (20.07.08 01:21) [11]
типа того. Но это не "моргание", а полная смена картинки. ([2] п.6)
-
> qu.locate('key',variant(key),[]); (или BookMark)
выделенное - глупость
букмарки имеют смысл только в рамках одного набора данных
переоткрытие дает много шансов смены адресов, что либо (в хорошем случае) позиционирует на неверную запись, либо (в плохом случае) бросит на AV
-
> Евгений Р. (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;
думаю разберёшься.
-
>Плохиш © (20.07.08 23:32) [16]
>Если я всё правильно понял, то на
>type
TMyDBGrid = class(TrxDBGrid)
Замечательный совет ;)
ЗЫ Вот зачем давать заведомо неработающий код ?
-
> MsGuns © (21.07.08 15:13) [17]
> ЗЫ Вот зачем давать заведомо неработающий код ?
А я и не говорил, что этот код для копи-паста. Да и не собираюсь приглаживать работающие куски из проектов для использования кем-нибуть, каждый может довести их для себя. А возникающие вопросы задать.
-
MsGuns © (21.07.08 15:13) [17]
> ЗЫ Вот зачем давать заведомо неработающий код ?
А тебе влом или впадлу дать заведомо работающий ?
-
> MsGuns © (21.07.08 15:13) [17]
>
> >Плохиш © (20.07.08 23:32) [16]
> >Если я всё правильно понял, то на
> >type
> TMyDBGrid = class(TrxDBGrid)
>
> Замечательный совет ;)
>
> ЗЫ Вот зачем давать заведомо неработающий код ?
>
А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005, если Джо не соврал. Я лично, его (нормальный скролл в TDBGrid) увидел только в BDS2006.
-
а если спозиционировать на 50й записи и послать 5раз нажатие клавиши курсор_вниз?
-
>Германн © (22.07.08 01:17) [20]
>А в Д7 без TRxDBGrid и работать не стОит. Нормальный скролл в TDBGrid Борланд реализовал только в Д2005
Глупости.
Мне не "впадлу" (ИШ) написать 5 строчек кода (копи-пасте) в юните с гридами. Тащить же монстра RX ради скрола - все равно что не садиться за стол без жареного быка и ванны водки
-
На наркотик сядет, потом постоянно будет по форумам бегать, дайте RX для ДельфиXXXX
-
Вообще-то в D7 TRxDBGrid скролится точно также как и нормальный...
-
уж если менять grid то на devexpress ExpressQuantumGrid и более не мучится
-
> dolmat (22.07.08 13:39) [25]
> уж если менять grid то на devexpress ExpressQuantumGrid
> и более не мучится
Вот так, по смешному чиху, увеличить ехешник на восемь метров...
-
> уж если менять grid то на devexpress ExpressQuantumGrid
> и более не мучится
Самолет продается только в комплекте с авианосцем
-
Удалено модератором
-
Большое спасибо всем, особенно Плохишу.
Не все понял, но в азах разобрался. Последовал совету, не использовать доп.компонентов. Сделал так:
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;
работает так, как я хотел. Мерцание есть, но с ним пока мирюсь.
интересно послушать критику
-
> Евгений Р. (24.07.08 02:11) [29]
> type tMyGrid=class(TCustomDbGrid);
Настойчиво советую убрать выделенное, т.к. нужен наследник TDBGrid-a, а не его брат :-)
PS. И куда делись BeginUpdate/EndUpdate?
-
> Плохиш © (24.07.08 11:21) [30]
TDBGrid - согласен, но не понимаю. Для доступа к Row работало даже при tCustomGrid.
BeginUpdate/EndUpdate - часто встречаю, но не понимаю их назначения. Если возможно - киньте где почитать. Но, к статьи и без них все работает.
-
> TDBGrid - согласен, но не понимаю. Для доступа к Row работало
> даже при tCustomGrid.
Для доступа к protected-свойствам необходимо создавать класс-наследник от класса, к свойствам которого мы хотим получить доступ. В данном случае тебе просто повезло :-)
> BeginUpdate/EndUpdate - часто встречаю, но не понимаю их
> назначения. Если возможно - киньте где почитать.
В справке, например.
-
Снимаю свое замечание в [17]
Иногда такое действует ;)
-
MsGuns © (24.07.08 20:55) [33]
Снимаю свое замечание в [17]
Иногда такое действует ;)
Почему "иногда". Это один из "стандартных" обходных маневров для получения доступа к protected членам класса. :)
-
> MsGuns © (24.07.08 20:55) [33]
>
> Снимаю свое замечание в [17]
> Иногда такое действует ;)
> isasa © (25.07.08 00:13) [34]
Аааа. Так вот что ты имел ввиду. Тут isasa © прав. .
ЮЗ для такого маневра даже изобрел имя THackxxxx. :)
И этот манёвр староизвестен ещё с Д1.
-
Под "иногда" я имел в виду не технологию, а сам совет, которым надо пользоваться ВДУМЧИВО.
В данном случае, ИМХО, именно так и произошло ;)