cxGrid. Восстановление фильтров после переоткрытия датасета.

HaliamBaliam
Дата: 27.04.2011 17:12:04
Добрый вечер.
Вопрос заключается в следующем: Есть cxGrid без заранее созданных колонок. Динамчески, в зависимости от содержания сторонней таблицы, создаются колонки(количество колонок может меняться на ходу при добавлении записей в сторонней таблице). При изменении данных в cxGrid через ADOCommand разносятся данные по таблицам. После чего датасет требуется переоткрыть. При повторном открытии датасета и пересоздании колонок фильтр уничтожается.
Как перед закрытием датасета запомнить установленный пользователем фильтр и восстановить его после повторного открытия датасета?

на просторах был найден некий код
var
    AFilterControl: TcxFilterControl;
    AStream: TStream;
...
//сохранить
begin    
    AStream:=TMemoryStream.Create;
    AFilterControl := TcxFilterControl.Create(Self);
    AFilterControl.LinkComponent := GridDBTableView1;
    AFilterControl.SaveToStream(AStream);
    AFilterControl.Free;
...
//восстановить
    AFilterControl.LoadFromStream(AStream);
end;

Все бы замечательно, НО при попытки LoadFromStream(AStream) вылетает ошибка в модуле cxFilterControl access violation at address in module 'MyModule.exe' read of address 67A802BC
В идеале можно было бы переприсвоить фильтр через
AItemList.AddItem(DBTableView1Name, foLike, 'A%', 'A%');
однако для этого нужно иметь список старых фильтров по колонкам.
Подскажите куда смотреть.

З.Ы. Поиск юзал...
_IUnknown
Дата: 27.04.2011 18:09:20
HaliamBaliam

Выкинь этот код, полный изврат. Насколько я понял ты используешь встроенный фильтр в cxGrid, так и сохраняй в поток его и восстанавливай из потока, зачем юзать TcxFilerControl?

cxGrid.DataController.Filter.SaveToStream();
cxGrid.DataController.Filter.LoadFromStream();
HaliamBaliam
Дата: 27.04.2011 18:25:24
спасибо за ответ. Доберусь до компа обязательно попробую...
HaliamBaliam
Дата: 27.04.2011 21:00:38
Спасибо безымянному гостю за помощь!

Идею немного допилил с помощью сайта разработчиков девок
ссылка на топик разработчика

Итак, для всех страждущих, кто не мог найти решение данной проблемы...

...
Var AStream: TMemoryStream;
	OldFilterText: String;
	OldPosition: Integer;
	...
begin
	//сохраняем старый фильтр
	AStream:= TMemoryStream.Create;
	with cxGridDBTableView1.DataController.Filter do
	begin
		OldPosition := AStream.Position;
		SaveToStream(AStream);
		OldFilterText:= FilterText;
		Clear;
	end;
	...
	//восстановление фильтра
	if OldFilterText <> '' then
	with cxGridDBTableView1.DataController.Filter do
	begin
		Clear;
		AStream.Position := OldPosition;
		LoadFromStream(AStream);
		Active:= false;
		FilterText:= OldFilterText;
		Active:= true;
	end;
	AStream.Free;
	...
end;
Sergey Durmanov
Дата: 27.12.2011 00:28:38
HaliamBaliam
Спасибо безымянному гостю за помощь!

Идею немного допилил с помощью сайта разработчиков девок
ссылка на топик разработчика

Итак, для всех страждущих, кто не мог найти решение данной проблемы...

...
Var AStream: TMemoryStream;
	OldFilterText: String;
	OldPosition: Integer;
	...
begin
	//сохраняем старый фильтр
	AStream:= TMemoryStream.Create;
	with cxGridDBTableView1.DataController.Filter do
	begin
		OldPosition := AStream.Position;
		SaveToStream(AStream);
		OldFilterText:= FilterText;
		Clear;
	end;
	...
	//восстановление фильтра
	if OldFilterText <> '' then
	with cxGridDBTableView1.DataController.Filter do
	begin
		Clear;
		AStream.Position := OldPosition;
		LoadFromStream(AStream);
		Active:= false;
		FilterText:= OldFilterText;
		Active:= true;
	end;
	AStream.Free;
	...
end;


Этот пример не работает.
Поскольку прямой ввод условия в фильтр не поддерживается.
DimaBr
Дата: 27.12.2011 02:06:26
Sergey Durmanov

Спасибо что подсказал, а то мы уже все локти искусали с апреля месяца. У других то работает.