SIGSEGV с TDBLookupComboBox на модальной форме

Вопросы программирования и использования среды Lazarus.

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

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение vitaly_l » 15.03.2017 16:54:32

pupsik писал(а):троль бородатый

не бородатый троль... это не круто. А вот: бородатый Пупсик - убивает сразу на повал...
pupsik писал(а):кажись из художника в матёрые багоискатели

нет просто вижу что ТС заблуждается, и боюсь что кто-то его послушает и исправит псевдо "баг" на багтрекере... <== Вот это реально страшно.
Кроме того, мне просто из спортивного интереса интересно: что там на самом деле?
Моё мнение он или кто-то ещё, парента не указали, вот программу и глючит (но это вагинация, а не утверждение).

Кроме того, вагинатор нужно тренировать, а то он заржавеет.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение pupsik » 15.03.2017 17:14:16

Паренты, шмаренты... там всё куда проще. Хотя... весьма довольно таки интересный момент: зачем "затолкали" туда FRecordUpdated? Который, при первом взгляде, используется э..э в холостую?
Возможен вариант что я чего то не понимаю.. В принципе его как бы хотят использовать в качестве "отката" при обновлении. Т.е. дубль для Event?
Как то там всё весело.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение vitaly_l » 15.03.2017 17:40:11

pupsik писал(а):Который, при первом взгляде, используется э..э в холостую?

Не... если он true значит, были изменения, соответственно запустится код который после then begin ... при этом, по идее если он true значит (FLookup.ControlItems априори обязано быть <> nil). И остаётся последняя надежда на отключение, (FLookup.ControlItems.Count <> DataSet.RecordCount) постольку поскольку это вернёт false т.к. они равны, то сбой при заполнении не происходит.

Делаем вывод, что ошибки в этом коде не было. А где тогда? Смотрим, что ТС делал для элиминирования бага? Видим (PopupMode = pmNone) и понимаем, что оно бывает когда нет парента. А без парента - многие контролы валятся. И самое главное, после инициализации оно должно принять статус отличный от pmNone - иное всегда есть сбой. Постольку поскольку оно всегда pmNone, то баг где-то раньше. Иначе, если бы оно было отлично от pmNone, то второй RecreateWnd(Self); - никогда бы не запустился. И ненужно ничего менять в ShowModal; Достаточно присвоить другой PopupMode. И вместе с этим, дать ему Parent .
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение java73 » 15.03.2017 18:00:18

Я хочу напомнить как у меня возникала эта ошибка:
Вот запустилось приложение, главная форма собрала в процедуре статистику БД, ошибки еще нет, открыли ДРУГУЮ форму, на которой нет никаких комбобоксов. Закрыли эту форму. Ошибки еще нет. Управление вернулось главной форме, пошла опять процедура, в которой перебирается таблица базы данных, и в момент, когда курсор начинает перебирать таблицу, поле которой прописано в свойствах в одном комбобоксе (на форме, которая только создана, но ни разу еще не открывалась), появляется ошибка.
Вопрос сразу - почему при первой переборке таблицы БД ошибка не вышла? Почему она выходит при запуске той же процедуры повторно ПОСЛЕ закрытия других форм?
Для меня это реальная загадка. На комбобоксах вообще никакого кода не завешено, они фактически только для чтения используются - для выбора значения БД в качестве фильтра.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение vitaly_l » 15.03.2017 18:05:50

java73 писал(а):на форме, которая только создана, но ни разу еще не открывалась

Вот буквально месяц назад мучился. Там что-то было с парентами и без них контролы отказывались работать. Программа тоже падала. Указал парента, при создании и всё сбои прекратились. Но не факт, что и у Вас это. Выясняйте: Почему pmNone? Поставьте любое другое значение и сбой прекратится т.к. RecreateWnd(Self); перестанет вызываться.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение pupsik » 15.03.2017 18:35:01

java73 и толку от написанного. Сделайте тестовый пример.
Почему она выходит при запуске той же процедуры повторно
посмотрите чем отличается повтор от первого. Что то вы упустили в коде. Т.е. отладчик в руки и вперёд.

Делаем вывод, что ошибки в этом коде не было. А где тогда?
да: там ошибки не было. Я просто экранировал участок. Баг зарыт в другом месте. Найти его - переколбасить и понять структуру "весёлостей".
Хотите: играйтесь.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение vitaly_l » 15.03.2017 19:28:56

pupsik писал(а):Я просто экранировал участок. Хотите: играйтесь.

Нет не хочу. У меня свои баги не хуже этого бывают. Просто тренировал вангинатор иногда полезно, т.к. развивает. Заодно надеюсь, помог понять людям что баги они ищут не там. А дальше, всё правильно - отладчик в руки и вперёд! Искать баг между 88 и 17 строкой на чужой машине, с помощью только ваНгинатора - это выше моих нескромных сил.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение pupsik » 15.03.2017 20:54:38

Если не разгребать почему FLookup.ControlItems.Count "летит" в исключение можно его убрать.
Тогда св-ва бокса не изменятся и исчезает ошибка при закрытии формы. Хотя... не тестил вставку записи.

Код: Выделить всё
    if FRecordUpdated and (FLookup.ControlItems <> nil) then
//       (FLookup.ControlItems.Count <> DataSet.RecordCount)) then  т.е. убираем этот участок


Интересно: чем закончатся правки на багтреке.?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение tema » 15.03.2017 21:08:56

Тролль в смысле бессмысленного потока информации. А по сути балабол. Сказал, что сделал, а код предоставить отказался. Так что просто врун и балабол.
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение pupsik » 15.03.2017 21:17:50

tema т.е.? Вам какой код? Или вы о том рабочем варианте где работает без правок сорцов?

