Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.28;
Скачать: CL | DM;

Вниз

Как заморозить 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
4-91590
Nimda2000
2003-03-02 15:49
2003.04.28
Кодировка


3-91192
AleksandrKu
2003-04-09 17:06
2003.04.28
Query дублирует записи как от этого избавиться


1-91369
Тундра
2003-04-16 07:17
2003.04.28
ExcelApplication


1-91351
Andr_Volk
2003-04-16 05:43
2003.04.28
удалить из файла


14-91457
Armageddon
2003-04-11 23:57
2003.04.28
Програмное добавление данных.