![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Есть свой компонент, унаследован от панели,он создается динамически,а при удаление выдает ошибку 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);
... |
|
#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. |