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 ответов

60 просмотров

Помещай создаваемые формы в 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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта