Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с DBGrid ( ;Прыгает курсор ) [D5, Paradox]


cdaDmitriy ©   (2002-05-07 17:38:00) 

При выполненнии кода тестовый пример

Var FirstEnt:TBookMark;
begin
TabProc.DisableControls;
FirstEnt:=TabProc.GetBookMark;
TabProc.EnableControls;
DBGrid1.SetFocus;
TabProc.GotoBookmark(FirstEnt);
TabProc.FreeBookmark(FirstEnt);
end;

Если ( Пример условия )
DBGrid1.ROW > ( DBGrid1.VisibleROW / 2 ) и TabProc.recNO=1 ,, N
N > DBGrid1.VisibleROW

Курсор прыгает на середину DBGrid1.ROW=(DBGrid1.VisibleROW / 2 )

КТО НИБУДЬ ЗНАЕТ КАК ЭТО ЛЕЧИТЬ


cdaDmitriy   (2002-05-08 18:23:00) [1]

Я немножко исправил функцию
procedure ScrollActiveToRow(Grid : TRxDBGrid; ARow : Integer);
var FTitleOffset, SDistance,SDis,RowHeight,NewRow : Integer; NewRect : TRect;
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); // TMyDBGrid(Grid)
if (NewRow - ARow) < 0 then ActiveRecord := 0 else ActiveRecord := VisibleRowCount - 1;
SDistance := MoveBy(NewRow - ARow);
SDis:= NewRow - ARow - SDistance;/
NewRow := NewRow - SDistance;
MoveBy(ARow - ActiveRecord - FTitleOffset+SDis);/
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;


cdaDmitriy   (2002-05-08 15:54:00) [2]

Курсор должен остаться на тойже записи ( по индексу ) т,е,
в педыдущем примере Курсор должен стать на ROW=2 RecNo=2
но это Я уже исправил

другое : если запись удаляется после текущей но видимой на экране

Например
ROW=15 VisibleRowCount=20(+title) RecNo=30 RecordCount=35
и удаляем RecNo=33

То результат должен быть
ROW=16 VisibleRowCount=20(+title) RecNo=30 RecordCount=34


Lusha   (2002-05-08 15:22:00) [3]

>cdaDmitriy © (08.05.02 12:54)
Ну, а Вы чего ожидаете? Что по Вашему должно происходить в такой ситуации? (я имею в виду визуально)...


cdaDmitriy   (2002-05-08 15:12:00) [4]

>Lusha ©


cdaDmitriy   (2002-05-08 12:54:00) [5]

> Lusha © А ВЫ юмарист
(...Я не Работаю с Query1 а с TTable...
Не расстраивайтесь... Все Мы не без недостатков... :)
но это лирика )

ДЕЛО :

Курсор на ROW=3 RecNo=3 при очередном обнавлении базы
записи = 2 ( физически ) нет и тогда Курсор снова прыгает
я пытался искать предыдущее положение ( по индексу ) и изменять RecNo но пока не получилось....






Lusha   (2002-05-08 12:22:00) [6]

>cdaDmitriy © (08.05.02 12:14)
Если удаленная запись попадает в видимую часть DBGrid.
Поподробнее пожалуйста... Что и куда не попадает? Что такое удаленная запись в Вашем понимании?

...Я не Работаю с Query1 а с TTable...
Не расстраивайтесь... Все Мы не без недостатков... :)


cdaDmitriy   (2002-05-08 12:14:00) [7]

OK Стало намного лучше начало работать как надо
но есть еще проблемы : Если удаленная запись попадает
в видимую часть DBGrid.

P.S. И Я не Работаю с Query1 а с TTable но это не меняет суть


Lusha   (2002-05-08 09:04:00) [8]

>cdaDmitriy © (07.05.02 17:38)
Вот так...

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;



Пример вызова...

var BM : TBookMarkStr;
OldRow : Integer;
begin
OldRow := TMyDBGrid(DBGrid1).Row;
BM := Query1.Bookmark;
Query1.Close;
Query1.Open;
Query1.BookMark := BM;
ScrollActiveToRow(DBGrid1, OldRow);
end;


P.S. Необходимо определить тип TMyDBGrid = class(TDBGrid)


cdaDmitriy   (2002-05-08 08:57:00) [9]

НЕ хочу с этим мириться скролинг не коректный

НУЖНО ИСПРАВЛЯТЬ ....


deleon   (2002-05-08 08:47:00) [10]

Так оно и есть...смирись, сын мой :)))


cdaDmitriy   (2002-05-08 08:33:00) [11]

НУ хоть кто нибудь может посмотреть


cdaDmitriy   (2002-05-07 20:30:00) [12]

????


cdaDmitriy   (2002-05-07 18:26:00) [13]

???????


Наверх

Титульная страница Поиск, карта сайта Написать письмо