Здравствуйте, уважаемые форумчане. У меня такая проблема, бьюсь вторые сутки.
Есть таблица, в которой меняется набор колонок в процессе работы программы.
Нужно удалять старые колонки и создавать новые. Создается все нормально,
но когда доходит дело до пересоздания всего набора колонок, то при попытке освободить
память оператором free. выскакивает ошибка типа "Invalid pointer operation".
Испробовал все.
Пробовал удалять непосредственно из компонента, пробовал из массива указателей на колонки.
Пробовал MyGridView.ClearItems;
Пробовал также так:
MyGridView.BeginUpdate;
// далее убиваю старые колонки и создаю новые
MyGridView.EndUpdate;
Эфект не изменился. Поиск по форумам и в интернете облегчения не принес.
Прилагаю код создания колонок и код очистки. Заранее спасибо за помощь.
// *******************************************Создание**********************
KMCol: array of TcxGridDBColumn;// Список колонок, объявлен в классе
// В цикле вставлен этот кусок кода
// создаем колонку с галками
SetLength(KMCol, Length(KMCol)+1 );
i:=Length(KMCol) -1;
KMCol[i]:=MyGridView.CreateColumn;
KMCol[i].PropertiesClassName :='TcxCheckBoxProperties';
KMCol[i].DataBinding.FieldName:=FieldCheckedName;
KMCol[i].Name :=FieldCheckedName;
TcxCheckBoxProperties(KMCol[i].Properties).OnChange := Nil;
TcxCheckBoxProperties(KMCol[i].Properties).NullStyle := nssInactive;
// Названия и значения
SetLength(KMCol, Length(KMCol)+1 );
i:=Length(KMCol) -1;
KMCol[i]:=MyGridView.CreateColumn;
KMCol[i].PropertiesClassName :='TcxLabelProperties';
KMCol[i].DataBinding.FieldName:=FieldName;
KMCol[i].Name :=FieldName;
TcxCheckBoxProperties(KMCol[i].Properties).OnChange := Nil;
TcxCheckBoxProperties(KMCol[i].Properties).NullStyle := nssInactive;
TcxLabelProperties(KMCol[i].Properties).ReadOnly:= true;
//типы точки
SetLength(KMCol, Length(KMCol)+1 );
i:=Length(KMCol) -1;
KMCol[i]:=MyGridView.CreateColumn;
KMCol[i].PropertiesClassName :='TcxLabelProperties';
KMCol[i].DataBinding.FieldName:=fieldStatusName;
KMCol[i].Name :=fieldStatusName;
TcxCheckBoxProperties(KMCol[i].Properties).OnChange := Nil;
TcxCheckBoxProperties(KMCol[i].Properties).NullStyle := nssInactive;
TcxLabelProperties(KMCol[i].Properties).ReadOnly:= true;
И проблемный код.
// *******************************************удаление**********************
for i :=0 to length(KMCol) -1 do
begin
KMCol[i].Free; //вылет с ошибкой
end;
SetLength(KMCol ,0);
{ // тоже не помогло
MyGridView.BeginUpdate;
for i :=0 to MyGridView.ColumnCount -1 do
begin
MyGridView.Columns[i].Free;
end;
MyGridView.EndUpdate;
}
Заранее благодарю.
Здравствуйте, oktogen, Вы писали:
// тоже не помогло
MyGridView.BeginUpdate;
for i :=0 to MyGridView.ColumnCount -1 do
begin
MyGridView.Columns[i].Free;
end;
MyGridView.EndUpdate;
O>Заранее благодарю.
Эх ты, убиватель колонок..
Когда убиваешь колонку — колонок в списке становится на одну меньше.
Соответственно и убивать их надо либо в обратном порядке
for i := MyGridView.ColumnCount - 1 downto 0 do
MyGridView.Columns[i].Free;
Либо убивать всегда нулевую колонку:
while MyGridView.ColumnCount > 0 do
MyGridView.Columns[0].Free;
Попробовал.
А>А> for i := MyGridView.ColumnCount — 1 downto 0 do
А> MyGridView.Columns[i].Free;
А>
Invalid pointer operation.
А>Либо убивать всегда нулевую колонку:
А>А> while MyGridView.ColumnCount > 0 do
А> MyGridView.Columns[0].Free;
А>
Invalid pointer operation.
Здравствуйте, oktogen, Вы писали:
O>Попробовал.
А>>А> for i := MyGridView.ColumnCount — 1 downto 0 do
А>> MyGridView.Columns[i].Free;
А>>
O>Invalid pointer operation.
А>>Либо убивать всегда нулевую колонку:
А>>А> while MyGridView.ColumnCount > 0 do
А>> MyGridView.Columns[0].Free;
А>>
O>Invalid pointer operation.
А у меня всё работает. Вот тебе пример даже с бандами:
for i:=cxGridMaReportDBBandedTableView1.Bands.Count-1 downto 0 do
begin
for k:= cxGridMaReportDBBandedTableView1.Bands[i].ColumnCount-1 downto 0 do
cxGridMaReportDBBandedTableView1.Bands[i].Columns[k].Destroy;
cxGridMaReportDBBandedTableView1.Bands[i].Destroy;
end;

Перепробовал все вариации циклов, .free . destroy
С этими фенечками
MyGridView.EndUpdate;
MyGridView.BeginUpdate;
и без них.
Даже MyGridView.ClearItems; выдает ошибку Invalid Pointer Operator.
Кто что посоветует?
Здравствуйте, oktogen, Вы писали:
O>
Перепробовал все вариации циклов, .free . destroy
O>С этими фенечками
MyGridView.EndUpdate;
MyGridView.BeginUpdate;
и без них.
O>Даже MyGridView.ClearItems; выдает ошибку Invalid Pointer Operator.
O>Кто что посоветует?
Проблема в чём-то другом. Где у тебя грид находится? На фрейме или на форме?
Либо вид грида MyGridView уже удалён, либо у тебя какая-то старая версия девэкса.