Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите найти ошибку в деструкторе  (Прочитано 11009 раз)
0 Пользователей и 1 Гость смотрят эту тему.
grb1zli
Интересующийся

ua
Offline Offline

« : 16-12-2009 10:16 » 

Есть следующий код:
Код:
type
  StringGridForEnteringData=class(TStringGrid)
  public
    bFlagOfAddingAlternative: Boolean;
    bFlagOfEditingCell: Boolean;
    rowOfEditingCell: Integer;
    colOfEditingCell: Integer;
    EditingValue: String;
    constructor Create(Owner: TComponent);
    destructor Destroy();
    procedure StartEditCell(row, col: Integer);
    procedure EndOfEditingCell(row,col: Integer; const value: String);virtual;abstract;
    procedure SetEditText(ACol, ARow: Integer; const Value: String);override;
    function SelectCell(ACol, ARow: Longint): Boolean;override;
    procedure KeyPress(var Key: Char);override;
    procedure DoExit();override;
    procedure Clear();
end;

constructor StringGridForEnteringData.Create(Owner: TComponent);
begin
  inherited;
  Options:=Options+[goEditing,goColSizing];
  bFlagOfAddingAlternative:=false;
  bFlagOfEditingCell:=false;
  rowOfEditingCell:=-1;
  colOfEditingCell:=-1;
  EditingValue:='';
end;

destructor StringGridForEnteringData.Destroy();
begin
  inherited;//<-вылетает здесь
end;

type
  StringGridForEnteringDataMethod4=class(StringGridForEnteringData)
  public
    constructor Create(Owner: TComponent; Cell00: String; Captions: Array of String; dimension: Integer);
    destructor Destroy();
    procedure EndOfEditingCell(row,col: Integer; const value: String);override;
end;

constructor StringGridForEnteringDataMethod4.Create(Owner: TComponent; Cell00: String; Captions: Array of String; dimension: Integer);
var i: Integer;
begin
  inherited Create(Owner);
      FixedRows:=1;
      FixedCols:=1;
      ColCount:=dimension+1;
      RowCount:=dimension+1;
      Cells[0,0]:=cell00;
      for i:=0 to dimension-1 do
      begin
        Cells[i+1,0]:=Captions[i];
        Cells[0,i+1]:=Captions[i];
      end;
end;

destructor StringGridForEnteringDataMethod4.Destroy();
begin
  inherited;
end;

Вопрос такой, почему, если во время редактирования Grid-a типа StringGridForEnteringDataMethod4 вызвать деструктор, то программа вылетает c ошибкой Access violation at address 0000000?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-12-2009 10:34 » 

а код правильно написан?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
grb1zli
Интересующийся

ua
Offline Offline

« Ответ #2 : 16-12-2009 10:40 » 

Что именно ты имеешь под словом правильно???
Деструктор срабатывает правильно, если Grid не редактируется.

В принципе, вот самораспаковующийся архив с программой, т.ч. смотрите!!!

* Программы по курсу СМПР.exe (320.79 Кб - загружено 815 раз.)
« Последнее редактирование: 16-12-2009 12:37 от grb1zli » Записан
grb1zli
Интересующийся

ua
Offline Offline

« Ответ #3 : 16-12-2009 14:59 » 

Ну дайте хоть кто-нибудь любую дельную идею...
Записан
zubr
Гость
« Ответ #4 : 16-12-2009 16:46 » 

1-я дельная идея - почитать литературу по ООП Object Pascal.
2-я дельная идея (подсказка) -
Код:
constructor StringGridForEnteringData.Create(Owner: TComponent);
begin
  inherited; //ошибка
3-я дельная идея - виртуальные методы Create, Destroy в твоем случае надо переопределять (constructor Create(Owner: TComponent); override;)
Записан
grb1zli
Интересующийся

ua
Offline Offline

« Ответ #5 : 16-12-2009 19:31 » 

Спасибо, большое за идеи!!!
Просто я всего неделю, как увидел Делфи в глаза и все мои знания полученны путем встроенной справки в Делфи и хороших знаний в С++. А время очень поджимает.Еще раз спасибо...
Записан
grb1zli
Интересующийся

ua
Offline Offline

« Ответ #6 : 18-12-2009 21:59 » 

zubr, если тебе не сложно объяснить, как в делфи происходит создание экземпляров класса!!!Для меня немного дико, что конструктор может быть виртуальным...
Вопросы конктретно такие:
В какой момент происходит выделение памяти под объект???
В какой момент происходит выделение памяти под объект при наследовании???
В какой момент и в каком порядке происходит инициализация классов-родителей???
И вопрос не по теме:В делфи нет множественного наследования,просто я не в одном источнике не нашел информацию на эту тему...
Помоги, пожалуйста, или дай название толковой книги по Object Pascal...Спасибо заранее!!!
Записан
zubr
Гость
« Ответ #7 : 18-12-2009 22:23 » 

1. В Delphi все классы порождаются от TObject.
2. Объекты в Delphi - это указатели и создаваться могут только динамически в отличие от C++, где объекты могут создаваться как динамически, так и статически.
3. Выделение памяти под объект осуществляется по выполнению метода-конструктора.
4. При наследовании инициализация объекта родителя происходит по выполнению метода-конструктора, перед которым стоит ключевое слово inherited. Можешь это сам проверить в отладке.
5. Если метод виртуальный, но тебе не нужно, чтобы выполнялся метод родителя, то inherited не указывается.
6. В Delphi нет множественного наследования. Но если очень хочется, то можно, используя интерфейсы.

Неплохая книга по Delphi - Пачеко К.Delphi5.Руководство разработчика. (можно найти в сети даже с примерами)
Хз, может сейчас есть и что нибудь по новее.
Записан
grb1zli
Интересующийся

ua
Offline Offline

« Ответ #8 : 19-12-2009 11:26 » 

Спасибо.Все разобрался!!!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines