Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Удаление TstringGrid-a


Автор: AleksandraN 17.8.2009, 11:28
Всем, добрый день!
Суть проблемы:
У меня есть терево таблиц базы данных. С помошью мышки я вытягиваю таблицу на TImage, где создается TstringGrid, первый столбец которого заполнен полями таблицы....второй и третий столбец можно редактировать....
можно вытягивать несколько таблиц, так же рисуются системные связи между таблицами....удаление таблиц возможно с помощью контекстного меню
я использую массив этих таблиц :
Код

{поля таблиц}
 FieldsAtribTblType = record
  CLN : string; // наименование поля и разные другие нужные мне характеристики
  CLN_TYPE : integer;
  CLN_VALUE : string;
  CLN_ID : integer;
  NotNull : boolean;
  FK : integer;  // FK = -1 - поле не является внешним ключем, FK = 1 - является внешним ключем, надо рисовать плюсик,
  //FK = 0 - является внешним ключем, но уже прорисована связь, плюсик не рисуем, а заштриховываем ячейку
  PK : integer; //PK = 1 является внешним ключем, PK = 0 не является
end;
{таблицы}
 TableAtribTblType = record
  TBL : string; // наименование таблицы
  TBL_ID : integer;// идентификатор
  XCT : integer;  // координаты
  YCT : integer;
  FieldsCount : integer; // количество полей
  FieldsAtrib : array of FieldsAtribTblType; // поля
  MNL : integer; // нужная мне характеристика
  Table       : TStringGrid; // ну и сама таблица
end;


TableAtribTbl:TableAtribTblType;
Создаю TstringGrid так:
// в общем тут создаю гриды и заполняю значения
Код

   procedure TfrmSCREdit.TableDragDrop(Sender, Source: TObject; X,  Y: Integer);
var
   i, j, k, l, sum : integer;
begin
 if Source <> tvwSCR then
  if Source = tvwATBL then begin
    memHelp.Enabled := false;
    TableCount := TableCount + 1;
    SetLength(TableAtribTbl, TableCount);
    SetTabeAtrib(TableCount-1,Integer(tvwATBL.Selected.Data)); // заполняю массив полей
    TableAtribTbl[TableCount-1].Table := TStringGrid.Create(TComponent(Sender));
    TableAtribTbl[TableCount-1].Table.Parent := ScrollBox;
    TableAtribTbl[TableCount-1].Table.DragMode := dmAutomatic;
    TableAtribTbl[TableCount-1].Table.DragCursor := 1024;

    TableAtribTbl[TableCount-1].Table.OnDragOver := ImageDragOver ;
    TableAtribTbl[TableCount-1].Table.OnDrawCell := TableDrawCell;
    TableAtribTbl[TableCount-1].Table.OnMouseDown := TableMouseDown;
    TableAtribTbl[TableCount-1].Table.OnSelectCell := SelectCell;
    TableAtribTbl[TableCount-1].Table.OnDblClick := TableDblClick;
    TableAtribTbl[TableCount-1].Table.OnColumnResize := TableColumnResize;
    TableAtribTbl[TableCount-1].Table.OnMouseMove := TableMouseMove;
    TableAtribTbl[TableCount-1].Table.DragMode := dmManual;

    // работа с комбо-боксами
    //TableAtribTbl[TableCount-1].Table.DefaultRowHeight := cmbType.Height;

    TableAtribTbl[TableCount-1].Table.PopupMenu := ppmDelTable;
    TableAtribTbl[TableCount-1].Table.OnContextPopup := ContextPopupTable;
    TableAtribTbl[TableCount-1].Table.Top  := Y;
    TableAtribTbl[TableCount-1].Table.Left := X;
    TableAtribTbl[TableCount-1].XCT := X;
    TableAtribTbl[TableCount-1].YCT := Y;
    sum := 0;
    For l := 0 to TableCount-1 do begin
     If TableAtribTbl[TableCount-1].Tbl = TableAtribTbl[l].Tbl
      then sum := sum+1;
     end;
    If sum <= 1 then TableAtribTbl[TableCount-1].Table.Cells[1,0]:= TableAtribTbl[TableCount-1].Tbl
     else TableAtribTbl[TableCount-1].Table.Cells[1,0]:= TableAtribTbl[TableCount-1].Tbl+IntToStr(sum-1);
    TableAtribTbl[TableCount-1].Table.ColWidths[0] := 0;
    TableAtribTbl[TableCount-1].Table.ColWidths[3] := 150;
    TableAtribTbl[TableCount-1].Table.ColCount := 5;
    TableAtribTbl[TableCount-1].Table.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goRowSizing, goHorzLine{, goRangeSelect}, goColSizing, goRowMoving];
    if TableAtribTbl[TableCount-1].FieldsCount > 0 then begin
      for i := 1 to TableAtribTbl[TableCount-1].FieldsCount  do begin
         TableAtribTbl[TableCount-1].Table.Cells[1,i]:= TableAtribTbl[TableCount-1].FieldsAtrib[i-1].CLN;
         TableAtribTbl[TableCount-1].MNL := 0;
      end;
    TableAtribTbl[TableCount-1].Table.RowCount := TableAtribTbl[TableCount-1].FieldsCount;
     for i := 0 to TableAtribTbl[TableCount-1].Table.RowCount-1  do
      TableAtribTbl[TableCount-1].Table.RowHeights[i] := 15;
    end;
     TableAtribTbl[TableCount-1].Table.ColWidths[3]:= 50;
     TableAtribTbl[TableCount-1].Table.ColWidths[4]:= 20;
     TableAtribTbl[TableCount-1].Table.Width := TableAtribTbl[TableCount-1].Table.ColWidths[1]+TableAtribTbl[TableCount-1].Table.ColWidths[2]+TableAtribTbl[TableCount-1].Table.ColWidths[3]+TableAtribTbl[TableCount-1].Table.ColWidths[4]+10;
     TableAtribTbl[TableCount-1].Table.Height := TableAtribTbl[TableCount-1].Table.RowCount* (TableAtribTbl[TableCount-1].Table.RowHeights[1]+2);
     RebuildSystemRelations; // процедурка, которая связи рисует системные
   end else begin
    For j := 0 to TableCount-1 do
      If TStringGrid(Source) = TableAtribTbl[j].Table then k:= j;
    TableAtribTbl[k].Table.DefaultRowHeight := cmbType.Height;
    TableAtribTbl[k].Table.Top := Y;
    TableAtribTbl[k].Table.Left := X;
    TableAtribTbl[k].XCT := X;
    TableAtribTbl[k].YCT := Y;
    ReDrawTableRelations; // процедурка, которая рисует связи созданные вручную...
   end;

