Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Destructor для наследника TComboBox   Найти похожие ветки 

 
snake1977   (2004-11-16 18:13) [0]

Здравствуйте!! подскажите в чем заключается ошибка. Сделал наследника от 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;


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


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


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


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

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


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

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


 
novice_man ©   (2004-11-16 18:40) [4]

> snake1977

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


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

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


 
novice_man ©   (2004-11-16 18:47) [6]

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

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

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


 
novice_man ©   (2004-11-16 18:50) [7]

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


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

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

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

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

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


 
novice_man ©   (2004-11-16 18:57) [9]

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


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

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


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

Добавь модуль не автоматически а в ручную:
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.


 
novice_man ©   (2004-11-16 19:19) [12]

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


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

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


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

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


 
novice_man ©   (2004-11-16 19:27) [15]

Может так сделать:
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;
........................


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

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


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

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;

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
1-1100587939
Vilux
2004-11-16 09:52
2004.11.28
Почему программа просто исчезает?


6-1095754729
needhelp
2004-09-21 12:18
2004.11.28
encoding


1-1100114788
Cardinal
2004-11-10 22:26
2004.11.28
Работа с потоками. Помогите!


3-1099464821
Iova
2004-11-03 09:53
2004.11.28
Как определить тип поля?


3-1098992137
GanibalLector
2004-10-28 23:35
2004.11.28
результат в ХП