удаление активной закладки у PageControl1 [решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

удаление активной закладки у PageControl1 [решено]

Сообщение Zak » 02.09.2013 08:19:16

Прошу помощи в понимании того, как удалить активную закладку у PageControl

На форме form1 есть PageControl1
Закладки (tTabSheet) создаются динамически
в них пихаю, например контролы (tEdit и tButton)

Код: Выделить всё
procedure form1.newtab;
var
   tab      : tTabSheet;   
   wEdit   : tEdit;
   wClose   : tButton;
begin
   tab := tTabSheet.Create(PageControl1);
   with tab do begin
      PageControl := PageControl1;
      Width := PageControl1.Width;
      Height := PageControl1.Height;
      Caption := 'имя вкладки';
   end;
   
   //поле ввода
   wEdit := tEdit.Create(tab);
   with wEdit do begin
      AutoSize := true;
      Parent := tab;
      Left := 15;
      Height := 23;
      Top := 40;
      BorderStyle := bsNone;
      ReadOnly := True;
      width := 350;
      Text := 'содержимое поля';
      font.color := clGreen;
      font.Bold := true;
   end;


   //кнопка закрытия
   wClose := tButton.Create(tab);
   wClose.Parent := tab;
   wClose.OnClick := @closewarning;

   with wClose do begin
      Caption := 'Закрыть';
      Top := 70;
      Left := 12;
      Width := 100;
      Height := 29;
   end;
   
   //переходим на созданную закладку (фокусируем)
   PageControl1.PageIndex := tab.PageIndex;
   tab.SetFocus;
end;

на кнопку (которая в табе) вешаю событие @closewarning которое должно закрывать этот самый таб.
из sender вытаскиваю родителя кнопки, а точнее текущий таб из которого нажали кнопку.
теоретически должно всё выглядеть просто. после получения таба, делаю его free, но не тут то было
можно конечно сделать так (и тоже должно сработать) - удаление по индексу из самого pagecontrol1
pagecontrol1.pages[idx].Free;

Код: Выделить всё
procedure form1.closewarning(Sender: TObject);
var
   bb   : tbutton;
   tab   : tTabSheet;
   idx   : integer;
end;
   bb := (Sender as tbutton);
   tab := (bb.Parent as ttabsheet); //получаю таб из родителя нажатой кнопки
   idx := tab.PageIndex; //получаю индекс текущего таба
   
   //вот тут начинается интересное
   tab.free; //либо этот метод
   pagecontrol1.pages[idx].Free; //либо этот метод
   //оба рабочие, но есть одно НО
end;


оба метода рабочие
Код: Выделить всё
tab.free; //либо этот метод
pagecontrol1.pages[idx].Free; //либо этот метод
но есть некая загвоздка
объект, точнее вкладка не хочет удалятся, если она является активной/текущей/видимой/сфокусированной и т.п.

пытался перед удалением перекидывать фокус, индекс, активность на другую вкладку, а также делать текущую вкладку невидимой с перекидываеним всех активностей
не помогает, выскакивает ошибка "Класс исключения External: SIGSEGV по адресу xxxxxx"

хотя если указать индекс (например другой, неактивной и динамически созданной), то удаляется без проблем
например, мы находимся на 6 закладке а удаляем 3, то без проблем
Код: Выделить всё
pagecontrol1.pages[3].Free


вопрос, что я делаю не так и как удалить текущую (активную) вкладку?
Последний раз редактировалось Zak 02.09.2013 12:12:06, всего редактировалось 1 раз.
Zak
новенький
 
Сообщения: 31
Зарегистрирован: 16.06.2013 07:24:39
Откуда: морозная Сибирь

Re: удаление активной закладки у PageControl1

Сообщение SeZuka » 02.09.2013 10:46:09

Извечная проблема лазаруса. Решается асинхронным вызовом деструктора, примерно так:
Код: Выделить всё
procedure TForm1.AsyncDestroy(Data: PtrInt);
begin
  TObject(Data).Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.QueueAsyncCall(@AsyncDestroy, PtrInt(TControl(Sender).Parent));
end;
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: удаление активной закладки у PageControl1

Сообщение Zak » 02.09.2013 12:11:16

Мысль примерная была, что событие онклик как бы еще активно и не дает толком удалить, либо событие просто остается после удаления объекта и потом ествественно пытается что-то делать дальше. но связать конкретно не мог.

в общем спасибо что направили. решено этим методом.
Zak
новенький
 
Сообщения: 31
Зарегистрирован: 16.06.2013 07:24:39
Откуда: морозная Сибирь


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 230

Рейтинг@Mail.ru