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

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

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

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

Сообщение tema » 06.03.2017 04:51:19

http://mantis.freepascal.org/view.php?id=31486
Та проблема, которую пытался разобрать отсюда: http://freepascal.ru/forum/viewtopic.ph ... 26#p111891
Проблема начинается с версий
FPC>=3.0.2 Lazarus>=1.6.4
На FPC 3.0.0 и lazarus 1.6.2 всё в порядке.

Прошу помочь как это изложить на буржуйском:
tema писал(а):
zub писал(а):попытка обращения к несозданому TStrings

Именно так.
Я поставил writelnы в нескольких местах в lcl .inc связаных с лукапом. Так вот, когда он перебирает лукапкомбобоксы после Cancel он имена полей получает позже, чем данные каким-то образом. Т.е. в объекте имя указывается одно а данные от следующего имени. Т.е. у него до момента падения распечатываются так:
имя лукапа 1, а данные из лукапкомбобокса 2
имя лукапа 2, а данные из лукапкомбобокса 3
.....
имя лукапа N, а данные из лукапкомбобокса N+1, которого не существует и ссылка ушла на обычный TEdit который существует, поэтому не nil, но у которого просто нету свойства Count

Причём, при загрузке формы он тоже перечисляет, но правильно. Там всё совпадает. Это начинается только при Cancel.
Волшебство, описанное выше, оказалось в следующем.
Когда я удалил на этой форме обычный комбобокс, который даже не DB, а простой у меня на форме один есть и создал его в последнюю очередь, то при перечислении:
имя лукапа N, а данные из обычного комбобокса
Ничего после этого не падает, но это какой-то зверский глюк. Я не нашёл где идёт опережение получения данных.
Тут: http://freepascal.ru/forum/viewtopic.ph ... 15#p112120 всё печатается как надо без опережения.
Могу предположить, что если я удалил бы на форме и пересоздал ВСЕ комбобоксы заново, то ошибка бы тоже ушла, но это было бы как раз волшебство компилятора и/или лазаруса при переходе с версии на версию.
Последний раз редактировалось tema 14.03.2017 19:07:51, всего редактировалось 1 раз.
tema
постоялец
 
Сообщения: 310
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение zub » 06.03.2017 07:30:20

Никто так не излагает на буржуйском как минимальный компилируемый и воспроизводящий пример. А заодно и на русском - часто пока делаешь, понимаешь где ошибся.
Скриншоты окна ошибки, да еще и не на буржуйском на багтрекере вообще никчему.
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 06.03.2017 16:09:29

tema писал(а):Могу предположить, что если я удалил бы на форме и пересоздал ВСЕ комбобоксы заново, то ошибка бы тоже ушла, но это было бы как раз волшебство компилятора и/или лазаруса при переходе с версии на версию.

Вы неправильно предполагаете, на самом деле, в предыдущих версиях компилятора или Лазаруса была ошибка, а в новых версиях этот баг уже исправили. Однако, постольку поскольку Ваш код с ошибкой сделан на старом Лазарусе(в котором был сбой), то Ваш код и выдаёт Вам сбой. А когда вы пере-создаёте комбобоксы в исправленном Лазарусе, то ошибка из старого кода исчезает и всё работает. Но скорее всего, сбой Вашей программы находится в третьем месте, о котором вы даже не пытаетесь задуматься, потому что, Вы, почему-то это не хотите даже проверить.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2827
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение pupsik » 06.03.2017 17:20:59

tema попробуйте по иному: в SQLQuery1 заполните параметры UpdateSQL. Это в вашем, на багтреке, сорце.
pupsik
энтузиаст
 
Сообщения: 944
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение tema » 06.03.2017 19:48:14

pupsik писал(а):tema попробуйте по иному: в SQLQuery1 заполните параметры UpdateSQL. Это в вашем, на багтреке, сорце.

Вы уже попробовали?
tema
постоялец
 
Сообщения: 310
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение pupsik » 06.03.2017 20:40:43

Вы уже попробовали?
я миранду не использую... И ставить ради эксперимента нет желания. Если "баг" связан только с компонентами доступа могу проверить на литле. Если, конечно, лень пересилю :lol:
Да и баг, скорее всего "накручен". Т.е. не там копали. Почему то такое ощущение...
pupsik
энтузиаст
 
Сообщения: 944
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение tema » 07.03.2017 01:19:27

vitaly_l писал(а):
tema писал(а):Могу предположить, что если я удалил бы на форме и пересоздал ВСЕ комбобоксы заново, то ошибка бы тоже ушла, но это было бы как раз волшебство компилятора и/или лазаруса при переходе с версии на версию.

