Delphi 7, cxGrid(Developer Express) - как убить колонки?
От: oktogen  
Дата: 10.07.07 06:41
Оценка:
Здравствуйте, уважаемые форумчане. У меня такая проблема, бьюсь вторые сутки.
Есть таблица, в которой меняется набор колонок в процессе работы программы.
Нужно удалять старые колонки и создавать новые. Создается все нормально,
но когда доходит дело до пересоздания всего набора колонок, то при попытке освободить
память оператором 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;
}

Заранее благодарю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.