Форум: "Основная";
Текущий архив: 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