(решено) SIGSEGV do arrBitmap[b].Free; - что не так?
Модератор: Модераторы
>>Статическая проверка типа значения, присваиваемого элементу коллекции
Это конечно да, только для классов не так уж и нужно. ИМХО
Это конечно да, только для классов не так уж и нужно. ИМХО
zub писал(а):А вот гадать ассигн это или не ассигн не остается...
Это не assign
В общем, работает только вариант Бородатого Пупсика, вот этот: FreeAndNil(arrBitmap[b])
Бородатое СПАСИБО и бородатый респект - бородатому Пупсику и всем кто принимал участие тоже спасибо,
Итог: Проблема на 55% решена, про остальные 45%
Вот чего она ещё пишет, но мне это реально непонятно, даже с моим крохотным знанием asm:
>>Проблема на 55% решена,
Это как подорожник подкладывать под йодную сетку при открытом переломе))
Хорошо что у тебя хобби - паскаль, а не медицина...
Это как подорожник подкладывать под йодную сетку при открытом переломе))
Хорошо что у тебя хобби - паскаль, а не медицина...
zub писал(а):Это как подорожник подкладывать под йодную сетку при открытом переломе))
Хорошо что у тебя хобби - паскаль, а не медицина...
Не так всё и страшно, в реальности - это Вы перегибаете. Я месяц держал эту строчку закомментированной и ничего страшного не было. Программа отключалась и снова включалась и так по 1000 раз в день и ничего. Просто, решил в итоге пробить и проверить, а ВДРУГ я неправильно делаю?
А сейчас - 100% можно быть уверенным, что память Free And Nill и если там что-то само без моего ведома чистит память (как Вы предположили), то метод Бородатого Пупсика - прекрасно выполняет оставшуюся задачу и присваивает переменным nil.
Ну а если же, сбой вдруг серьёзный как перелом, то он потом ещё где нить всплывёт. Я для себя пишу утилитку, поэтому тут же замечу любой сбой.
.
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
Вангую, что проблема вернется чуть позже
Нашёл, ещё одну странную зависимость...
В коде, на: FormCloseQuery, у меня появляется: messageDlg, который всплывает в случае наличия изменений и предлагает сохранить сделанную работу. Так вот, если запретить появление messageDlg, а значит и последующее появление OpenDialog, то память с arrBitmap[ b ].Free; - отчищается - без ошибки и программа закрывается - без сбоя.
В общем, всё пропало, виноват var MR : TModalResult;, который в FormCloseQuery...
В коде, на: FormCloseQuery, у меня появляется: messageDlg, который всплывает в случае наличия изменений и предлагает сохранить сделанную работу. Так вот, если запретить появление messageDlg, а значит и последующее появление OpenDialog, то память с arrBitmap[ b ].Free; - отчищается - без ошибки и программа закрывается - без сбоя.
В общем, всё пропало, виноват var MR : TModalResult;, который в FormCloseQuery...
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
давай весь код, хорош в экстрасенсов играть
MysticCoder писал(а):давай весь код, хорош в экстрасенсов играть
Код: Выделить всё
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var MR : TModalResult;
begin
boModify := false; // блокирует появление диалога и тогда всё работает без сбоя.
try
if boModify then begin
MR := QuestionDlg('Вопрос', 'Сохранить изменения в проекте '+OpenDialog1.FileName+'?'+#13, mtConfirmation, [mrOK, 'Да', mrNo,'Нет', mrCancel,'Отмена'], 0);
case MR of
mrOK: if OpenDialog1.FileName <> ''
then actSaveExecute(Self)
else actSaveAsXMLExecute(Self);
mrNo: CanClose := true;
mrCancel: CanClose := false;
end;
end;
except
on e:exception do ShowMessage('Сбой при закрытии программы: '+#13+e.Message);
end;
end;
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
-_-
весь код юнита. ты где то портишь память, и явно не в этих огрызках кода, что выдаешь.
весь код юнита. ты где то портишь память, и явно не в этих огрызках кода, что выдаешь.
>>В общем, всё пропало, виноват var MR : TModalResult;, который в FormCloseQuery...
actSaveExecute или actSaveAsXMLExecute
>>Проблема гдето между FormCreate FormClose в голом виде всё ок.
Вижишь сколько всяких каках набирается в этом промежутке. Нужно учится отлаживать свои программы а не морочить людям головы
actSaveExecute или actSaveAsXMLExecute
>>Проблема гдето между FormCreate FormClose в голом виде всё ок.
Вижишь сколько всяких каках набирается в этом промежутке. Нужно учится отлаживать свои программы а не морочить людям головы
MysticCoder писал(а):весь код юнита. ты где то портишь память, и явно не в этих огрызках кода, что выдаешь.
Весь код, где я заполняю битмапы - приведён выше. Дело не в битмапах, а в MR : TModalResult;
zub писал(а):actSaveExecute или actSaveAsXMLExecute
Абсолютно точно не они, вот я их закомментировал и всё равно сбой:
Код: Выделить всё
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var MR : TModalResult;
begin
// boModify := false;
try
if boModify then begin
MR := QuestionDlg('Вопрос', 'Сохранить изменения в проекте '+OpenDialog1.FileName+'?'+#13, mtConfirmation, [mrOK, 'Да', mrNo,'Нет', mrCancel,'Отмена'], 0);
case MR of
mrOK: CanClose := true; //if OpenDialog1.FileName <> ''
// then CanClose := true // actSaveExecute(Self)
// else CanClose := true; // actSaveAsXMLExecute(Self);
mrNo: CanClose := true;
mrCancel: CanClose := false;
end;
end;
except
on e:exception do ShowMessage('Сбой при закрытии программы: '+#13+e.Message);
end;
end;
Выполняется только вот этот код MR := QuestionDlg (итд) и выскакивает сбой, а если отключить, то всё чистится, как положено. Дело не в памяти, а в этом TModalResult ... Там видимо какой-то параллельный процесс запускается и успевает почистить память ?
zub писал(а):Нужно учится отлаживать свои программы а не морочить людям головы
Я просто спросил, чтобы удостовериться - все ли мои действия верны.
Последний раз редактировалось vitaly_l 25.01.2017 16:40:16, всего редактировалось 1 раз.
>>Дело не в памяти, а в этом TModalResult ...
Нда..
Нда..
zub писал(а):>>Дело не в памяти, а в этом TModalResult ...
Нда..
Вот так всё работает - 100% без сбоя:
Код: Выделить всё
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
//var MR : TModalResult;
begin
// boModify := false;
try
if boModify then begin
//MR := ;
case QuestionDlg('Вопрос', 'Сохранить изменения в проекте '+OpenDialog1.FileName+'?'+#13, mtConfirmation, [mrOK, 'Да', mrNo,'Нет', mrCancel,'Отмена'], 0) of
mrOK: if OpenDialog1.FileName <> ''
then actSaveExecute(Self)
else actSaveAsXMLExecute(Self);
mrNo: CanClose := true;
mrCancel: CanClose := false;
end;
end;
except
on e:exception do ShowMessage('Сбой при закрытии программы: '+#13+e.Message);
end;
end;
Я просто запретил создание: //var MR : TModalResult; и всё перестало сбоить <== Объяснить это художники не могут, может кто в курсе почему???
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
vitaly_l писал(а):Дело не в битмапах, а в MR : TModalResult;
конечно же в MR : TModalResult; , это же на первом курсе еще объясняется, что им пользоваться нельзя и что он придуман только для того, чтобы сбои вызывать.
MysticCoder писал(а):Вангую, что проблема вернется чуть позже
vitaly_l писал(а):Нашёл, ещё одну странную зависимость...
вот этих странных зависимостей еще кучу найдешь, пока корень проблемы не найдешь. т.к. при порче памяти в одном положении системы все работает, а при любом чихе все катится к чертям.
MysticCoder писал(а):вот этих странных зависимостей еще кучу найдешь, пока корень проблемы не найдешь. т.к. при порче памяти в одном положении системы все работает, а при любом чихе все катится к чертям.
У меня неправильное образование, в смысле у меня не было первого курса и сразу пришлось стать Великим и неповторимым магистром.
