PageControl + SynEdit - PageControl.ActivePage.Free

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

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

PageControl + SynEdit - PageControl.ActivePage.Free

Сообщение BIT » 05.01.2018 20:55:48

Здравствуйте возникла не преодолимая ошибка c динамическими созданными компонентами TabSheet+TSynEdit (PageControl.ActivePage.Free)
Если удалить последнею вкладку все работает отлично, а если удалить любую другую предыдущие вкладки по index теряют TObject внутри TabSheet то есть больше нельзя скопировать вставить текст обратиться к SynEdit по имени и т.п.
Видео с воспроизведение ошибки https://youtu.be/VtExS2W8oWs
Проект с ошибкой https://drive.google.com/open?id=1pltuC ... wCePR7vxef

Еще раз:

Есть 10 вкладок с редактором, удаляем вкладку 7, остается 9 вкладок, вкладка 1,2,3,4,5,6 остаются рабочими, вкладки 7,8,9 вызывают ошибку!

Создаю
Код: Выделить всё
var
Tab: TTabSheet;
  rSynEdit: TSynEdit; 

....................................................................

  Tab := TTabSheet.Create(self);
  Tab.PageControl := PageControl1;
  Tab.Caption := TabCaption;
  Tab.PageControl.ActivePage := Tab;

  rSynEdit := TSynEdit.Create(Tab);
  rSynEdit.Parent := Tab;
  rSynEdit.Align := alClient;
  rSynEdit.Name := 'syed' + IntToStr(PageControl1.PageCount);



Удаляю
Код: Выделить всё
procedure TForm1.MenuItem16Click(Sender: TObject);
begin
  PageControl1.ActivePage.Free;
end;   


Добавлено спустя 1 час 34 минуты 42 секунды:
Вот ответ помогли на зарубежном форуме
if (ActiveControl is TSynEdit) then TSynEdit(ActiveControl).CopyToClipboard;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
BIT
новенький
 
Сообщения: 21
Зарегистрирован: 29.12.2017 15:44:58

Re: PageControl + SynEdit - PageControl.ActivePage.Free

Сообщение LearnMagic » 07.01.2018 01:21:31

PageControl1.ActivePage.Free; - Не стоит рубить сук, на котором сидишь
Перед освобождением нужно выполнить RemovePage или вместо этого PageControl1.ActivePage.TabVisible := False
Для добавления закладок можно воспользоваться TPageControl. AddTabSheet
И не совсем понятна связь буфера обмена с описываемой пробемой
LearnMagic
новенький
 
Сообщения: 47
Зарегистрирован: 10.11.2016 23:13:38

Re: PageControl + SynEdit - PageControl.ActivePage.Free

Сообщение sign » 08.01.2018 07:52:44

Зачем так сложно - Tab := TTabSheet.Create(self);

Когда можно просто?

Код: Выделить всё
// Новая страница
Tab := PageControl1.AddTabSheet;
PageControl1.ActivePage := Tab;

// Удалить страницу
Tab := pcMain.ActivePage;
PageControl1.SelectNextPage(True);
Tab.Free;
sign
энтузиаст
 
Сообщения: 888
Зарегистрирован: 30.08.2009 09:20:53

Re: PageControl + SynEdit - PageControl.ActivePage.Free

Сообщение BIT » 15.01.2018 17:44:06

С вашими вариантами не удалится компоненты с Tab будут висеть в памяти
Раньше так же делал)
Спасибо за ответы!

Добавлено спустя 12 минут 50 секунд:
LearnMagic писал(а):PageControl1.ActivePage.Free; - Не стоит рубить сук, на котором сидишь
Перед освобождением нужно выполнить RemovePage или вместо этого PageControl1.ActivePage.TabVisible := False
Для добавления закладок можно воспользоваться TPageControl. AddTabSheet
И не совсем понятна связь буфера обмена с описываемой пробемой

Проблема в том что SynEdit и PageControl1.ActivePage не всегда равен index который в данный момент находится на TabSheet
Вообщем при удаление TabSheet <> SynEdit не равен index PageControl1 в этот момент сам решает на какую вкладку ему поместить SynEdit
Надеюсь правильно объяснил. Я просто этого не знал и за этого получал ошибку)
Аватара пользователя
BIT
новенький
 
Сообщения: 21
Зарегистрирован: 29.12.2017 15:44:58


Вернуться в Lazarus

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

Сейчас этот форум просматривают: BIT, wofs и гости: 7

Рейтинг@Mail.ru