![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
Ошибка вылетает только при сохранении?