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

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

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

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

Сообщение vitaly_l » 14.03.2017 21:11:47

java73 писал(а):У меня при создании форм на которых есть dblookupconbobox ы им всем присваевается enabled=false.
Ошибка выскакивает даже когда форма с комбами ни разу не открывалась.
Я собственно логику работы визуальной части компонентов отделить предлагаю от какой-либо связи с логикой работы базы данных.
Уже все поняли, что данные тут вообще ни при чем.

Попробуйте ответить на такой вопрос: Почему пустая форма открывается и закрывается без бага, а с "вашими" компонентами форма вдруг начинает падать?

Попробуйте создать пустую форму и у Вас тоже ничего не упадёт. Затем постепенно, кладите на форму компоненты, по одному. В итоге если повезёт, вычислите проблемный компонент, который рушит программу.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение java73 » 14.03.2017 21:22:40

vitaly_l писал(а): В итоге если повезёт, вычислите проблемный компонент, который рушит программу.

Проблемный компонент известен, он написан в заголовке темы.

Добавлено спустя 12 минут 59 секунд:
Вот собственно те баг репорты, по которым внесли изменения:
1) http://bugs.freepascal.org/view.php?id=0031028
2) http://bugs.freepascal.org/view.php?id=30003
И судя по коду откат назад спасает почему-то
java73
постоялец
 
Сообщения: 191
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение vitaly_l » 14.03.2017 21:37:00

java73 писал(а):Проблемный компонент известен, он написан в заголовке темы.

Ну тогда почему же вы решили, что виноват ShowModal?
Где логика? Поймите, Вы сделали: заглушку - она нивелировала сбой, но баг-то остался в TDBLookupComboBox.
Ищите баг в TDBLookupComboBox, а не в ShowModal, раз уж вы 100% уверены, что виноват TDBLookupComboBox.

Хотя с Вашими методами ловли багов, я вообще не понимаю, как вы их можете находить?
Вы видели хотя-бы одного живого бага в своей жизни?

Добавлено спустя 9 минут 57 секунд:

Код: Выделить всё
Thanks. Now I see the issue.

Digging in the svn commits I found that this issue was fixed in r51631 by Ondrej - that's why I don't see it with Laz trunk. The fix will be backported to the fixes branch.

I think you can test the fix easily on your 1.6.2 version:

* Open customform.inc (in lcl/include)
* Find the method CustomForm.ShowModal
* At the beginning of the first try-finally block (near line 2880) replace the
  lines

    if PopupMode = pmNone then
    begin
      RecreateWnd(Self);
      HandleNeeded;
    end;

  by

    if (PopupMode = pmNone) and HandleAllocated then
      RecreateWnd(Self);

Please test and close if ok, otherwise re-create.


Ответ был таким:

Код: Выделить всё
Tested and all ok. Situation corrected.


В смысле там раньше был баг (который Вы пытаетесь вернуть обратно), а теперь с версии 1.64 - баг исправили, и поэтому у Вас сбой ПРОЯВИЛСЯ.
А раньше его (бага) просто не было видно, но сбой у Вас был. Теперь понятна причина почему у Вас раньше работало а теперь нет?

А баг ищите в TDBLookupComboBox.


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

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

Сообщение java73 » 14.03.2017 22:04:57

Не могу утверждать, что все так. Здесь говорится, что фикс был в 1.6.2 но я собирал под ней и проблем еще не было.
java73
постоялец
 
Сообщения: 191
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение tema » 14.03.2017 22:05:45

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

lcl/include/dblookup.inc line 88
Это была единственная полезная информация в потоке непойми чего. Хотя or там во всех предыдущих версиях и всё работало.
tema
постоялец
 
Сообщения: 349
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение java73 » 14.03.2017 22:15:46

Спасибо
java73
постоялец
 
Сообщения: 191
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение vitaly_l » 14.03.2017 22:16:59

tema писал(а):Это была единственная полезная информация в потоке непойми чего. Хотя or там во всех предыдущих версиях и всё работало.

Респект Пупсику! И компилятору, который изначально указывал на место сбоя на строке №88.

Строка №17 - теперь, в пояснениях к вопросам про баги, заменяется на строка №88... Постольку поскольку, доказано что бага, в последний раз - видели на строке №88.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение tema » 14.03.2017 22:23:10

Это не отменяет отсутствия у FLookup.ControlItems свойства Count. Получение данных всё равно идёт с опережением. А при патче, который указал я, опережение уходит.

Добавлено спустя 2 минуты 13 секунд:
Кстати, в моём патче сделать только так:
Код: Выделить всё
2953,2954d2952
<       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

Первую менять не обязательно. Коллизия при этом с багом http://bugs.freepascal.org/view.php?id=0031028 тоже уходит.
tema
постоялец
 
Сообщения: 349
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение vitaly_l » 14.03.2017 22:37:03

tema писал(а):Это не отменяет отсутствия у FLookup.ControlItems свойства Count. Получение данных всё равно идёт с опережением. А при патче, который указал я, опережение уходит.

Бага видели на строке №88, но это не значит что его поймали. Но зато теперь, Вы, точно знаете что, баг не в ShowModal. И скорее всего находится где-то между 88 и 17 строкой в dblookup.inc.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение tema » 14.03.2017 22:54:34

