Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Или 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]

Не доведет до добра смешивание в кучу процедур отображения и навигации...


Наверх

Титульная страница Поиск, карта сайта Написать письмо