PageControl + SynEdit - PageControl.ActivePage.Free

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

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
новенький
 
Сообщения: 25
Зарегистрирован: 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
новенький
 
Сообщения: 66
Зарегистрирован: 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
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 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
новенький
 
Сообщения: 25
Зарегистрирован: 29.12.2017 15:44:58

Re: PageControl + SynEdit - PageControl.ActivePage.Free

Сообщение alexs » 29.01.2018 11:55:56

А зачем вообще плодить копии SynEdit?
Я в своём FBManager-е для редактора SQL использую только один экземпляр SynEdit. А навигацию изначально делал на базе TabControl-а. Сейчас вообще навигацию между "страницами" редактора сделал на базе TreeView.
При выборе определённой вкладки подставлю в редактор текст запроса, позицию курсора, выделение.
При выборе другой вкладки - сохраняю данные.

В качестве примера:

Код: Выделить всё
procedure TfbmSQLEditorForm.TreeView1Click(Sender: TObject);
var
  P:TSqlEditorPage;
  TV: TTreeView;
begin
  TV:=TTreeView(Sender);
  if Assigned(TV) and Assigned(TV.Selected) then
    if Assigned(TV.Selected.Data) then
    begin
        P:=TSqlEditorPage(TV.Selected.Data);
        if Assigned(P) then
        begin
          SaveCurrent;
          FSqlEditorTextCur:=P;
          LoadCurrent;
          EditorFrame.UpdateStatusBar;
          PageControl1.ActivePageIndex:=0;
          if Visible then
            EditorFrame.TextEditor.SetFocus;
        end;
      end
    end;
end;

procedure TfbmSQLEditorForm.SaveCurrent;
begin
  if Assigned(FSqlEditorTextCur) then
  begin
    FSqlEditorTextCur.Text:=EditorFrame.TextEditor.Lines.Text;
    FSqlEditorTextCur.CarretPos:=EditorFrame.TextEditor.CaretXY;
    FSqlEditorTextCur.SelStart:=EditorFrame.TextEditor.SelStart;
    FSqlEditorTextCur.SelEnd:=EditorFrame.TextEditor.SelEnd;
    FSqlEditorTextCur.Save;
  end;
end;

procedure TfbmSQLEditorForm.LoadCurrent;
begin
  if Assigned(FSqlEditorTextCur) then
  begin
    if FSqlEditorTextCur.Text<>'' then
    begin
      EditorFrame.TextEditor.Text:=FSqlEditorTextCur.Text;
      EditorFrame.TextEditor.CaretXY:=FSqlEditorTextCur.CarretPos;
      EditorFrame.TextEditor.SelStart:=FSqlEditorTextCur.SelStart;
      EditorFrame.TextEditor.SelEnd:=FSqlEditorTextCur.SelEnd;
    end
    else
      EditorFrame.TextEditor.ClearAll;
  end
  else
  begin
    EditorFrame.TextEditor.CaretX:=1;
    EditorFrame.TextEditor.CaretY:=1;
    EditorFrame.TextEditor.Lines.Clear;
  end;
  EditorFrame.TextEditor.Modified:=false;
end;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: PageControl + SynEdit - PageControl.ActivePage.Free

Сообщение serbod » 29.01.2018 15:22:53

alexs плюсую, наиболее оптимальный вариант для страниц с идентичным составом.

А еще в Windows ограничение на количество хендлов (дескрипторов) в приложении, и множество вкладок, набитых графическими контролами, может привести к полному коллапсу.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в SynEdit и UniHighlighter

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

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

Рейтинг@Mail.ru