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

66 просмотров

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта