Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.07.2011, 13:25   #1
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
Вопрос Debug - как заставить Delphi точно указать на строку кода вызывающую ошибку?

Здравствуйте!
В замороченном проекте с кучей кода и окон в одном месте постоянно выскакивает "Could not convert variant of type (Null) into type (Double)". (Небольшая ремарка - конечно это само по себе бред полный, тк Null это "пусто" и при переделке "пусто" в любой формат хоть строки, хоть числа, чего угодно всё равно должно получиться "пусто", ну да ладно, оставим это на совести разработчиков Delphi.) Проблема том, что в месте где возникает ошибка происходит подряд целая цепь событий: создание окна, загрузка данных, выбор данных, создание другого окна, передача параметров, обновление данных БД, формирование отчёты FastReport. Много всего и куча данных - понять что где глючит не зная места и данных невозможно.

Пробовал ставить BreakPoints, запускать в режиме Trace To Next Source Lines, жать break когда выскакивает ошибка, итд - без толку, ошибка просто появляется и откуда берётся непонятно! (Понятно лишь, что при нажатии на кнопку, но там такое кол-во сразу выполняется процедур и данных, что ого-го.)

Если ли какой-то способ заставить Delphi чётко указать на строку кода, в которой возникает ошибка и желательно отобразить переменную и данные в удобоваримом виде которые вызывают ошибку?

PS Попутно вопрос по датам - если при вводе Дата не указана, то может ли она везде (Delphi,Firebird,FastReport) быть null? или null в контексте Даты вызывает ошибку? Как тогда передавать "дата не указана", чтобы в БД сохранилось как null?

Последний раз редактировалось delphicoding; 28.07.2011 в 13:49.
delphicoding вне форума
Старый 28.07.2011, 13:49   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Если ошибка в недрах фастрепорта, строку оно не покажет, максимум CPU. Можно включить компиляцию с отладочными версиями модулей (Use debug .dcus), и смотреть по стеку, кто кого вызвал. Но, имхо, толку от этого не много. Выяснится, что у вас где-то в отчёте поле с датой, а в базе Null. Ну и чем поможет вам конкретная строка? Настройки отчета надо менять, скорей всего.

> E2010 Incompatible types: 'TStrings' and 'string'.

Ну дык, TStrings — это список строк, а не строка. У него есть свойство Text, если нужны все строки слепленные оттуда.

> конечно это само по себе бред полный...всё равно должно получиться "пусто"

Null для того и ввели, чтобы отличать пустую строку от строки, которую не ввели.

Не в обиду, но ваши ремарки очень напоминают одного известного литературного героя )

Цитата:
... и вы в присутствии двух людей с университетским образованием позволяете себе с развязностью совершенно невыносимой подавать какие-то советы космического масштаба и космической же глупости о том, как все поделить... А в то же время вы наглотались зубного порошку...
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума
Старый 28.07.2011, 13:56   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

эмм MadExcept, EurekaLog?
Отладка построчно?
Человек_Борща вне форума
Старый 28.07.2011, 15:08   #4
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
Выяснится, что у вас где-то в отчёте поле с датой, а в базе Null. Ну и чем поможет вам конкретная строка?
Печально. Ковыряйся до посинения ищи что где и почему, но Delphi тебе в этом не поможет!... нде... что, неужели нельзя никак стандартными средствами отобразить хотя бы название или значение переменной, которая вызывает ошибку?! Ну и конечно хотелось бы знать где ошибка - при передачи параметров между окнами, при обработке, при передаче в БД или в отчёт или в самом отчёте... что-то делфи начинает сильно раздражать...
Цитата:
Null для того и ввели, чтобы отличать пустую строку от строки, которую не ввели.
В БД кажется разницы нет... null и есть пустота. Да и все поля для ввода вряд-ли в данном контексте могут иметь два разных состояния - всяко ведь "пусто"... ну и совсем никакого смысла различать "пусто" по разным классам - это вообще шиза уже.
Цитата:
Отладка построчно?
Таки делал, не показывает строку точно... просто вдруг возникает ошибка. Точнее видно, на какой строке остановилось выполнение программы, там строка вызывающая другую процедуру и передающая в ту процедуру около 10 параметров... даже если предположить самое вероятное - что проблема в присвоении одному из параметров вызываемой процедуры данных другого формата, всё равно остаётся совершенно неясным какой из параметров вызывает ошибку! и уж тем более непонятно какие там вдруг возникли такие неправильные данные?!?!?!

На*уй нужен такой дебагинг не показывающий значений и названий переменных ?!

Последний раз редактировалось delphicoding; 28.07.2011 в 15:11.
delphicoding вне форума
Старый 28.07.2011, 17:32   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

видимо вы не умеете отлаживать. Все показывает. можно смотреть и значения переменных... что угодно в общем.
Человек_Борща вне форума
Старый 28.07.2011, 18:22   #6
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Подскажите, пожалуйста, как же можно узнать имя переменной и значение, которое вызвало ошибку?
delphicoding вне форума
Старый 28.07.2011, 18:36   #7
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
На*уй нужен такой дебагинг не показывающий значений и названий переменных ?!
Вот не нужно тут выражаться в таком тоне, если не разобрались до конца...

