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;
}

Заранее благодарю.
Re: Delphi 7, cxGrid(Developer Express) - как убить колонк
От: Аноним  
Дата: 10.07.07 06:50
Оценка:
Здравствуйте, 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;
Re[2]: не прокатывает
От: oktogen  
Дата: 10.07.07 07:20
Оценка:
Попробовал.
А>А> 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.
Re[3]: не прокатывает
От: Аноним  
Дата: 10.07.07 08:58
Оценка:
Здравствуйте, 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;
Re[4]: не прокатывает, @#@~&!
От: oktogen  
Дата: 11.07.07 07:49
Оценка:
Перепробовал все вариации циклов, .free . destroy
С этими фенечками
MyGridView.EndUpdate;
MyGridView.BeginUpdate;

и без них.
Даже MyGridView.ClearItems; выдает ошибку Invalid Pointer Operator.
Кто что посоветует?
Re[5]: не прокатывает, @#@~&!
От: Аноним  
Дата: 11.07.07 08:43
Оценка:
Здравствуйте, oktogen, Вы писали:

O> Перепробовал все вариации циклов, .free . destroy

O>С этими фенечками
MyGridView.EndUpdate;
MyGridView.BeginUpdate;

и без них.
O>Даже MyGridView.ClearItems; выдает ошибку Invalid Pointer Operator.
O>Кто что посоветует?

Проблема в чём-то другом. Где у тебя грид находится? На фрейме или на форме?
Либо вид грида MyGridView уже удалён, либо у тебя какая-то старая версия девэкса.
Re[6]: Уточнение
От: oktogen  
Дата: 11.07.07 09:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Проблема в чём-то другом. Где у тебя грид находится? На фрейме или на форме?

Форма, правда она унаследована от предыдущей формы(но все названия уникальны).
А>Либо вид грида MyGridView уже удалён, либо у тебя какая-то старая версия девэкса.
Я трассировал это место.
До операции удаления счетчик MyGridView.ColumnCount показывал, что все поля существуют.
MyGridView.Columns[i] по всему массиву показывает ([csInheritable]).
Пробовал обращаться к разным переменным, вроде названия поля MyGridView.Columns[i].Name
Везде получал правильные, корректные значения. Поля однозначно существуют.
Везде получал осмысленные результаты.
MyGridView нигде не удаляется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.