169 похожих чатов

Всем привет! Возник вопрос по lazarus. Использую pagecontrol для навигации

по созданным формам(создаю страницу и пихаю туда форму). Вопрос как правильно закрыть эту страницу(с формой)? Если на форме я делаю close то соответственно все удаляется кроме вкладки, а при попытке удаления вкладки получаю access violation((( Код удаления вкладки: procedure TMainFrm.DeletePage(NamePage: string);
var
  i: integer;
  varPage: TTabSheet;
begin
  for i := 0 to pcMain.PageCount - 1 do
  begin
    if pcMain.Pages[i].Caption = NamePage then
    begin
      varPage := pcMain.Pages[i];
      varPage.Free;
      //Если вкладка была последняя и мы её удалили то скрываем вкладки
      if pcMain.PageCount = 0 then
       pcMain.Visible:=false;
      break;
    end;
  end;
end;  

13 ответов

68 просмотров

Помещай создаваемые формы в TObjectList<>. Перед удалением вкладки удаляй сначала форму, потом вкладку

Mishutka- Автор вопроса

Поправка. Если запускаю процедуру удаления из главной формы, на которой pagecontrol, то все отлично. Ошибка возникает при вызове процедуры из созданной формы.

Mishutka
Поправка. Если запускаю процедуру удаления из глав...

Делай тестовый проект и выкладывай сюда.

Mishutka- Автор вопроса
Ed Doc
Делай тестовый проект и выкладывай сюда.

Истина рядом. Сделал пустой проект только с pagecontrol и 2 формами и там не возникает access violation.🤯 Но по вашему совету однозначно почитаю и попробую применить tobjectlist.

Попробуй поставить удаление страницы (varPage.Free) в отложенное сообщение. У тебя похоже, что после срабатывания DeletePage идёт обращение к этому же объекту - типичная ситуация, когда кнопка удаления лежит на удаляемом фрейме, а обработчик события OnClick не является "последним" в цепочке инструкций обработки нажатия кнопки - отсюда и AV.

Mishutka
Истина рядом. Сделал пустой проект только с pageco...

Тебе нужен контейнер, который будет хранить объекты и сам корректно уничтожать при удалении из него. А вкладки используй только для отображения этих объектов, перед удалением вкладки проверяй, удалён ли соответствующий ей объект

Alexander Somov
Попробуй поставить удаление страницы (varPage.Free...

Что-то вроде: TThread.ForceQueue(nil, procedure begin varPage.Free; end);

Alexander Somov
Что-то вроде: TThread.ForceQueue(nil, procedure be...

В общем вот вариант с исправлениями: procedure TMainFrm.DeletePage(NamePage: string); var   i: integer;   varPage: TTabSheet; begin   for i := 0 to pcMain.PageCount - 1 do   begin     if pcMain.Pages[i].Caption = NamePage then     begin       varPage := pcMain.Pages[i];      TThread.ForceQueue(nil, procedure begin varPage.Free; end);         //Если вкладка была последняя и мы её удалили то скрываем вкладки       if pcMain.PageCount = 1 then        pcMain.Visible:=false;       break;     end;   end; end;

Alexander Somov
В общем вот вариант с исправлениями: procedure TMa...

имхо, достаточно PostMessage. Чего огород городить?

Hemul GM
TThread.ForceQueue(nil, varPage.Free);

Это разве скомпилируется? Не знаком с Lazarus, но в Delphi по синтаксису будет вызван метод Free объекта varPage и его результат будет передан вторым параметром метода ForceQueue

Alexander Somov
Это разве скомпилируется? Не знаком с Lazarus, но ...

ForceQueue принимает процедуру, он не может принять "ничего", что является результатом Free

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта