Форум: "Базы";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизКак заморозить TDbGrid? Найти похожие ветки
← →
гончий (2003-04-09 09:48) [0]Необходимо отключить его от базы, пробежаться по таблице, вернуть курсор на исходное место с помощью закладки и снова подключить его. Но если запись до навигации была не в середине видимых рядов, то грид после подключения дергается. Нужно чтобы было незаметно, что выполнялась навигация по таблице. Клонировать таблицу не предлагать :)
← →
AlexSerp (2003-04-09 09:54) [1]НД.DisableControls
после обработки встать на нужную запись
НД.EnableControls
← →
Соловьев (2003-04-09 09:56) [2]
> Клонировать таблицу не предлагать :)
RxMemoryData
← →
гончий (2003-04-09 10:00) [3]2 AlexSerp - я так и делаю, но ведь при этом редко DbGrid остается неподвижным после установки закладки!
← →
Mike Kouzmine (2003-04-09 10:05) [4]А конкретно, какая база? Для разных - разные решения. И каков смысл этой операции (вероятно есть другое решение)
← →
AlexSerp (2003-04-09 10:11) [5]Ну тогда создай НД в run-тайме (аналогичный, прикрученному к гриду) и бегай по нему, раз такая проблема, что грид дергается.
← →
гончий (2003-04-09 10:14) [6]Mike Kouzmine - решение должно быть одно для всех баз данных, т.к. все наследники TDataSet подддерживают закладки, а курсор возвращается на место именно с их помощью. Я тут уже кое-что придумал, если получится покажу как :)
← →
Lord Warlock (2003-04-09 10:14) [7]
> гончий (09.04.03 10:00)
Значит не тот набор данных отключаешь.. DisableControls
вырубает все, связанное с отображением в любых контролах при любых действиях, в тч и при установке и переходу по закладкам
← →
гончий (2003-04-09 10:18) [8]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;
← →
гончий (2003-04-09 10:19) [9]//-- точнее так --
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;
← →
Mike Kouzmine (2003-04-09 10:21) [10]>>решение должно быть одно для всех баз данных
Универсальное решение - прокладки на каждый день.
Тогда пиши свой грид. Если не хочешь, то придется спуститься на землю.
← →
Johnmen (2003-04-09 10:32) [11]Подкинуть сырца ?
← →
гончий (2003-04-09 10:34) [12]Спасибо всем за "квалифицированную помощь":
Проблема у меня решилась путем добавления к наследнику от 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
← →
гончий (2003-04-09 10:39) [13]Удалено модератором
Примечание: Личная переписка
← →
Johnmen (2003-04-09 10:47) [14]Ок, мылю...:)
← →
Lord Warlock (2003-04-09 10:50) [15]
> гончий (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);
← →
Lord Warlock (2003-04-09 10:53) [16]или если угодно, так
with DBGrid1.DataSource.DataSet do
begin
B:=GetBookmark;
DisableControls;
First;
while not Eof do
Next;
GotoBookmark(B);
EnableControls;
FreeBookmark(B);
end;
как ни странно, у меня ничего не прыгало
← →
гончий (2003-04-09 10:57) [17]Lord Warlock - установи перед вызовом процедуры, курсор на верхнюю запись в гриде, подальше от центра и выполни процедуру. после ее выполнения, ряд, на котором установится курсор будет уже не верхним в гриде, а посередине.
← →
Lord Warlock (2003-04-09 11:11) [18]
> гончий (09.04.03 10:57)
Ну понятно. Без лишней писанины можно использовать предложение
AlexSerp ©, только создать не присоединенный к контролам набор данных не run-time, а постоянно.
← →
гончий (2003-04-09 11:20) [19]Lord Warlock - это не проще, если в таблице lookup | calc - поля, она фильтруется, или, что еще хуже изменяется динамически
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c