Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизКак сделать чтобы GotoBookmark не менял грид ? Найти похожие ветки
← →
Санек (2004-01-26 11:54) [0]Проблема такая: делаю перебор записей в таблице, потом возвращаюсь на текущу запись, при этом положение записи в Grid изменяется, т.е. если она была вверху то становиться по центу, как сделать так чтобы она оставалась там, где была в начале перебора записей. Перебирать записи в другой (клонированной) таблице нельзя, так как при переборе я изменяю её, и эти изменения должен показать Grid. Вот так делаю сейчас :
DisableControls;
BookMark:=GetBookmark;
First;
for i:=1 to RecordCount do begin
// Вношу изменения
Next;
end;
GotoBookmark(Bookmark);
FreeBookMark(Bookmark);
EnableControls;
← →
Санек (2004-01-26 12:30) [1]Уважаемые Мастера, помогите пожалуйста !!!
← →
Санек (2004-01-26 13:34) [2]Уважаемые Мастера, помогите пожалуйста !!!
← →
sniknik (2004-01-26 14:29) [3]заранее в типах
TMyDBGrid = class(TDBGrid);
и
i:= TMyDBGrid(DBGrid1).DataLink.ActiveRecord;
DisableControls;
BookMark:=GetBookmark;
First;
for i:=1 to RecordCount do begin
// Вношу изменения
Next;
end;
GotoBookmark(Bookmark);
FreeBookMark(Bookmark);
TMyDBGrid(DBGrid1).DataLink.ActiveRecord:= i;
EnableControls;
← →
Санек (2004-01-26 14:43) [4]А если
TMyDataSet = class(TDataset),
то из TMyDataSet добраться до TMyDBGrid(DBGrid1).DataLink.ActiveRecord можно ?
← →
sniknik (2004-01-26 15:01) [5]а ты проверь, на соместимость TDBGrid и TDataset.
← →
Санек (2004-01-26 15:08) [6]Не совместимы ...
Получается что из TDataSet нельзя так сделать ?
Просто вся эта обработка в самом компоненте наследнике TDataset
← →
Vlad (2004-01-26 15:22) [7]
> sniknik © (26.01.04 14:29) [3]
Шутишь ?
ActiveRecord относительно чего ? Относительно того DataLink который был до скроллинга. После скроллинга и возврата на букмарку DataLink имеет другое содержимое, соотв. твоим способом мы попадем совершенно на другую запись.
← →
Санек (2004-01-26 15:27) [8]Да, но :
ARec:=ActiveRecord;
// Вся обработка
ARec:=ActiveRecord - ARec;
While ARec>0 do begin
GetNextRecord;
Dec(ARec);
end;
Таким образом восстанавливаю весь буфер. Так что всё работает ворос только чтобы все было в одном компоненте.
← →
sniknik (2004-01-26 15:34) [9]Vlad © (26.01.04 15:22) [7]
> Шутишь ?
нет. проверь. указатель в гриде остается на месте, а без этого встает на середину если к примеру на последней в гриде стоял. (если это только не в самом начале таблици и не в самом конце, но это уже все реализуемо, направление это)
← →
Vlad (2004-01-26 15:44) [10]
> sniknik © (26.01.04 15:34) [9]
> Vlad © (26.01.04 15:22) [7]
> > Шутишь ?
> нет. проверь
Не верю. Потому что проверял - это во первых, а во вторых оно даже по логике так работать не должно. DataLink - это буфер с видимыми в гриде записями. Соотв. этот буфер при возврате на букмарку будет другим.
> Санек © (26.01.04 15:27) [8]
То, как ты восстанавливаешь буфер - это есть доп. скроллирование датасета, что само по себе не есть хорошо. Да и тем более в твоем алгоритме ты не учитываешь что ARec может быть меньше нуля, если до этого ты стоял на записи меньше средней.
← →
sniknik (2004-01-26 15:49) [11]> DataLink - это буфер с видимыми в гриде записями
а разве это с невидимыми записями работа?
i:= TMy DBGrid( DBGrid1).DataLink.ActiveRecord;
← →
Санек (2004-01-26 15:50) [12]Есть еще одна мелочь, которая решает все вышеперечисленные вопросы, это переписание виртуального метода Resync таким образом :
procedure TMyDataSet.Resync(Mode: TResyncMode);
begin
inherited Resync([rmExact]);
end;
После этого запись всегда будет последней.
← →
Vlad (2004-01-26 15:53) [13]
> sniknik © (26.01.04 15:49) [11]
С видимыми. В том и дело.
До скроллинга видимым был один набор данных, после скроллинга и возврата на букмарку виден другой набор данных (смещенный - активная запись в центре)
Соответственно ActiveRecord относительно нового (смещенного) набора данных уже будет другая.
← →
Санек (2004-01-26 15:57) [14](смещенный - активная запись в центре)
procedure TMyDataSet.Resync(Mode: TResyncMode);
begin
inherited Resync([rmExact]);
end;
последней будет запись, я же говорю всё работает, но как в один компонент всё поместить вот вопрос !
← →
Vlad (2004-01-26 16:18) [15]
> Санек © (26.01.04 15:57) [14]
> (смещенный - активная запись в центре)
>
> procedure TMyDataSet.Resync(Mode: TResyncMode);
> begin
> inherited Resync([rmExact]);
> end;
>
> последней будет запись, я же говорю всё работает, но как
> в один компонент всё поместить вот вопрос !
Найти все гриды подключенные к датасету и после возврата на букмарку восстановить активную запись во всех гридах. Вернее, если бы все происходило в рамках одной формы к примеру, то это несложно, а так придется извращаться.
Кстати, непонимаю, чем твой метод упрощает задачу. Все равно он не избавляет тебя от необходимости дополнительно скроллировать датасет. А если у тебя к датасету будет десять гридов подключено, и каждый из них будет пытаться при восстановлении записи скроллировать датасет ?
← →
sniknik (2004-01-26 16:23) [16]Vlad ©
зачем теоретизировать? просто попробуй и все
вот полная с учетом стояния указателя в первых и последних записях, и даже отсутствия/присутствия заголовка (в свое время выдрано откудато из глубин VCL и модифицированно)
procedure ScrollActiveToRow(Grid : TDBGrid; ARow : Integer);
var FTitleOffset, SDistance : Integer;
NewRect : TRect;
RowHeight : Integer;
NewRow : Integer;
begin
with TMyDBGrid(Grid) 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);
RowHeight:= DefaultRowHeight;
if dgRowLines in Options then Inc(RowHeight, GridLineWidth);
NewRect:= BoxRect(0, FTitleOffset, ColCount - 1, 1000);
ScrollWindowEx(Handle, 0, - RowHeight * SDistance, @NewRect, @NewRect, 0, nil, SW_Invalidate);
MoveColRow(Col, NewRow, False, False);
finally
EndUpdate;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var BM: TBookMarkStr;
OldRow: Integer;
begin
OldRow := TMyDBGrid(DBGrid1).Row;
BM := ADODataSet1.Bookmark;
ADODataSet1.DisableControls;
ADODataSet1.First;
ADODataSet1.Close;
ADODataSet1.Open; //набор поменяли
ADODataSet1.Last; //достаточно попрыгали по записям? следы запутали?
ADODataSet1.BookMark := BM;
ADODataSet1.EnableControls;
ScrollActiveToRow(DBGrid1, OldRow);
end;
вставить куда следует не проблема?
> но как в один компонент всё поместить вот вопрос !
передавай в свой компонент указатель на визуальный, без него не выйдет.
← →
Vlad (2004-01-26 16:32) [17]
> sniknik © (26.01.04 16:23) [16]
> зачем теоретизировать? просто попробуй и все
> вот полная с учетом стояния указателя в первых и последних
> записях
Во. Чувствуется разница между полной версией и той что была в [3] :-)
Спасибо, возьму на заметку, будет время попробую :-)
← →
Санек (2004-01-26 16:35) [18](А если у тебя к датасету будет десять гридов подключено, и каждый из них будет пытаться при восстановлении записи скроллировать датасет ?)
Об этом я как раз и не подумал ...
Всё вопрос закрыт, всем большое спасибо за помошь !
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c