Мил человек: я вас в самом начале просил привести к стандарту ваш пример... Вы не соизволили сего сделать. Ок.. я его адаптировал для себя. Более менее понял "где кошка". Сделал пару проверок и нашёл простой вариант обхода.

Вы же за всё время общения ни разу не прислушивались (к другим то же), а "гнули" свою линию. Ок.

Теперь вы чего то хотите... Хм... я уже показал направление где рыть. Пф... я что виноват что у вас ручки крючки и в новой версии лазаря показалась кривизна ваших рук?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение vitaly_l » 15.03.2017 21:35:21

tema писал(а):в смысле бессмысленного потока информации

Так я не понял, Вы вот это сделали в коде или нет?
Код: Выделить всё
Form2 := TForm.Create;
Form2.PopupParent  := Form1;
Form2.PopupMode    := pmExplicit; // либо pmAuto
Form2.ShowModal;

Что у Вас получилось после вставки этого кода?
Или мы тут все впустую пишем, а вы тупо тролите и развлекаетесь?

PS: Бородатый Пупсик, довольно ясно доказал, что баг не в ShowModal - этого более чем достаточно,
:roll: при столь ужасном и коварном баге как у вас.
Последний раз редактировалось vitaly_l 15.03.2017 21:47:43, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение zub » 15.03.2017 21:43:53

tema писал(а):Скоро узнаем точно:

Если бы всё так было просто))
У меня в лазаре самый долгий баг провисел 5 лет, и был закрыт так как надоел. но исправлен небыл))
С другой стороны, сегодня постил пару мелких багов в fpc разделе - были исправлены моментально.

Такчто самый действеный вариант не сраца на форумах, а самаму решить проблему и выложить годный патч.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение pupsik » 15.03.2017 23:18:05

Такс, дополню почему , желательно, в этом участке кода именно так сделать:
Код: Выделить всё
    if FRecordUpdated and (FLookup.ControlItems <> nil) then //т.е. мы узнали что модификация была и существуют "записи", производим заполнение и отрисовку
//       (FLookup.ControlItems.Count <> DataSet.RecordCount)) then  //а зачем это проверять то?  Убирая эту часть ничего с логикой работы не станет.


то что выскакивает исключение в FLookup.ControlItems.Count - иной разговор. Надо смотреть подробнее кто виноват. Сам FLookup затрагивается в нескольких частях. Плюс это объект. Где конкретно происходит порча - к.з.. А вот то что они по несколько раз кряду "заполняются" - довольно точно. При каждом чихе... идрынь. Но это уже иной вопрос.

Кстати: FLookup.ControlItems.Count вполне таки работает. Т.е. выдает кол-во записей, как и сами записи. Что то "мелькало" о нерабочести.

По поводу предка формы. Уж не знаю чем это поможет. И насколько глобально затронет по мелочам. Уж проще подправить компонент и работать далее, нежели нарваться на "прелести".

И, кстати, я попробовал предложенный патч. И баг с табами по ссылке. Как было ави так и осталось. Хотя, если честно, я бы по другому организовал что было необходимо вопрошающему.

п.с.
Но, возможно, существует более продвинутое рабочее предложение. И то что я предлагаю - не есть дефакто. Простые правки, по логике. Которые почему то подправили баг.? Или где то ошибся?

Добавлено спустя 5 минут 25 секунд:
ясно доказал, что баг не в ShowModal - этого более чем достаточно
я не показатель. Должен быть мотивированный отказ от предложенного. Т.е. не фотки чикать и писать странности, а указать: в чём прав, или нет. И указать причину. И работать не со следствием, а с самого начала.

п.с.
В принципе: "бородатый троль" мне более нравитсо :lol:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение vitaly_l » 15.03.2017 23:47:51

pupsik писал(а):Как было ави так и осталось

Ну вот ещё одно доказательство, что виноват не ShowModal; т.к. теперь там явно не запускалась первая RecreateWnd(Self);

Я кстати из интереса в функции ShowModal закомментировал оба места где вызывается RecreateWnd(Self); - выяснилось они вообще никак не влияют на ShowModal обычной формы. Так что в качестве патча можно смело указать:

удалите это:
Код: Выделить всё
    if (PopupMode = pmNone) and HandleAllocated then
      RecreateWnd(Self); // need to refresh handle for pmNone because ParentWindow changes if (fsModal in FFormState) - see GetRealPopupParent                     


и удалите вот это:
Код: Выделить всё
    if ((PopupMode = pmNone) and HandleAllocated) and not (csDestroying in ComponentState) then
        RecreateWnd(Self); // need to refresh handle for pmNone because ParentWindow changes if (fsModal in FFormState) - see GetRealPopupParent               


Когда удалите оба варианта, то ошибка у ТС естественно пропадёт, т.к. вызывает второй.
А вот зачем они вообще нужны были? :roll: Я не берусь сказать, т.к. у меня ShowModal прекрасно работает и без них обеих.

Встаёт вопрос, а почему банальный: RecreateWnd(Self); - вызывает сбой программы, в которой априори нет багов?

Будучи ужасным и коварным, я удалил все условия и оставил голой страшную функцию RecreateWnd(Self);
И что вы думаете? Неубиваемый ShowModal, как запускался так и запускается. Можете проверить, кому не лень.
Соответственно здоровой программе, пофигу запуск RecreateWnd(Self); - хоть десять раз подряд её запустите.

Это ещё раз доказывает что, дело не в том патче, который предложил ТС.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV с TDBLookupComboBox на модальной форме

Сообщение pupsik » 16.03.2017 01:06:07

Ну вот ещё одно доказательство
это не доказательство...
Осмелюсь спросить: вы хоть знаете что делает RecreateWnd?
По поводу остального написанного: ЧАВО? :shock:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: bormant и гости: 35

Рейтинг@Mail.ru