end;



в общем проблема в следующем...как я уже говорила, у StringGrid-a есть редактируемые поля... так вот, если поля эти поля поредактировать,  то при удалении таблицы возникает ошибка. Если не редактировать поля, то все впорядке.
Удаляю так:
 
Код

procedure TfrmSCREdit.pmiDelTableClick(Sender: TObject);
var Last, i, j, IdSender: integer;
    strFK, name : string; //список первичных ключей удаляемой таблицы
begin

  IdSender := -1;
  for i := 0 to TableCount -1 do
    if SenderTable = TableAtribTbl[i].Table then IdSender := i;


  TableAtribTbl[IdSender].Table.Destroy;

  Last:= high( TableAtribTbl );
  if IdSender <  Last then TableAtribTbl[IdSender] := TableAtribTbl[Last];
  setLength( TableAtribTbl, Last );
  TableCount := TableCount - 1;
  TablesRelation := nil;
  ReBuildSystemRelations;
  ReDrawTableRelations;

end;

 
Помогите, плиз, разобраться.

Автор: RockClimber 17.8.2009, 14:44
Самого главного нет, имхо. Текста сообщения об ошибке и номера строки, на которой она возникает.
А пока я бы усомнился в этом куске кода:
Код

IdSender := -1;
  for i := 0 to TableCount -1 do
    if SenderTable = TableAtribTbl[i].Table then IdSender := i;

  TableAtribTbl[IdSender].Table.Destroy;
Какова вероятность того, что на выходе из цикла переменная IdSender будет равна -1?
И еще: TableAtribTbl - это массив?

Автор: AleksandraN 17.8.2009, 14:56
Да, TableAtribTbl : array of TableAtribTblType; 
TableAtribTblType - описан выше...

IdSender на выходе точно <> -1 ...проверяла мого раз....

вылетает на строке TableAtribTbl[IdSender].Table.Destroy;

пишет что-то вроде:
" Project Classificator.exe raised exeption class Eaccess Violation with massage 'Access Violation at Adredd 00000 read of address 0000'"

Автор: RockClimber 17.8.2009, 15:39
C вероятностью, приближающейся к 100%, в этот момент
Код

TableAtribTbl[IdSender].Table = nil
Видимо, в какой-то момент до этого у вас теряется ссылка на таблицу и TableAtribTbl[IdSender].Table начинает указывать в пустоту...
Смотрите все участки кода, где TableAtribTbl[IdSender].Table присваивается значение...

Автор: Keeper89 17.8.2009, 17:09
В общем-то соглашусь с RockClimber
AleksandraN, прикрепил проект, посмотрите для примера - все работает.

З.Ы. Было бы замечательно, если бы выложили проект (если это не суперсекретная разработка), тогда можно было бы точно найти ошибку.

Автор: AleksandraN 18.8.2009, 11:32
Разработка не суперсекретная, но там много всего лишнего...куча форм....и без нашей базы думаю смысла не будет....хотя проект я бы выложила...авось получится, но весит он 10 мб...

Автор: Keeper89 18.8.2009, 11:40
AleksandraN, если можете выложить рабочую версию, которую можно будет запустить, выкладывайте smile например, вот http://turbobit.net.

Автор: AleksandraN 18.8.2009, 12:17
RockClimber,  так нет...без нашей базы данных ничего работать не будет....

Автор: AleksandraN 18.8.2009, 13:56
разобралась)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)