Вы неправильно предполагаете, на самом деле, в предыдущих версиях компилятора или Лазаруса была ошибка, а в новых версиях этот баг уже исправили. Однако, постольку поскольку Ваш код с ошибкой сделан на старом Лазарусе(в котором был сбой), то Ваш код и выдаёт Вам сбой. А когда вы пере-создаёте комбобоксы в исправленном Лазарусе, то ошибка из старого кода исчезает и всё работает. Но скорее всего, сбой Вашей программы находится в третьем месте, о котором вы даже не пытаетесь задуматься, потому что, Вы, почему-то это не хотите даже проверить.

Я создал тестовую программу с нуля на новом лазарусе. И прикрепил её на багртрекер. Можете посмотреть там ссылка есть в первом сообщении. Там проблема присутствует. Если эту же программу запустить на 1.6.2, то проблема уходит. Очень много времени исследований привели меня к тому, что баг даже не в комбобоксах, а в модальных формах. Просто отражается он именно на комбобоксы. Я нашёл файл с проблемой и даже прикрепил патч. Вы написали Ваш пост не заходя по ссылке из первого сообщения на багртекер фрипаскаля? Почему Вы, даже не вникая в проблему, не читая мои сообщения и ссылки, пишете, что я не пытаюсь задуматься или что-то проверить?
tema
постоялец
 
Сообщения: 310
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение pupsik » 07.03.2017 02:03:17

Вы написали Ваш пост не заходя по ссылке из первого сообщения на багртекер фрипаскаля? Почему Вы, даже не вникая в проблему, не читая мои сообщения и ссылки, пишете, что я не пытаюсь задуматься или что-то проверить?
почему? Да потому что вы роете не там... Вот почему какой то список будет виновен в ваших ошибках? Теперь уже модальность формы - ужс. Но всё равно модальность взаимодействует с боксом :mrgreen:

Я уже писал: не надо с реляционной бд работать как с дбфником. Но: если вы это делаете то почему виноват кто то иной? В данном варианте бокс и модальность? Вы писали что с like и похожим знакомы. Ну так пользуйтесь ими...
Или вы считаете select - полный контроль и реляционность?

Читал я и предыдущий пост и багтрек, и смотрел сорцы. Пользы вам от этого не будет.

Я уже вас спрашивал: что произойдёт после Edit. Могу уточнить: до этого... В вашем случае ави. Которую вы ищете по всем сорцам. но не там где надо. Лазарь не мистическое существо которое может угадать структуру бд и адекватно работать с ней. Его надо корректно подтолкнуть.

Вы дали исходник. С вашей точки зрения там баг. С моей - ваша ошибка. Тем более исходник не полный. Не заполнены необходимые св-ва. Зато есть попытка их использования.

У вас не ругается 1.6 версия - замечательно. А почему более свежая версия орет благим матом? Неужели она так постарела и страдает маразмом? Баги в лазаре есть но не надо их придумывать.

п.с.
По поводу бряков в тексте... Несколько раз всплывала эта тема на буржуйском форуме. Возможно что то там найдёте полезное.

Кстати: не вы один таким страдаете. Вроде на этом форуме всплывало похожее. Да и не только на этом.

Добавлено спустя 4 минуты 34 секунды:
И да..: я попробовал импортнуть ваши сорцы и структуру на литл. И да АВ вылетает. Но..о боксы и модальность никакого дела к этому не имеют.
pupsik
энтузиаст
 
Сообщения: 944
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение tema » 07.03.2017 04:03:37

Изображение
tema
постоялец
 
Сообщения: 310
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение vitaly_l » 07.03.2017 08:42:35

tema писал(а):Я нашёл файл с проблемой и даже прикрепил патч.

Очень интересная мысль. Если Вы смогли найти файл с проблемой, очевидно способны и найти сам баг в этом файле. Если баг там действительно присутствует, то нужно указать конкретно на сам баг. И сказать, в багтрекере: в файле xxx.inc на строке №ххх находится вот такая-то ошибка.

Такое изложение бага (с указанием на ошибку в коде): будет коротко, понятно и ясно - на любом языке. А иначе, например, то, что вы написали вверху (с просьбой перевести это на буржуинский), я даже на русском - не понимаю, т.к. вы указали на симптомы появляющиеся абсолютно при "любом" баге.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2827
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение pupsik » 07.03.2017 11:22:51

Ковыряем далее. Появились странности:
1. Бокс достаточно "привязать" к лукап полю, или его необходимо конфигурировать? Т.е. у вас он к лукапу привязан. Кажись - не верно.
2. Если сделать нормальную привязку по полю (бокса) то лазарь адекватно посылает на sql модификации. Т.е. нет его.
3. При открытии формы Edit не обязателен. Потому что бокс, при смене значения, переводит датасет в режим редактирования.
4. По поводу post... Applyupdate - вроде как.. Хотя можно и post.

Лукап поле + бокс по лукапу -занятное облегчение работы программы.

п.с.
Чем дальше тем больше не вижу бага в лазаре. А вот в структуре вашего примера они есть.
pupsik
энтузиаст
 
Сообщения: 944
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение tema » 07.03.2017 14:11:49

