Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.02.2014, 22:56
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию 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  
Старый 17.02.2014, 23:45
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А так поможет?
Код:
var
  mtp : TmyTabPanel;
...
  mtp := TmyTabPanel(Sender).Parent;
  if Assigned(mtp) then
    FreeAndNil(mtp);
...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 18.02.2014, 11:03
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Все равно выдает ошибку, и да забыл сказать, после ошибки у меня открывается код проекта, не UnitX а Project1 где прописывается создание форм, и ругается на последний end; я так полагаю это что то да значит?
Ответить с цитированием
  #4  
Старый 18.02.2014, 11:15
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А это что ?
Код:
 
TButton(Sender).Free;    // здесь Sender удаляем
// а затем пытаемся что-то из него вытащить
// причём Sender уже TmyTabPanel
 if activepage=TmyTabPanel(Sender).Parent then activepage:=nil;
     TmyTabPanel(Sender).Parent.Destroy;
Ответить с цитированием
  #5  
Старый 18.02.2014, 13:53
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Да это я уже переделал, теперь вот так удаляю
Код:
TmyTabPanel(TmyTabPanel(Sender).Parent).Destroy;

Строчка так себе выглядит,вообщем суть в том что клик происходит по кнопке,а удалить надо её родителя её родитель это и есть TMyTabPanel
На данный момент не может удалиться почему то именно 3 вкладка( так же ошибка вылетает) но я так полагаю что это уже ошибка не в тут,а где то в другом месте
Ответить с цитированием
  #6  
Старый 18.02.2014, 16:16
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Может быть всё-таки так
Код:
TButton(Sender).Parent.Free;
Тут возможно происходит такая ситуация.
Когда удаляешь TmyTabPanel, то удаляется и всё, что на нём лежит, в том числе и эта самая кнопка.
Затем приходит MouseUp в уже несуществующую кнопку.
Ответить с цитированием
  #7  
Старый 01.04.2014, 12:01
Freezer_86 Freezer_86 вне форума
Прохожий
 
Регистрация: 01.04.2014
Сообщения: 1
Версия Delphi: Delphi XE2
Репутация: 10
По умолчанию

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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter