Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.07.2011, 13:25
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
Восклицание 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.
Ответить с цитированием
  #2  
Старый 28.07.2011, 15:21
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Может быть как - нибудь и можно, но я в подобных случаях пользуюсь дедовским методом.
Подозрительный код методически "окружаю" вот такими сообщениями

Код:
ShowMessage('Точка 1 Входим');
.......
.......
.......
ShowMessage('Удачно вышли');
Нудно, но очень эффективно. Я этим всегда пользуюсь.
По поводу 2 вопроса.
Не уверен, но попробуй проверить, допускает ли поле базы данных сохранение значения Null.
Ответить с цитированием
  #3  
Старый 28.07.2011, 15:30
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

БД допускает. Но Delphi вот Дату как null что-то не очень воспринимает... или может FastReport ? Но кто-то из них явно не понимает var D:Tdate; D:=null;..

Как таки передавать Date пустую ???
Ответить с цитированием
  #4  
Старый 28.07.2011, 15:49
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

А null точно можно использовать? Помоему всю жизнь nil использовали в борланде.
Ответить с цитированием
  #5  
Старый 28.07.2011, 15:54
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Да в этом долбанном борланде чё тольк оне используют и nil и null и if =null и IsNull итд итп... бардак полнейший!
Ответить с цитированием
  #6  
Старый 28.07.2011, 18:01
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от delphicoding
Да в этом долбанном борланде чё тольк оне используют и nil и null и if =null и IsNull итд итп... бардак полнейший!
да нет, бардак как раз в голове у ТС в непонимании типов.
TDateTime = type Double;
естественно вещественый тип не может иметь пустое значение, в отличии от типа Variant.
Null это функция, которая возвращает пустое значение типа Variant:

Код:
unit Variants;

function Null: Variant;
begin
  _VarNull(TVarData(Result));
end;

при работе с датой в БД рекомендую такой подход:

Код:
var
  d: TDateTime;
begin
  if not Table1.FieldByName('date1').IsNull then
  begin
    d:=Table1.FieldByName('date1').AsDateTime; // получение значения даты, если поле заполнено
    Table1.FieldByName('date1').Clear; // очищаем значение поля
  end;
end;

nil используется с указателями.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 28.07.2011, 15:54
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

На этот вопрос к сожалению ответа не знаю.
Найди строку, в которой возникает ошибка. Возможно тогда всё и разрешится. У меня так было. Удачи.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter