![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление в DbGrid [D7, fb]
Евгений Р. © (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]Как-то все непонятно.
Скорее всего отсортировать нд по ид деск