![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Или DBGridEh, или код, или еще чего, но глючит прикольно: [D6, D7, FireBird 1.0]
Miwa © (2004-03-23 17:43:00)При щелчке на гриде вызывается перерисовка PaintBox-a.
procedure TfrmMain.dbgStatsCellClick(Column: TColumnEh);
begin
pntExtInfoPaint(self);
end;
А собственно перерисовка делается так:
procedure TfrmMain.pntExtInfoPaint(Sender: TObject);
var arr: array [1..10] of TDateTime;
c:integer;
total:integer;
ttim:integer;
begin
try
pntExtInfo.Canvas.FillRect(pntExtInfo.ClientRect);
total:=0;
with dtmData.idsExtInfo do
while not Eof do begin
//37987 = 01.01.2004
//id=0,client=1,start=2,time=3,file=4
c:=trunc((Fields[2].AsDateTime - 37987)/(now - 37987)*10)+1;
arr[c]:=arr[c]+Fields[3].AsDateTime;
Next;
inc(total);
end;
for c:=1 to 10 do
pntExtInfo.Canvas.TextOut(10, c*20, FormatDateTime('h:nn:ss',arr[c]));
ttim:=dbgStats.Fields[2].AsInteger;
pntExtInfo.Canvas.TextOut(10,220,Format('Всього звернень: %d.', [total]));
pntExtInfo.Canvas.TextOut(10,240,FormatDateTime('Загальна тривалість: h:nn:ss',inttotime(ttim)));
except
showmessage(format('c = %d db = %f',[c,dtmData.idsExtInfo.Fields[3].AsDateTime])+#13#10+
SysErrorMessage(GetLastError));
end;
end;
Веселье состоит в том, что except выдает примерно такое:
с = 4 db = 0.00
Операция виполнена успешно
И выдает до тех пор, пока в самом гриде не щелкнуть дважды по какой-либо клетке (перевести ее в режим редактирования).
Вообще-то, по большему счету надо просто с таблицы
VIEW_ID: integer (PK)
VIEW_CLIENT: integer (FK)
VIEW_START: TimeStamp
VIEW_TIME: Time
VIEW_FILE: integer (FK)
получить сумму по полю VIEW_TIME за некоторые отрезки времени (в коде - это arr: array [1..10] of TDateTime; реально, конечно, может быть больше или меньше, чем 10).
Вот.
Miwa (2004-03-29 16:16:00) [1]>А BreakPoint на ShowMessage поставить не судьба?
Да все я ставил, все судьба. Проблема оказалась до безобразия тупой: Я НЕ ИНИЦИАЛИЗИРОВАЛ МАССИВ ARR!!!!!
Когда я это понял, то от моего мата проснулись все домашние ;о))).
Всем спасибо за внимание.
З.Ы. Кстати, приведенного кода достаточно для того, чобы понять мою ошибку, в следствии чего риторический вопросс: что это было, что никто не заметил столь вопиющего безобразия? ;о))
ЮЮ (2004-03-29 03:28:00) [2]>Ищу, не получается.
А BreakPoint на ShowMessage поставить не судьба?
А дальше смотри, где могди свалиться.
Если dtmData.Eof, значит в цикле по i: или в каком-нибудь из arr[j] мусор лежит, или inttotime для этого ttim валится,
если нет, то вылетели в цикле считывания данных
Miwa (2004-03-27 22:24:00) [3]>Какое отношение к.-л.грид имеет к ФБ ?
Наверное, никакого, но я и не связывал их, наксолько я помню.
>А объяснение странностей начинается с поиска ошибки в программе.
Ищу, не получается.
>А в IDE перед showmessage какой Exception вылетает?
Когда код немножко переработал:
except
on err: Exception do ShowMessage(err.Message)
</CODE
Получаю "Invalid floating point operation".
ЮЮ (2004-03-26 03:17:00) [4]А в IDE перед showmessage какой Exception вылетает?
Johnmen (2004-03-25 08:58:00) [5]Какое отношение к.-л.грид имеет к ФБ ?
А объяснение странностей начинается с поиска ошибки в программе...
miwa (2004-03-25 08:43:00) [6]К моему большому сожалению - нет. Тоесть, в общем случае Вы правы - индексы надо проверять. Но в данном. Индекс все же правильный, да и в формулировке вопросса я привел вывод процедуры ShowMessage, которая срабатывает в блоке "except":
с = 4 db = 0.00
Операция виполнена успешно
Я вот что думаю: раз "Операция выполнена успешно", значит это ошибка Файрбэрда, а не ОС, да? Но какая? Это я все о том же странном поведении грида.
Miwa (2004-03-25 08:38:00) [7]Вы полностью правы, да только...
Только что подумал. Данные-то с логов берутся, которые начались вести с 1 января, но никто никому не мешал на машине дату сменить и...
Неа, на программировании не учили - я программированию все больше сам учусь, да вот "Мастера Дельфи" помагают :о)).
Лезу посмотреть, щас скажу, правы ли Вы.
ЮЮ (2004-03-25 06:35:00) [8]А откуда уверенность, что (Fields[2].AsDateTime - 37987) это часть (now - 37987) ?
На сегодня now - 37987 = 84.
Если Fields[2].AsDateTime на 90 дней раньше сегодня, то
Fields[2].AsDateTime - 37987 = -6
trunc((-6) / 84 *10 ) + 1 и рядом не лежало с диапазоном 1..10
>Так на математике говорили :о)).
А на программировании не учили контролировать индексы? :-)
miwa (2004-03-25 03:17:00) [9]Расчет. Плюс тестовый цикл.
Для того, чтобы узнать отношение части к целому, надо поделить первое на второе. Если результат умножить на n, отбросить дробную часть и к полученному числу добавить единицу, то получится целое число в диапазоне 1..n. Так на математике говорили :о)).
А я все еще веселюсь...
ЮЮ (2004-03-25 02:52:00) [10]>c:=trunc((Fields[2].AsDateTime - 37987)/(now - 37987)*10)+1;
>arr[c]:=arr[c]+Fields[3].AsDateTime;
Откуда уверенность, что с в первом операторе обязательно окажется в диапазоне 1..10 ?
Miwa (2004-03-25 00:23:00) [11]Господа, вопросс о гриде все еще актуален и я все еще веселюсь :о((.
Miwa (2004-03-24 15:36:00) [12]Временные отрезки пока не определены. В приведенном коде есть только общее начало (37987, тоесть 1 января 2004 года) и конец (now). Этот интервал разделен на 10 равных частей. А в реальной работе эти величины будут определятся пользователем.
Да, и еще. Вопросс о странном поведении грида остается актуальным.
Johnmen (2004-03-24 10:11:00) [13]Ты опять говоришь про временные отрезки, но не говоришь однозначно где они и как определены.
miwa (2004-03-23 20:06:00) [14]Хорошо, спасибо, сумма есть. Остальное должно бы приложиться. Правда, есть ли вариант лучше, чим придуманный с ходу
where view_start between :T1 and :T2
для каждого временного отрезка? Это ведь будет n запросов вместо одного...
Johnmen (2004-03-23 18:46:00) [15]Да, с суммированием немного прогнал...
Надо так
sum(view_time-cast('00:00:00' as time))
получим количество секунд.
Т.е. арифметические действия справедливы для интервалов.
miwa (2004-03-23 18:30:00) [16]А нету их, концов. Динамически, тоесть, формируются. Как правило - за неделю, но может быть и иначе.
А по time сума не заканает:
select sum(view_time) from views
data type not supported for arithmetic.
Johnmen (2004-03-23 18:15:00) [17]>miwa © (23.03.04 18:07) [2]
>cумму по полю VIEW_TIME
Просто SUM(VIEW_TIME )
>за некоторые отрезки времени
Не понял, где начала и концы отрезков ?
miwa (2004-03-23 18:07:00) [18]2 Johnmen © (23.03.04 17:56) [1]:
Да я в курсе, только говорю - это я пытають получить cумму по полю VIEW_TIME за некоторые отрезки времени (в коде - это arr: array [1..10] of TDateTime; реально, конечно, может быть больше или меньше, чем 10).
Johnmen (2004-03-23 17:56:00) [19]Не доведет до добра смешивание в кучу процедур отображения и навигации...