Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление TstringGrid-a 
V
    Опции темы
AleksandraN
Дата 17.8.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



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

 
Помогите, плиз, разобраться.
PM MAIL   Вверх
RockClimber
Дата 17.8.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



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

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

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


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
AleksandraN
Дата 17.8.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



Да, 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'"
PM MAIL   Вверх
RockClimber
Дата 17.8.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



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

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


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
Keeper89
Дата 17.8.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



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

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

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  StringGrid.rar 205,58 Kb


--------------------
PM MAIL WWW   Вверх
AleksandraN
Дата 18.8.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



Разработка не суперсекретная, но там много всего лишнего...куча форм....и без нашей базы думаю смысла не будет....хотя проект я бы выложила...авось получится, но весит он 10 мб...
PM MAIL   Вверх
Keeper89
Дата 18.8.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



AleksandraN, если можете выложить рабочую версию, которую можно будет запустить, выкладывайте smile например, вот тут.


--------------------
PM MAIL WWW   Вверх
AleksandraN
Дата 18.8.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



RockClimber,  так нет...без нашей базы данных ничего работать не будет....
PM MAIL   Вверх
AleksandraN
Дата 18.8.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



разобралась)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.