Форум по 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, 15:54
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

На этот вопрос к сожалению ответа не знаю.
Найди строку, в которой возникает ошибка. Возможно тогда всё и разрешится. У меня так было. Удачи.
Ответить с цитированием
  #7  
Старый 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 используется с указателями.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 28.07.2011, 18:25
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Цитата:
естественно вещественый тип не может иметь пустое значение,
Очевидно ничего естественного в этом нет. Любой тип может и обязан быть пустым если ещё не задан или в данном случае необходимо чтобы был не задан...
То есть в Delphi не предусмотрено вообще пустая дата?! То есть нельзя оставить поле для ввода даты пустым и присвоить это некой переменной ?!
Ответить с цитированием
  #9  
Старый 28.07.2011, 21:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от delphicoding
Любой тип может и обязан быть пустым если ещё не задан
абсолютно не верно. "простые" типы (Integer, Real) не могут быть "пустыми" в принципе - например Integer это 4 байта и хранить признак пустого значения им просто негде. в отличии от "сложных" типов Variant, где VType := varNull.
Цитата:
Сообщение от delphicoding
То есть в Delphi не предусмотрено вообще пустая дата?! То есть нельзя оставить поле для ввода даты пустым и присвоить это некой переменной ?!
тип TDate тоже не может иметь "пустое" значение, т.к. это:
Цитата:
A TDate value represents the number of days that have elapsed since 12/30/1899.
поле "дата" БД естественно может буть пустым. но присвоение его к переменной TDate[Time] вызовет ошибку, когда оно пустое. естествено можно Variant использовать.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 28.07.2011, 22:13
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Цитата:
например Integer это 4 байта и хранить признак пустого значения им просто негде.
Потрясающе. А просто ничего не хранить они никак не могут?
Цитата:
тип TDate тоже не может иметь "пустое" значение, т.к. это:
Господи, какие дебилы это делали. К тому же ещё и в днях! Значит при каждом считывании/записи из полей/ресурсов отображающих нормальную дату - происходит конвертация и расчёт по годам и месяцам... ну что тут скажешь - ппц.
============================================

Придумал как можно проверить, тольк оне знаю как это реализовать... вопрос размуеется тупой - есть юнит DataModule, то есть без формы, в нём много чего происходит, а на выходе должен быть заполнен Datasource данными. Как можно из этого DataModule при помощи чистого кода создать нечто вроде текстового окна с кнопкой ОК/Закрыть и залить в это окно или некий графический объект все данные из Datasource (или Dataset) - чтобы наконец таки проверить все значения...
Ответить с цитированием
  #11  
Старый 29.07.2011, 15:30
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

После долгих ковыряний выяснилось, что в программе всё нормально. Баг либо в процедуре БД, либо при передаче параметров из программы в процедуру БД. Процедура явно работает, тк возвращает названия полей таблицы, но результат работы - пуст.
Пользуюсь IBExpert, можно в нём как-то посмотреть запросы/ответы к/из процедурам БД из рабочей программы? Как вообще можно узнать какие точно данные получила БД?
Ответить с цитированием
  #12  
Старый 29.07.2011, 15:52
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от delphicoding
А просто ничего не хранить они никак не могут?
Давай подумаем вместе. У нас есть оперативная память - непрерывный блок байт. Система выделила нам под переменную типа Integer 4 байта из этого блока. Как ты предлагаешь "ничего не хранить" в них?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #13  
Старый 29.07.2011, 16:23
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Давай подумаем вместе. У нас есть оперативная память - непрерывный блок байт. Система выделила нам под переменную типа Integer 4 байта из этого блока. Как ты предлагаешь "ничего не хранить" в них?
Луше начать с двоичной логики.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #14  
Старый 29.07.2011, 16:37
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну тогда уж с просто логики...
[/sarcasm]
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #15  
Старый 29.07.2011, 19:14
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Ну это совсем смешной вопрос для дебилоф.
Вы тут все типа умные программеры же, ага, вот тебе ответ:
[ У нас есть оперативная память - непрерывный блок байт. Система выделила нам под переменную типа Integer 4 байта из этого блока. Как ты предлагаешь "ничего не хранить" в них? ] := [ Это типа вопрос - чем же подтереть жопу, когда начал дристать посреди красной площади? ]

В 17 лет уже иметь восьмилетний стаж программирования, знать 4 языка... Это что-то значит
А у меня лучшая выпускная работа года в городе Москве, написана на QB. Это что-то значит?

Последний раз редактировалось delphicoding, 29.07.2011 в 19:17.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter