powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как TDataSet работает с датой
7 сообщений из 7, страница 1 из 1
Как TDataSet работает с датой
    #32294100
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет и наилучшие.

Заинтересовался одной статьей на RSDN-е.
http://www.rsdn.ru/article/delphi/dbcontrols.xml

Стал пробовать, и напоролся на грабли при работе с датой.
Может у нас кто сможет помочь.
Мой вопрос там в обсуждении статьи (ссылка вверху).
Если кто читал статью или сталкивался с этой темой, посмотрите плиз.
...
Рейтинг: 0 / 0
Как TDataSet работает с датой
    #32294268
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кто читал статью или сталкивался с этой темой, посмотрите плиз.

Если есть проблемма, то излагай. А теорию мы и без подсказок почитаем.
...
Рейтинг: 0 / 0
Как TDataSet работает с датой
    #32294290
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть проблема.
Просто в том форуме были ответы автора.
Может, они были бы полезны.

Вот сам вопрос. Немного длинновато, правда:
автор писал:Здравствуйте, Максим Гумеров.

Заинтересовался вашей статьей и решил попробовать Вашего наследника TDataSet.
При этом столкнулся с ошибкой при отображении даты.
Как правильно поместить значение даты в Data?
У меня такой код

Код: plaintext
TDateTime(Data) := TMyRecord(List[Index]).Date;


вызывает ошибку

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EConvertError with message ''0.37904' is not a valid timestamp'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Нашел, что ошибка возникает здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
  function NativeToDateTime(DataType: TFieldType; Data: TDateTimeRec): TDateTime;
  var
    TimeStamp: TTimeStamp;
  begin
    case DataType of
      ftDate:
        begin
          TimeStamp.Time :=  0 ;
          TimeStamp.Date := Data.Date;
        end;
      ftTime:
        begin
          TimeStamp.Time := Data.Time;
          TimeStamp.Date := DateDelta;
        end;
    else
      try
        TimeStamp := MSecsToTimeStamp(Data.DateTime); // Попадает сюда
      except
        TimeStamp.Time :=  0 ;
        TimeStamp.Date :=  0 ;
      end;
    end;
    Result := TimeStampToDateTime(TimeStamp); // и здесь возникает ошибка 
  end;

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
asm
        PUSH    EBX
{$IFDEF PIC}
        PUSH    EAX
        CALL    GetGOT
        MOV     EBX,EAX
        POP     EAX
{$ELSE}
        XOR     EBX,EBX
{$ENDIF}
        PUSH    EAX
        CALL    ValidateTimeStamp // Вот тут вот
        POP     EAX
        MOV     ECX,[EAX].TTimeStamp.Time
        MOV     EAX,[EAX].TTimeStamp.Date
        SUB     EAX,DateDelta
        IMUL    [EBX].IMSecsPerDay
        OR      EDX,EDX
        JNS     @@ 1 
        SUB     EAX,ECX
        SBB     EDX, 0 
        JMP     @@ 2 
@@ 1 :    ADD     EAX,ECX
        ADC     EDX, 0 
@@ 2 :    PUSH    EDX
        PUSH    EAX
        FILD    QWORD PTR [ESP]
        FDIV    [EBX].FMSecsPerDay
        ADD     ESP, 8 
        POP     EBX
end;


В чем причина, никак не могу понять.

С уважением, Артем.

Там еще дальше были посты, но ответа мы так и не нашли,
так что их я не привожу. И так длинно получилось.
...
Рейтинг: 0 / 0
Как TDataSet работает с датой
    #32294305
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Артем, с извинениями.

Ты не про стандартных наследников говорил, а про 3-party. Так что могу тока промолчать. Я предположил о немного другой проблемме, которая иногда возникает при работе с датами из Delphi c сиквелом. Еще раз куча извинений.
...
Рейтинг: 0 / 0
Как TDataSet работает с датой
    #32295267
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Up.

Ну что, никаких мыслей нет ни у кого?
Жаль, идея была хорошей. (по крайне мере мне понравилась).
Или может вопрос непонятен/некорректно сформулирован?
...
Рейтинг: 0 / 0
Как TDataSet работает с датой
    #32295343
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну а чего тут военного-то. Вы текст той ф-и, где ошибка, смотрели?
Код: plaintext
1.
2.
3.
4.
5.
procedure ValidateTimeStamp(const TimeStamp: TTimeStamp);
begin
  if (TimeStamp.Time <  0 ) or (TimeStamp.Date <=  0 ) then
    ConvertErrorFmt(@SInvalidTimeStamp, [TimeStamp.Date, TimeStamp.Time]);
end;


а здесь дата принудительно обнуляется, так я понял, и срабатывает второе условие.
Сначала надо Validate вызывать, а уж потом дату обнулять. или не обнулять вообще.
...
Рейтинг: 0 / 0
Как TDataSet работает с датой
    #32296090
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
Текст этой функции я знаю наизусть.
А где это у меня дата принудительно обнуляется?
Если вы имеете в виду этот кусочек,
Код: plaintext
1.
2.
3.
4.
5.
6.
      try
        TimeStamp := MSecsToTimeStamp(Data.DateTime); // Попадает сюда
      except
        TimeStamp.Time :=  0 ;
        TimeStamp.Date :=  0 ;
      end;
    end;

то в except программа не заходит. Проверял.
Я понимаю, что у меня TimeStamp.Date нулевая после строки
Код: plaintext
TimeStamp := MSecsToTimeStamp(Data.DateTime); 

но почему, убейте, понять не могу.

зы: может тупой савсем? :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как TDataSet работает с датой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]