vitaly_l писал(а):
tema писал(а):Я нашёл файл с проблемой и даже прикрепил патч.

Очень интересная мысль. Если Вы смогли найти файл с проблемой, очевидно способны и найти сам баг в этом файле. Если баг там действительно присутствует, то нужно указать конкретно на сам баг. И сказать, в багтрекере: в файле xxx.inc на строке №ххх находится вот такая-то ошибка.

Такое изложение бага (с указанием на ошибку в коде): будет коротко, понятно и ясно - на любом языке. А иначе, например, то, что вы написали вверху (с просьбой перевести это на буржуинский), я даже на русском - не понимаю, т.к. вы указали на симптомы появляющиеся абсолютно при "любом" баге.

Эта ошибка довольно сложная. Но я так и указал, какие строчки надо убрать, а какие добавить.
Постараюсь ещё раз объяснить суть ошибки. В какой-то момент на модальной форме по разным событиям и/или причинам начинают перебираться все контролы. Так вот, в указанном мною файле почему-то два раза происходит рефреш хендла. При этом идут глюки, которых я не в силах осознать: во время перебора контролов мы видим имя одного контрола, а вот адреса его компонентов оказываются перепутаны и TStrings, какой-нибудь начинает указывать совсем не на TStrings, но там куда он указывает что-то имеется от другого контрола, поэтому не nil, но и не TStrings. Причём что именно там за структура определить так же нереально, т.к. обрушение происходит даже при попытке выяснить имя структуры или попробовать проверить соответствие, например if FLookup.ControlItems is TStrings then showmessage('ok'); Это уже когда происходит обрушение. А до обрушения этот самый TStrings получает адрес следующего в очереди перебора контрола. Т.е., грубо говоря, если на контроле два мемо и он перебирает их в порядке мемо1 -> мемо2, то когда он рассматривает мемо1, то в свойстве Lines будет lines от мемо2, а не от мемо1. Это можно распечатать и проверить прямо. Я печатал от FLookup.ControlItems и имя структуры и text и получал именно этот глюк. Без модальной формы глюка нет. Во время открытия формы тоже глюка нет, а вот во время закрытия, т.к. закрытие одновременно с Post или Cancel есть.
tema
постоялец
 
Сообщения: 310
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение pupsik » 07.03.2017 14:26:08

по разным событиям и/или причинам
и вы считаете что не являетесь этой причиной (событием)?
Вот неужто так сложно добавить этот updatesql (точнее заполнить св-ва запроса по нормальному)? И выявить: была ли кошка.
Модальное/не модальное... Вытащите датасеты в датамодуль.
pupsik
энтузиаст
 
Сообщения: 944
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение vitaly_l » 07.03.2017 15:07:12

С одной стороны Вы говорите:
tema писал(а):я так и указал, какие строчки надо убрать, а какие добавить

С другой стороны, Вы говорите:
tema писал(а):При этом идут глюки, которых я не в силах осознать

Это говорит, о том что, Вы - явно не понимаете суть проблемы и истинную причину сбоя. Ещё раз попробую объяснить, то описание которое Вы даёте, наблюдал почти каждый программист на этом форуме. Потому что, то, что Вы описываете - стандартная ситуация при обрушении чего-то там. И как правило, это отображается на элементах, которые никак не связаны с багом.

То что, после добавления, например самой обыкновенной кнопки на форму, у Вас ВДРУГ неожиданно пропадёт этот "волшебный" глюк - ещё не значит, что Вы исправили баг.

Соответственно, бессмысленно указывать в описании на симптомы (как в русском так и в буржуйском описании). Но если Вы явно нашли баг и умом осознали его причину, то тогда Ваше описание - будет выглядеть иначе и проще, т.к. Вы перестанете сообщать "о симптомах" и ясно и кратко укажите на конкретную ошибку.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2827
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение tema » 07.03.2017 15:28:50

Я же указал на конкретную ошибку и объяснил конкретную причину:
tema писал(а): в указанном мною файле почему-то два раза происходит рефреш хендла..

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

Добавлено спустя 8 минут 19 секунд:
pupsik писал(а):
по разным событиям и/или причинам
и вы считаете что не являетесь этой причиной (событием)?

Это происходит и без моего вмешательства. Перебор контролов происходит по разным причинам в разные моменты времени.
pupsik писал(а):Вот неужто так сложно добавить этот updatesql (точнее заполнить св-ва запроса по нормальному)? И выявить: была ли кошка.

Не сложно. Нет необходимости. Ошибка не в updatesql. Кроме того, в проекте у меня он заполнен.
pupsik писал(а):Модальное/не модальное... Вытащите датасеты в датамодуль.

Это не нужно, чтобы не мусорить, я их специально разместил там, чтобы эти датасеты создавались вместе с окном. Без этого окна эти датасеты просто не нужны.
tema
постоялец
 
Сообщения: 310
Зарегистрирован: 24.03.2011 20:19:27

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru