|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
EaccessViolation при удаление дин. компанента
Есть свой компонент, унаследован от панели,он создается динамически,а при удаление выдает ошибку EAccessViolation вот место удаления
Код:
procedure TForm2.TabClose(Sender: TObject); var i,l:integer; begin l:=TButton(Sender).Parent.Left; if (l<>1) then begin addPage.Left:=addPage.Left-150; //ñäâèãàåì êíîïêó " íîâàÿ âêëàäêà" BallPage.Left:=BallPage.Left-150; //ñäâèãàåì êíîïêó " îñòàëüíûå âêëàäêà" for i:=0 to wbhead.ComponentCount-1 do begin if(wbhead.Components[i].Tag<>0) and (TPanel(wbhead.Components[i]).Left>l) then TPanel(wbhead.Components[i]).left:=TPanel(wbhead.Components[i]).left-150; end; end; // TChromium(activepage.GetBros).Free; TButton(Sender).Free; if activepage=TmyTabPanel(Sender).Parent then activepage:=nil; TmyTabPanel(Sender).Parent.Destroy;//ВОТ ТУТ САМА ОШИБКА free тоже самое выдает end; вот код компонента Код:
unit myTabPanel; interface uses SysUtils, Classes, Controls, ExtCtrls,StdCtrls; type TmyTabPanel = class(TPanel) private FInd:string; FAdress:string; FBrow:TObject; { Private declarations } protected { Protected declarations } public { Public declarations } constructor Create (AOwner:TComponent);override; destructor Destroy ();override; //destructor Destroy published property Ind:string read FInd write FInd; property Adress:string read FAdress write FAdress; procedure SetBrows(obj:TObject); function GetBros:TObject; { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('MyComp', [TmyTabPanel]); end; { TmyTabPanel } constructor TmyTabPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TmyTabPanel.Destroy; begin FBrow.Free; inherited; end; function TmyTabPanel.GetBros: TObject; begin Result:=FBrow; end; procedure TmyTabPanel.SetBrows(obj: TObject); begin FBrow:=obj; end; end. |
#2
|
||||
|
||||
А так поможет?
Код:
var mtp : TmyTabPanel; ... mtp := TmyTabPanel(Sender).Parent; if Assigned(mtp) then FreeAndNil(mtp); ... Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
Все равно выдает ошибку, и да забыл сказать, после ошибки у меня открывается код проекта, не UnitX а Project1 где прописывается создание форм, и ругается на последний end; я так полагаю это что то да значит?
|
#4
|
|||
|
|||
А это что ?
Код:
TButton(Sender).Free; // здесь Sender удаляем // а затем пытаемся что-то из него вытащить // причём Sender уже TmyTabPanel if activepage=TmyTabPanel(Sender).Parent then activepage:=nil; TmyTabPanel(Sender).Parent.Destroy; |
#5
|
||||
|
||||
Да это я уже переделал, теперь вот так удаляю
Код:
TmyTabPanel(TmyTabPanel(Sender).Parent).Destroy; Строчка так себе выглядит,вообщем суть в том что клик происходит по кнопке,а удалить надо её родителя её родитель это и есть TMyTabPanel На данный момент не может удалиться почему то именно 3 вкладка( так же ошибка вылетает) но я так полагаю что это уже ошибка не в тут,а где то в другом месте |
#6
|
|||
|
|||
Может быть всё-таки так
Код:
TButton(Sender).Parent.Free; Когда удаляешь TmyTabPanel, то удаляется и всё, что на нём лежит, в том числе и эта самая кнопка. Затем приходит MouseUp в уже несуществующую кнопку. |
#7
|
|||
|
|||
1. Кто Owner у компонента?
2. Кто Owner у parent'a компонента? 3. С какой такой радости вы приводите приводите Sender'a сначала к TButton, потом его удаляем, потом приводим к TmyTabPanel??? Во первых если вы его удалили то больше его не трогаем. Во вторых где проверка типов??? Еще есть одна особенность, про которую многие просто не знают: при destroy'е компонента наследуемого от TWinControl - destroy'яться все компоненты у которых от указан parent'ом. По этому - у вас ошибка не столько в коде, как в логике работы приложения. Event - это процедура что выполняется компонентом, а дестроить компонент в своем же коде(кроме деструктора) категорически НЕЛЬЗЯ!!! Если логику поменять на нормальную не получается можно попробовать обойти это через POSTMESSAGE, отловить его другим компонентом и уже в нем уничтожить наш компонент, но это уже совсем другая история)) P.S. Мануал вам по меседжам в помощь)) Последний раз редактировалось M.A.D.M.A.N., 01.04.2014 в 15:33. |