Проблема с StringGrid и датой, временем

LixeoN
Дата: 03.12.2007 10:11:22
Вопроса два.
1) Программа читает из текстового файла строки, и забивает содержимое строк в StringGrid. Делается как. Читаем строку, смотрим подходим ли она нам по условию, если да, то увеличиваем стринггрид.роукаунт+1 и пихаем туда эту строку.
+ к этому у мня для красоты сделано, что появляется поверх главной еще одна форма на которой Гауз (полоса с процентами) которая показывает скока % выполнено.

Вопрос: Мной замечено, что если записей много (допустим 15 тысяч) то он долго читает их из таблицы и пихает в СГ (и текстовый файл весом 500кб жрет, будучи в стринггриде, ~9,5мб ОЗУ).

Так вот если программу умудриться свернуть и развернуть, то чтение происходит мгновенно. Что это такое?
Была мысль что это из-за перерисовки таблицы, но таблица у меня на панели, панель в хайде в этот момент. (Да и я пробовал отдельно таблицу в хайд) - не помогло.

2) Впорос два
Есть два диапазона:
25.03.06-11.04.06 (дата)
13:58:45-14:12:15 (время)
И еще дата
01.04.06 - дата
14:02:49 - время
Вопрос как определить, входят ли указанные отдельно время и дата, в диапазон указанный выше.
И еслидиапазон дат можно здать в DateTimePicker, а строку из БД перевести ф-ей StrToDate, а затем их сравнить
if a>b then lalala
LixeoN
Дата: 03.12.2007 10:16:47
Ой, случайно отправил, дописываю:
И если диапазон дат можно здать в DateTimePicker, а строку из БД перевести ф-ей StrToDate, а затем их сравнить
if a>b then lalala
то с временем уже так неполучится, ибо в хелпе
procedure TForm1.Button1Click(Sender: TObject);

var
ATime: TDateTime;
begin
ATime := StrToTime(Edit1.Text);
if ATime < 0.50 then
ShowMessage('Good Morning')
else
ShowMessage('Good Afternoon');
end;


Я так понимаю 0.5 - это какое то процентное соотношение.
К тому же при
StrToTime(Dif[2])>Form1.TimePosle.Time
компилятор говорит мне о том, что я дурак, обосновывая это:
[Error] Unit1.pas(211): Operator not applicable to this operand type

Буду рад хоть какой-либо помощи.
Паренёг
Дата: 03.12.2007 12:14:52
автор
Так вот если программу умудриться свернуть и развернуть, то чтение происходит мгновенно. Что это такое?


А если не сворачивать - сколько времени занимает чтение?

автор
Я так понимаю 0.5 - это какое то процентное соотношение.


В дельфи если я не ошибаюсь даты храняться в вещественных переменных.

автор
К тому же при
StrToTime(Dif[2])>Form1.TimePosle.Time
компилятор говорит мне о том, что я дурак, обосновывая это:
[Error] Unit1.pas(211): Operator not applicable to this operand type


Dif[2] - что за овощь?
LixeoN
Дата: 03.12.2007 12:59:01
Паренёг
А если не сворачивать - сколько времени занимает чтение?

при 15к строк около полутора минут

Паренёг
В дельфи если я не ошибаюсь даты храняться в вещественных переменных.

real? т.е. хчоешь сказать TDate/TDateTime это вещественный тип? Все равно не понимаю что здесь является 0.5

Паренёг
Dif[2] - что за овощь?

Извиняюсь, что не объяснил, там хранится строка типа "13:35:44" - то есть время
Dim2000
Дата: 03.12.2007 13:02:47
LixeoN
т.е. хчоешь сказать TDate/TDateTime это вещественный тип?

Гениальная догадка .

System.pas
TDateTime = type Double;

LixeoN
Все равно не понимаю что здесь является 0.5

Попробуй 5 минут подумать.
LixeoN
Дата: 03.12.2007 13:40:36
Попробовал подумать - не вышло.
возможно половина от времени, т.е. 12 часов дня (по 24 часовой)

Почему то это
If (StrToTime(Dif[2])<Form1.TimeDo.Time) or (StrToTime(Dif[2])>Form1.TimePosle.Time) then
не работает. В Dif[2] строка типа - 13:47:51
в Form1.TimeDo.Time - 13:40:00
в Form1.TimePosle.Time - 13:50:00
Паренёг
Дата: 03.12.2007 13:59:28
LixeoN
Попробовал подумать - не вышло.
возможно половина от времени, т.е. 12 часов дня (по 24 часовой)

Почему то это
If (StrToTime(Dif[2])<Form1.TimeDo.Time) or (StrToTime(Dif[2])>Form1.TimePosle.Time) then
не работает. В Dif[2] строка типа - 13:47:51
в Form1.TimeDo.Time - 13:40:00
в Form1.TimePosle.Time - 13:50:00



Сделай у них одинаковые значения и сравни...
ShowMessage(FloatToStr(StrToTime(Dif[2]))+#13+FloatToStr(Form1.TimeDo.Time));

У меня в TDateTimePicker.Time еще и дата в придачу висит.
Anatoly Podgoretsky
Дата: 03.12.2007 14:34:49
Изучаем отношения и логические операции, у тебя в условии с логикой не порядок. Если понять не удалось, то ищем в сети реализации функции Between
LixeoN
Дата: 03.12.2007 16:41:34
Anatoly Podgoretsky
Изучаем отношения и логические операции, у тебя в условии с логикой не порядок. Если понять не удалось, то ищем в сети реализации функции Between


Я бы не стал обращать а это внимание, если бы не то, что точно таким же образом с датой - работает.

объясняю:
if (StrToDate(Dif[1])<Form1.DateDo.Date) or (StrToDate(Dif[1])>Form1.DatePosle.Date) then 
работает

If (StrToTime(Dif[2])<Form1.TimeDo.Time) or (StrToTime(Dif[2])>Form1.TimePosle.Time) then
не работает

Поэтому не будем о логике. И о between я не знал, обязательно изучу.

Сделай у них одинаковые значения и сравни...
ShowMessage(FloatToStr(StrToTime(Dif[2]))+#13+FloatToStr(Form1.TimeDo.Time));

У меня в TDateTimePicker.Time еще и дата в придачу висит.


FloatToStr(StrToTime(Dif[2]))+'#'+FloatToStr(Form1.TimeDo.Time) - выдает
0,584803240740741#39419,5833391204
0,585104166666667#39419,5833391204
0,585509259259259#39419,5833391204
0,585844907407407#39419,5833391204
0,586666666666667#39419,5833391204
0,587928240740741#39419,5833391204
0,587997685185185#39419,5833391204
0,588530092592593#39419,5833391204
0,589178240740741#39419,5833391204
0,574895833333333#39419,5833391204
0,575092592592593#39419,5833391204
0,576122685185185#39419,5833391204
0,576597222222222#39419,5833391204
0,578113425925926#39419,5833391204
0,579247685185185#39419,5833391204
0,579872685185185#39419,5833391204
Что то явно не то)
Похоже придется тупо перевести время в секунды и сравнивать)
Anatoly Podgoretsky
Дата: 03.12.2007 16:56:40

Работает даже если уберешь условие.


Posted via ActualForum NNTP Server 1.4