По теме, построчная отладка практически всегда дает результат...Следовательно, инструмент в "зубы" и искать ошибку...И да, как говорили, на крайний случай можно EurekaLog воспользоваться...

Цитата:
как же можно узнать имя переменной и значение, которое вызвало ошибку?
Ставим бряку в месте, где возникает ошибка и пытаемся понять, что там не так (наводим на переменные и получаем их значения или же Ctr+F7)...тем более, что предположительно уже известно место ошибки, исходя из этого:
Цитата:
Точнее видно, на какой строке остановилось выполнение программы, там строка вызывающая другую процедуру и передающая в ту процедуру около 10 параметров...
вот заходим в ту процедуру и смотрим чего там происходит такого...
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 28.07.2011 в 18:38.
spamer вне форума
Старый 28.07.2011, 21:26   #8
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Как написано в первом постинге открывающем тему - построчная отладка использовалась, но однозначного ответа получено не было, тк строка на которой всё встало - передаёт массу значений в другой юнит... что именно вызвало ошибко и как называется эта переменная - неизвестно...
Цитата:
вот заходим в ту процедуру и смотрим чего там происходит такого...
Напоминает "после сборки обработать напильником"... пфф...

Придумал как можно проверить, только не знаю как это реализовать... вопрос разумеется тупой - есть юнит DataModule, то есть без формы, в нём много чего происходит, а на выходе должен быть заполнен Datasource данными. Как можно из этого DataModule при помощи чистого кода создать нечто вроде текстового окна с кнопкой ОК/Закрыть и залить в это окно или некий графический объект все данные из Datasource (или Dataset) - чтобы наконец таки проверить все значения...

Последний раз редактировалось Stilet; 29.07.2011 в 07:49.
delphicoding вне форума
Старый 28.07.2011, 23:14   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Напоминает "после сборки обработать напильником"... пфф...
а вы думали что программирование как детский конструктор лего?
Цитата:
что именно вызвало ошибко и как называется эта переменная - неизвестно...
ставим бряк, и смотрим, какая же из переменных Null.(у вас же есть текст ошибки)
кстати, если процедура ваша, то есть сорцы на нее есть, то можно войти внутрь нее, что еще точнее выяснить ошибку.
ну а если нет сорцов, то...проверять пять раз параметры, и читать справку по тому, какие параметры какое значение могут принимать, а каким нельзя передавать.

блин, я пишу сейчас на С++(под голым MinGW), то есть без отладчика, умудряюсь отлаживать программу, а вы с отладчиком не можете проверить параметры...ну на крайняк можете написать
Код:
ShowMessage(Param)
(конвентирование если нужно напишите, это не холивар, просто на заметку)
Цитата:
Как можно из этого DataModule при помощи чистого кода создать нечто вроде текстового окна с кнопкой ОК/Закрыть и залить в это окно или некий графический объект все данные из Datasource (или Dataset) - чтобы наконец таки проверить все значения...
отладчиком итак это можно сделать(Ctrl+Click), да и при наведении итак покажет(у меня все показывало), + можно еще через инспектор наблюдать.
ну а если хотите сами, то создаете форму с мемо, и заполняете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 28.07.2011 в 23:17.
Пепел Феникса вне форума
Старый 29.07.2011, 00:57   #10
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Имея опыт работы с наборами данных, могу предположить что проблема в нем.
На счет "маркера" Null, в наборе данных, при при редактировании поля записи, если в нем не содержится символов то функция возвращает True при вызове IsNull.
Возможные ошибки в методе GetFieldData класса TDataSet (набора данных). FastReport и др. компоненты используют БД, а именно набор данных, который содержит ошибки. Советую найти/написать (не советую, пару выброшенных месяцев) набор данных. какую СУБД и набор данных используете?
Хотелось бы задать автору еще один вопрос: проект уже относительно большой, как Вы пишите программу, без тестирования каждой своей подпрограммы?
На счет отладки программы: знания места, которое вызвало исключительную ситуацию не всегда даст однозначное решение устранения ошибки, но дает программисту повод задуматься в эти слова...
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 29.07.2011 в 01:00.
chertovich вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли заставить рассматривать некую строку текста kaljan775 Общие вопросы C/C++ 4 14.01.2011 05:17
Как заставить Delphi игнорировать регистр? Akronis Общие вопросы Delphi 2 20.11.2009 23:30
Указать на ошибку valerij Microsoft Office Excel 15 26.10.2008 13:31
Как заставить Delphi 2005 проигрывать сжатые DivX'ом AVI-файлы??? Valdis Компоненты Delphi 5 16.09.2007 23:25
Как заставить Delphi 2005 проигрывать сжатые DivX'ом AVI-файлы? Valdis Общие вопросы Delphi 1 08.09.2007 19:20