Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Destructor для наследника TComboBox


snake1977 ©   (2004-11-16 18:13:00) 

Здравствуйте!! подскажите в чем заключается ошибка. Сделал наследника от TComboBox, переопределил для него destructor
в этом деструкторе пытаюсь сохранить список Items в файл, но программа выдает на эксепшн при обращении к Items.Count

вот кусок исходника
TINIComboBox = class(TComboBox)
....
public
constructor Create(AOwner:TComponent); override;
Destructor Destroy;
Procedure SaveList;
....

Procedure TINIComboBox.SaveList;
...
 for i:=0 to Items.Count-1 do  //вот тут вылетает экспешн :(
  Begin
   ini.WriteString(FINISectionName,items[i],'');
  End;
....
End;

Destructor TINIComboBox.Destroy;
Begin
SaveList;
inherited;
End;


snake1977   (2004-11-17 08:37:00) [1]

когда сделал наследника от TCustomCombobox, то ошибки более не возникало :)
а почему???
в чем прикол то??


novice_man   (2004-11-16 20:00:00) [2]

program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1},
 INIComboBox in '..\Lib\INIComboBox.pas',  !!!!!
 StdCtrls in '..\Source\Vcl\StdCtrls.pas'; !!!!!

.....................

unit Unit1;

interface
..................
..................

var
 Form1: TForm1;
 INIComboBox: TINIComboBox;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
INIComboBox := TINIComboBox.Create(Form1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
INIComboBox.Destroy; <<-- бреакпоинт здесь
end;

и попробуй пошагово и увидишь где ошибка.


novice_man   (2004-11-16 19:30:00) [3]

Читать TINIComboBox = class(TCustomComboBox)
вместо TINIComboBox   TComboBox= class(TCustomComboBox)
Сорри.


novice_man   (2004-11-16 19:27:00) [4]

Может так сделать:
TINIComboBox   TComboBox = class(TCustomComboBox)
 public
   constructor Create(AOwner:TComponent);override;
   Destructor Destroy; override;
   Procedure SaveList;
 published
   property AutoComplete default True;
   property AutoDropDown default False;
   property BevelEdges;
   property BevelInner;
   property BevelKind default bkNone;
   property BevelOuter;
   property Style;
   property Anchors;
   property BiDiMode;
   property CharCase;
   property Color;
   property Constraints;
   property Ctl3D;
   property DragCursor;
   property DragKind;
   property DragMode;
   property DropDownCount;
   property Enabled;
   property Font;
   property ImeMode;
   property ImeName;
   property ItemHeight;
   property ItemIndex default -1;
   property MaxLength;
   property ParentBiDiMode;
   property ParentColor;
   property ParentCtl3D;
   property ParentFont;
   property ParentShowHint;
   property PopupMenu;
   property ShowHint;
   property Sorted;
   property TabOrder;
   property TabStop;
   property Text;
   property Visible;
   property OnChange;
   property OnClick;
   property OnCloseUp;
   property OnContextPopup;
   property OnDblClick;
   property OnDragDrop;
   property OnDragOver;
   property OnDrawItem;
   property OnDropDown;
   property OnEndDock;
   property OnEndDrag;
   property OnEnter;
   property OnExit;
   property OnKeyDown;
   property OnKeyPress;
   property OnKeyUp;
   property OnMeasureItem;
   property OnSelect;
   property OnStartDock;
   property OnStartDrag;
   property Items;
 end;
........................


snake1977   (2004-11-16 19:24:00) [5]

послал вот сюда novice_man@rambler.ru


snake1977   (2004-11-16 19:20:00) [6]

К стати если не делать компонент
а просто объявить клас наследник в проекте, и сделать объект этого класса,то все работает на ура
т.е. проблемма, только если это компонент :(


novice_man   (2004-11-16 19:19:00) [7]

Исходники не приехали :(


novice_man   (2004-11-16 19:18:00) [8]

Добавь модуль не автоматически а в ручную:
program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1},
 StdCtrls in '..\..\program files\borland\delphi6\source\vcl\StdCtrls.pas';

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

Тогда он пойдет в StdCtrls.pas.


snake1977   (2004-11-16 19:06:00) [9]

не работает там breakpoint в StdCtrls


novice_man   (2004-11-16 18:57:00) [10]

Попробуй открыть сорци TComboBox и поставь в деструктор брекпоинт и посмотри что получится. Когда попадешь в деструктор TComboBox.


snake1977   (2004-11-16 18:52:00) [11]

очень интересно....
я именно так и сделал :(

деструктор вначале делает все свои дела, а потмо вызывает деструктор предка.

в дебагере при установке курсора на
Items.Count-1  он пишет что delphi exception at ......

получается что деструктор Combobox вызван перед моим??!!


novice_man   (2004-11-16 18:50:00) [12]

Самое интересное нигде не встречал коментарии к этому .... Из этого правила есть исключения, однако вряд ли вам придется столкнуться с ними на практике.


novice_man   (2004-11-16 18:47:00) [13]

Пока только вот это:

Переопределяя деструктор, очень важно освободить все распределенные данным компонентом ресурсы до того, как будет вызван унаследованный деструктор:  
 
   
destructor TMyComponent.Destroy;  
begin
 ..................
 ..................
 ..................
 inherited Destroy;  
end;

Вот простое, но удобное правило: в переопределенном конструкторе первым вызывается унаследованный конструктор, а в переопределенном деструкторе, наоборот, унаследованный деструктор вызывается последним. Соблюдение этого правила гарантирует, что класс будет корректно настроен перед его модификацией, и все связанные с ним ресурсы будут освобождены перед завершением работы с этим классом. Из этого правила есть исключения, однако вряд ли вам придется столкнуться с ними на практике.


snake1977   (2004-11-16 18:44:00) [14]

выслал
всетаки, че это может быть то ?? :(


novice_man   (2004-11-16 18:40:00) [15]

> snake1977

Можешь выслать на мыло код?


snake1977   (2004-11-16 18:30:00) [16]

ругается, что INICombobox1 has no parent control


snake1977   (2004-11-16 18:26:00) [17]

угу при сохранении
а override не помогает


novice_man   (2004-11-16 18:17:00) [18]


constructor Create(AOwner:TComponent); override;
Destructor Destroy; overrideтак лучше
Procedure SaveList;


Ошибка вылетает только при сохранении?


Наверх

Титульная страница Поиск, карта сайта Написать письмо