Всем, добрый день! Суть проблемы: У меня есть терево таблиц базы данных. С помошью мышки я вытягиваю таблицу на 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;
|
Помогите, плиз, разобраться. |