Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 13.02.2018, 22:49   #1
exyl
Форумчанин
 
Регистрация: 15.11.2014
Сообщений: 75
Репутация: 35
По умолчанию Закрытие динамически созданной вкладки

Доброго вечера.
Есть динамически создаваемые вкладки типа TTabSheet на пэйджконтроле. На вкладках есть панелька, на ней несколько кнопок, все это тоже создается динамически. Одна из кнопок закрывает вкладку, на которой находится:

Код:

(((Sender as TButton).Owner as TPanel).Owner as TTabSheet).Free;

Все это работает вроде бы правильно, но уже после закрытия вылетает акцесс виолейшн.
Конкретно в Vcl.Controls на строке:
Код:

with FTouchManager do
          if (GestureEngine <> nil) and (efMouseEvents in GestureEngine.Flags) then
            GestureEngine.Notification(Message);

Это Делфи 10.2.

Т.е. теоретически можно код обработчика кнопки обернуть в try ... except ... end, и при эксепте просто пропускать этот эррор мимо ушей, но это тот еще костыль. Поэтому закономерный вопрос: а как правильно закрывать вкладку, чтоб ошибки такие не ловить?

Последний раз редактировалось exyl; 13.02.2018 в 22:52.
exyl вне форума   Ответить с цитированием
Старый 13.02.2018, 23:13   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,782
Репутация: 6211
По умолчанию

Parent сделай вместо Owner. А ваще не хорошо в том числе и себя убивать из своего же метода, я бы пользовательское сообщение послал и уже в нем уничтожил
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.02.2018 в 23:18.
Аватар вне форума   Ответить с цитированием
Старый 13.02.2018, 23:50   #3
exyl
Форумчанин
 
Регистрация: 15.11.2014
Сообщений: 75
Репутация: 35
По умолчанию

Попробовал Parent. Та же самая история. А что там по сообщениям? Пример под рукой есть?
exyl вне форума   Ответить с цитированием
Старый 13.02.2018, 23:57   #4
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,648
Репутация: 2371

icq: 100500
skype: kick-ass
По умолчанию

Вместо
Код:

(((Sender as TButton).Owner as TPanel).Owner as TTabSheet).Free;

пиши
Код:

PageControl.ActivePage.Free();

__________________
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума   Ответить с цитированием
Старый 14.02.2018, 00:09   #5
exyl
Форумчанин
 
Регистрация: 15.11.2014
Сообщений: 75
Репутация: 35
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Вместо
Код:

(((Sender as TButton).Owner as TPanel).Owner as TTabSheet).Free;

пиши
Код:

PageControl.ActivePage.Free();

Не выйдет. Процедура клика по кнопке находится в модуле, который понятия не имеет что там за пейдж контрол и на какой он форме.
exyl вне форума   Ответить с цитированием
Старый 14.02.2018, 00:24   #6
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,648
Репутация: 2371

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
Сообщение от exyl Посмотреть сообщение
Не выйдет. Процедура клика по кнопке находится в модуле, который понятия не имеет что там за пейдж контрол и на какой он форме.
Это чо, проблема? Сделай обаботчик клика кнопки методом формы, на которой PageControl находится. Или передавай указатель на PageControl в свойстве Tag кнопки.
Код:

procedure AnyClass.ButtonClick(Sender: TObject);
var
  cmp: TComponent absolute Sender;
  pc: TPageControl;
begin
  // может не работать в 64-битной версии проги, но это неточно.
  pc:= TPageControl(cmp.tag);
  pc.ActivePage.Free();
end;

Если кнопка 1хрен создаётся динамически, то можно вообще добавить в неё пару полей или методов.

Или ещё 100500 способов...
__________________
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума   Ответить с цитированием
Старый 14.02.2018, 00:45   #7
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,782
Репутация: 6211
По умолчанию

Код:

const SX_MYMESSAGE = WM_USER + 100;
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure SXMyMessage(var Msg: TMessage); message SX_MYMESSAGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SXMyMessage(var Msg: TMessage);
begin
  TTabSheet(Pointer(Msg.WParam)).Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle,SX_MYMESSAGE,DWORD((Sender as TButton).Parent.Parent),0);
end;

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 14.02.2018, 00:56   #8
exyl
Форумчанин
 
Регистрация: 15.11.2014
Сообщений: 75
Репутация: 35
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Это чо, проблема? Сделай обаботчик клика кнопки методом формы, на которой PageControl находится. Или передавай указатель на PageControl в свойстве Tag кнопки.
Код:

procedure AnyClass.ButtonClick(Sender: TObject);
var
  cmp: TComponent absolute Sender;
  pc: TPageControl;
begin
  // может не работать в 64-битной версии проги, но это неточно.
  pc:= TPageControl(cmp.tag);
  pc.ActivePage.Free();
end;

Опять акцесс виолейшн. Добавить-то не проблема, проблема, видимо, в том, что в любом случае клик будет по кнопке, которая будет уничтожать своего родителя.
Вообще говоря, когда я работал в 2007 версии, подобного не было, код функционировал без ошибок.

Аватар, спасибо, буду разбираться.
exyl вне форума   Ответить с цитированием
Старый 14.02.2018, 01:02   #9
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,782
Репутация: 6211
По умолчанию

Цитата:
код функционировал без ошибок
Повезло, случайно
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 14.02.2018, 01:30   #10
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,648
Репутация: 2371

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
Сообщение от exyl Посмотреть сообщение
Опять акцесс виолейшн. Добавить-то не проблема, проблема, видимо, в том, что в любом случае клик будет по кнопке, которая будет уничтожать своего родителя.
Не вижу связи.
Почему у меня-то работает? Что я делаю не так?
__________________
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размера динамически созданного StringGrid на динамически созданной форме loom12 Общие вопросы Delphi 2 08.09.2014 15:35
Работа с динамически созданной формой Airou C++ Builder 1 12.07.2011 10:58
Прозрачность динамически созданной формы Lime Общие вопросы .NET 1 03.04.2010 16:25
Передать Title загружаемой страницы в Caption созданной вкладки PageControl-a Verst Общие вопросы Delphi 6 24.11.2009 02:43
Событие для динамически созданной Button Dogmat Помощь студентам 8 24.07.2008 12:44


08:29.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru