Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-53458
Эдуард
2004-02-08 16:26
2004.02.17
Есть ли возможнось узнать есть ли у класса A public-свойство B?


3-53423
tanuha
2004-01-28 14:23
2004.02.17
потеря данных после записи в .dbf


1-53488
Юрий Федоров
2004-02-05 21:02
2004.02.17
Работа в Word


14-53763
Карелин Артем
2004-01-27 15:19
2004.02.17
Посоветуйте книгу по C# и винде.НЕТ


1-53582
Alex100
2004-02-08 17:08
2004.02.17
Создание командной строки на основе TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский