Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
9-1090961036
xdev
2004-07-28 00:43
2004.11.28
Как создать дугу между тремя точками в OpenGL


14-1100055330
Думкин
2004-11-10 05:55
2004.11.28
С днем рождения!


14-1100262319
ПЛОВ
2004-11-12 15:25
2004.11.28
Помогите придумать название...


10-1066225536
Guest
2003-10-15 17:45
2004.11.28
Нужна ли ССМ?


14-1100206583
ArMellon
2004-11-11 23:56
2004.11.28
Народ вот делаю чат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский