![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заморозить TDbGrid? [D6, D7, IB6.x, MSSQL, MySQL, dBase, FoxPro, Paradox]
гончий © (2003-04-09 09:48:00)Необходимо отключить его от базы, пробежаться по таблице, вернуть курсор на исходное место с помощью закладки и снова подключить его. Но если запись до навигации была не в середине видимых рядов, то грид после подключения дергается. Нужно чтобы было незаметно, что выполнялась навигация по таблице. Клонировать таблицу не предлагать :)
гончий (2003-04-09 11:20:00) [1]Lord Warlock - это не проще, если в таблице lookup | calc - поля, она фильтруется, или, что еще хуже изменяется динамически
Lord Warlock (2003-04-09 11:11:00) [2]
> гончий (09.04.03 10:57)
Ну понятно. Без лишней писанины можно использовать предложение
AlexSerp ©, только создать не присоединенный к контролам набор данных не run-time, а постоянно.
гончий (2003-04-09 10:57:00) [3]Lord Warlock - установи перед вызовом процедуры, курсор на верхнюю запись в гриде, подальше от центра и выполни процедуру. после ее выполнения, ряд, на котором установится курсор будет уже не верхним в гриде, а посередине.
Lord Warlock (2003-04-09 10:53:00) [4]или если угодно, так
with DBGrid1.DataSource.DataSet do
begin
B:=GetBookmark;
DisableControls;
First;
while not Eof do
Next;
GotoBookmark(B);
EnableControls;
FreeBookmark(B);
end;
как ни странно, у меня ничего не прыгало
Lord Warlock (2003-04-09 10:50:00) [5]
> гончий (09.04.03 10:18)
Это Вы меня не смешите :)
B:=Table1.GetBookmark;
Table1.DisableControls;
Table1.First;
while not Table1.Eof do
Table1.Next;
Table1.GotoBookmark(B);
Table1.EnableControls;
Table1.FreeBookmark(B);
Johnmen (2003-04-09 10:47:00) [6]Ок, мылю...:)
гончий (2003-04-09 10:39:00) [7]Удалено модератором
Примечание: Личная переписка
гончий (2003-04-09 10:34:00) [8]Спасибо всем за "квалифицированную помощь":
Проблема у меня решилась путем добавления к наследнику от TCustomDbGrid пары методов:
//---------------------------------------------------------
{ FSaveMark: TBookmark; FStepMark: Integer; - поля Self Object }
procedure TDsCustomDBGrid.FreezeGrid;
var
IPos: Integer;
begin
if( FDataLink.Active )then
begin
FDataLink.DataSet.DisableControls;
FSaveMark := FDataLink.DataSet.GetBookmark;
IPos := VisibleRowCount div 2;
FStepMark := IPos - Row;
FDataLink.DataSet.MoveBy(FStepMark);
FSaveMark := FDataLink.DataSet.GetBookmark;
end;
end;
procedure TDsCustomDBGrid.UnFreezeGrid;
var
IPos: Integer;
begin
if( FDataLink.Active )then
begin
try
FDataLink.DataSet.GotoBookmark(FSaveMark);
FDataLink.DataSet.MoveBy(-FStepMark);
finally
FDataLink.DataSet.FreeBookmark(FSaveMark);
FDataLink.DataSet.EnableControls;
end;
end;
end;
//---------------------------------------------------------
Можно на основе этого написать пару внешних процедур для работы со стандартным гридом. Проверил работу на:
Paradox, dBase, Interbase, MySql & Interbase
Johnmen (2003-04-09 10:32:00) [9]Подкинуть сырца ?
Mike Kouzmine (2003-04-09 10:21:00) [10]>>решение должно быть одно для всех баз данных
Универсальное решение - прокладки на каждый день.
Тогда пиши свой грид. Если не хочешь, то придется спуститься на землю.
гончий (2003-04-09 10:19:00) [11]//-- точнее так --
GRID.DataSource.DataSet.DisableControls;
pMark := GRID.DataSource.DataSet.GetBookmark;
try
while( not GRID.DataSource.DataSet.Eof )do
begin
{...}
GRID.DataSource.DataSet.Next;
end;
finally
GRID.DataSource.DataSet.GotoBookmark(pMark);
GRID.DataSource.DataSet.FreeBookmark(pMark);
GRID.DataSource.DataSet.EnableControls;
end;
гончий (2003-04-09 10:18:00) [12]2 Lord Warlock - не смешите меня :)
GRID.DataSource.DataSet.DisableControls;
pMark := GRID.DataSource.DataSet.GetBookmark;
try
while( not GRID.DataSource.DataSet.Eof )do
begin
{...}
GRID.DataSource.DataSet.Next;
end;
finally
GRID.DataSource.DataSet.GotoBookmark(pMark);
GRID.DataSource.DataSet.FreeBookmark(pMark);
end;
Lord Warlock (2003-04-09 10:14:00) [13]
> гончий (09.04.03 10:00)
Значит не тот набор данных отключаешь.. DisableControls
вырубает все, связанное с отображением в любых контролах при любых действиях, в тч и при установке и переходу по закладкам
гончий (2003-04-09 10:14:00) [14]Mike Kouzmine - решение должно быть одно для всех баз данных, т.к. все наследники TDataSet подддерживают закладки, а курсор возвращается на место именно с их помощью. Я тут уже кое-что придумал, если получится покажу как :)
AlexSerp (2003-04-09 10:11:00) [15]Ну тогда создай НД в run-тайме (аналогичный, прикрученному к гриду) и бегай по нему, раз такая проблема, что грид дергается.
Mike Kouzmine (2003-04-09 10:05:00) [16]А конкретно, какая база? Для разных - разные решения. И каков смысл этой операции (вероятно есть другое решение)
гончий (2003-04-09 10:00:00) [17]2 AlexSerp - я так и делаю, но ведь при этом редко DbGrid остается неподвижным после установки закладки!
Соловьев (2003-04-09 09:56:00) [18]
> Клонировать таблицу не предлагать :)
RxMemoryData
AlexSerp (2003-04-09 09:54:00) [19]НД.DisableControls
после обработки встать на нужную запись
НД.EnableControls