Скоро узнаем точно:
2017-03-14 19:45 Ondrej Pokorny Assigned To => Ondrej Pokorny
2017-03-14 19:45 Ondrej Pokorny Status new => assigned
2017-03-14 19:46 Ondrej Pokorny LazTarget => 1.8
2017-03-14 19:46 Ondrej Pokorny Target Version => 1.8
tema
постоялец
 
Сообщения: 349
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение java73 » 15.03.2017 09:33:48

подтверждаю уход ошибки при изменении в 88 строке or на and, в customforms вернул все в зад.
java73
постоялец
 
Сообщения: 191
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение vitaly_l » 15.03.2017 09:55:51

java73 писал(а):подтверждаю уход ошибки при изменении в 88 строке or на and, в customforms вернул все в зад.

можно заменить на:
Код: Выделить всё
if FRecordUpdated and (FLookup.ControlItems <> nil) and (FLookup.ControlItems.Count <> DataSet.RecordCount) then

И судя по коду, программа получала true на FRecordUpdated, в то время когда FLookup.ControlItems было равно nil ... и поэтому было обрушение. И естественно выполнялось, вот это: FLookup.ControlItems.Count <> DataSet.RecordCount. Короче, то и это - приводили к обрушению. Например когда FLookup, не инициализирован или инициализирован неправильно. Затем RecreateWnd/HandleNeeded; вызывали инициализацию и баг нивелировался. :roll: Не поленитесь и проверьте и возможно вам повезёт найти настоящего бага в неправильной коммутации контролов. :roll: Точнее в неправильной организации интерфейса.

tema писал(а):Если в TDBLookupComboBox с включённым AutoComlete лазаруса 1.7 пытаться вводить символы, то первый ввести можно, а вот при вводе второго всё затирается и в комбобоксе остаётся только второй.

Это также может происходить в следствии неправильной организации/коммутации интерфейса, которую раньше не было видно, т.к. вызывалась повторная инициализация.

Добавлено спустя 55 минут 55 секунд:
Да вот ещё, после замены and на or, судя по коду, скорее всего вы сможете добавлять новые строки, но из-за and - не сможете редактировать старые строки, т.к. (FLookup.ControlItems.Count при редактировании, будет равно DataSet.RecordCount). Рекомендую проверить, так ли это?

Дальнейшую вангинацию провести невозможно, т.к. хитрый баг спрятался между 88 и 17 строкой :wink: .
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение tema » 15.03.2017 12:06:49

java73 писал(а):подтверждаю уход ошибки при изменении в 88 строке or на and, в customforms вернул все в зад.

Лучше в customforms просто удалить второй рекреат, а or оставить, т.к. при or остаётся неправильное получение данных при переборе, а при удалении второго рекреата этой ошибки нет. (я на багтрекере это прикрепил как последний файл cf.patch) При and можно достичь такого же эффекта, написав просто
Код: Выделить всё
if false then

Я специально проверил, что при and программа ни разу не зашла в этот if
В общем на данный момент самое оптимальное решение, которое не противоречит http://bugs.freepascal.org/view.php?id=0031028 и чинит данный баг это удаление из customforms двух строк:
Код: Выделить всё
2953,2954d2952
<       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
tema
постоялец
 
Сообщения: 349
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение vitaly_l » 15.03.2017 12:15:20

tema писал(а):В общем на данный момент самое оптимальное решение, которое не противоречит http://bugs.freepascal.org/view.php?id=0031028 и чинит данный баг это удаление из customforms двух строк:

Наоборот - это самое неправильное решение, т.к. строка 88 явно показала, что баг, 100% не в функции ShowModal. Убирая эти строки в ShowModal, Вы, предлагаете тоже самое, что и заменить OR на AND. Но ни на строке 88, ни в ShowModal - бага нет. Баг в другом месте. Об этом уже говорили выше. Постарайтесь понять и найдите уже реальный баг, а не делайте заплатки в код и будет Вам счастье.

Постарайтесь выяснить: почему у вас (PopupMode = pmNone)?

Добавлено спустя 9 минут 99 секунд:
Возможно вот это вам поможет:
Код: Выделить всё
  TPopupMode = (
    pmNone,     // modal: popup to active form or if not available, to main form; non-modal: no window parent
    pmAuto,     // modal & non-modal: popup to active form or if not available, to main form
    pmExplicit  // modal & non-modal: popup to PopupParent or if not available, to main form
  ); 

no window parent ?

Добавлено спустя 33 минут 33 секунды:
Перед ShowModal для Form2 в Вашем коде, попробуйте вставить, вот такой код, заменив xxx и yyy на нужное:
Код: Выделить всё
xxx.PopupParent  := yyy;
xxx.PopupMode    := pmExplicit;
Form2.ShowModal;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3064
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение pupsik » 15.03.2017 16:40:35

vitaly_l кажись из художника в матёрые багоискатели :)

tema то что вам показывает дебагер на ошибку - не значит что она там есть. Т.е. надо выяснять причину. А вот лезть в предка формы и говорить - решение. Которое попутно "решает" иной баг:
Коллизия при этом с багом http://bugs.freepascal.org/view.php?id=0031028 тоже уходит.
.

По идее где то поменяли, а где то в датабоксе не учли. Причина не учёта - редко пользуются этим компонентом.

п.с.
Это была единственная полезная информация в потоке непойми чего.
печально. А совет: порыться в другом месте ("не там роете")? Ах, ну да: троль бородатый :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1009
Зарегистрирован: 20.08.2014 16:20:13

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru