Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2012, 00:15   #1
Follout
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 12
По умолчанию Замыкает запрос While not EOF

Доброго времени
На форме DBGrid подключенный к базе Access.
Вообщем мне нужно вывести в грид все записи в которых дата идет в промежутке от сегодняшнего дня и до бесконечности. Отсортировать их так чтобы ближайшие даты были вверху, а даты которые близки к сегодняшней дате в районе 5 дней были выделены цветом в гриде (вернее вся строка).
Додумался/скопировался до такого кода
Код:
procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin

Form1.DateTimePicker1.Time:=StrToTime('0:00:00');
Form1.DateTimePicker2.Time:=StrToTime('0:00:00');

data_current:=StrToInt(StringReplace((DateToStr(Form1.DateTimePicker1.Date)), '.', '', [rfReplaceAll, rfIgnoreCase]));
data_current:=StrToInt(copy(IntToStr(data_current),5,4)+copy(IntToStr(data_current),3,2)+copy(IntToStr(data_current),1,2));

with DataModule1.ADOQuery1 do
  begin
      Active:=false;
      SQL.Clear;
      SQL.Add('SELECT* FROM tabl1 WHERE sroki BETWEEN :StartDate AND :FinishDate');
      SQL.Add(' ORDER BY sroki DESC ');
      Parameters.ParamByName('StartDate').Value:=Form1.DateTimePicker1.DateTime;
      Parameters.ParamByName('FinishDate').Value:=Form1.DateTimePicker2.DateTime;
      Active:=true;
      while not EOF do
          begin
             data_id:=(FieldByName('id').AsInteger);
             data_1:=StrToInt(StringReplace((FieldByName('sroki').AsString), '.', '', [rfReplaceAll, rfIgnoreCase]));
             data_1:=StrToInt(copy(IntToStr(data_1),5,4)+copy(IntToStr(data_1),3,2)+copy(IntToStr(data_1),1,2));
             if ((data_1-data_current)<=5) and ((data_1-data_current)>0) then
                         begin
                         if (DBGrid1.DataSource.DataSet.FieldByName('id').Value=data_id) then begin
                         with  DBGrid1.Canvas do begin
                         Brush.Color:=clGreen;
                         Font.Color:=clWhite;
                         FillRect(Rect);
                         TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
                         end;
                         end;
                         end;
             Next;
          end;

  end;
end;
При запуске в грид данные приходят нужные, 2 неокрашенных и 1 окрашенные. Но начинают очень быстро меняться друг с другом местами, вообщем мерцают. Почему код не тормозится на EOF?

Последний раз редактировалось Follout; 26.05.2012 в 00:36.
Follout вне форума Ответить с цитированием
Старый 26.05.2012, 00:30   #2
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Это бредовый код.
Весь надо выбросить.
Разберитесь для начала когда работает ваш DBGrid1DrawColumnCell.
=master= вне форума Ответить с цитированием
Старый 26.05.2012, 00:36   #3
Follout
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Это бредовый код.
Весь надо выбросить.
Разберитесь для начала когда работает ваш DBGrid1DrawColumnCell.
Работает когда открываешь форму с гридом.
Если оставить только
Код:
if (DBGrid1.DataSource.DataSet.FieldBy Name('id').Value=data_id) then begin
 with DBGrid1.Canvas do begin
 Brush.Color:=clGreen;
 Font.Color:=clWhite;
 FillRect(Rect);
 TextOut(Rect.Left+2,Rect.Top+2,Colu mn.Field.Text);
Если вместо data_id поставить любой id записи, то все работает. Но как известно id нужный узнается в процессе кода. Такие дела.
В каком месте бредовый код?

PS: Если непонятно. Вытаскиваю текущую дату в формате ДД.ММ.ГГГГ, далее избавляюсь от точек и привожу в вид ГГГГММДД. Далее поочередно проделываю то же самое с датами в записях. Вычитаю, и если разница попадает в район от 1 до 5 (тоесть 5 дней), то окрашиваю строку с этим id (записаным ранее).

Последний раз редактировалось Follout; 26.05.2012 в 00:41.
Follout вне форума Ответить с цитированием
Старый 26.05.2012, 01:04   #4
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Работает когда открываешь форму с гридом.
Плохо разобрались, оттого и не работает.
http://www.delphikingdom.ru/asp/view...?catalogid=168
=master= вне форума Ответить с цитированием
Старый 26.05.2012, 01:20   #5
Follout
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Плохо разобрались, оттого и не работает.
http://www.delphikingdom.ru/asp/view...?catalogid=168
При открывании формы сразу срабатывает условие. Вопрос был другой "почему не наступает EOF?"
Follout вне форума Ответить с цитированием
Старый 26.05.2012, 01:37   #6
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

GOTO #4 .
=master= вне форума Ответить с цитированием
Старый 26.05.2012, 01:37   #7
Follout
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 12
По умолчанию

Тыкая пальцем в небо написал код через массив
Код:
procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
array_id: array[1..40] of integer;
i,i2: integer;
begin

Form1.DateTimePicker1.Time:=StrToTime('0:00:00');
Form1.DateTimePicker2.Time:=StrToTime('0:00:00');

data_current:=StrToInt(StringReplace((DateToStr(Form1.DateTimePicker1.Date)), '.', '', [rfReplaceAll, rfIgnoreCase]));
data_current:=StrToInt(copy(IntToStr(data_current),5,4)+copy(IntToStr(data_current),3,2)+copy(IntToStr(data_current),1,2));
i:=0;
with DataModule1.ADOQuery1 do
  begin
      Active:=false;
      SQL.Clear;
      SQL.Add('SELECT* FROM tabl1 WHERE sroki BETWEEN :StartDate AND :FinishDate');
      SQL.Add(' ORDER BY sroki DESC ');
      Parameters.ParamByName('StartDate').Value:=Form1.DateTimePicker1.DateTime;
      Parameters.ParamByName('FinishDate').Value:=Form1.DateTimePicker2.DateTime;
      Active:=true;
      while not EOF do
          begin
             data_id:=(FieldByName('id').AsInteger);
             data_1:=StrToInt(StringReplace((FieldByName('sroki').AsString), '.', '', [rfReplaceAll, rfIgnoreCase]));
             data_1:=StrToInt(copy(IntToStr(data_1),5,4)+copy(IntToStr(data_1),3,2)+copy(IntToStr(data_1),1,2));
             if ((data_1-data_current)<=5) and ((data_1-data_current)>=0) then
             begin
             i:=i+1;
             array_id[i]:=(FieldByName('id').AsInteger);
             end;
             Next;
          end;
  end;

for i2:=1 to i do
  begin

    if (DBGrid1.DataSource.DataSet.FieldByName('id').Value=array_id[i2]) then
       begin
            with  DBGrid1.Canvas do
              begin
                  Brush.Color:=clGreen;
                  Font.Color:=clWhite;
                  FillRect(Rect);
                  TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
              end;
       end;
  end;
Похоже эта процедура не дружит с циклами вообще, непойму что заставляет ее выполняться овер9000 раз.
Follout вне форума Ответить с цитированием
Старый 26.05.2012, 01:45   #8
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Похоже эта процедура не дружит с циклами вообще, непойму что заставляет ее выполняться овер9000 раз.
Кто тут? ау...
=master= вне форума Ответить с цитированием
Старый 26.05.2012, 02:44   #9
Follout
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 12
По умолчанию

Перечитал еще раз статью, ничего для себя не нашел, возможно что-то упустил.
Просто разделил код, переменные и массив сделал глобальными. Заработало
Код:
procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin

for i2:=1 to i do
 begin

    if (DBGrid1.DataSource.DataSet.FieldByName('id').Value=array_id[i2]) then
       begin
            with  DBGrid1.Canvas do
              begin
                  Brush.Color:=clGreen;
                  Font.Color:=clWhite;
                  FillRect(Rect);
                  TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
              end;
       end;
 end;
end;
и
Код:
procedure TForm3.Button3Click(Sender: TObject);
begin

Form1.DateTimePicker1.Time:=StrToTime('0:00:00');
Form1.DateTimePicker2.Time:=StrToTime('0:00:00');

data_current:=StrToInt(StringReplace((DateToStr(Form1.DateTimePicker1.Date)), '.', '', [rfReplaceAll, rfIgnoreCase]));
data_current:=StrToInt(copy(IntToStr(data_current),5,4)+copy(IntToStr(data_current),3,2)+copy(IntToStr(data_current),1,2));
i:=0;
with DataModule1.ADOQuery1 do
  begin
      Active:=false;
      SQL.Clear;
      SQL.Add('SELECT* FROM tabl1 WHERE sroki BETWEEN :StartDate AND :FinishDate');
      SQL.Add(' ORDER BY sroki DESC ');
      Parameters.ParamByName('StartDate').Value:=Form1.DateTimePicker1.DateTime;
      Parameters.ParamByName('FinishDate').Value:=Form1.DateTimePicker2.DateTime;
      Active:=true;
      while not EOF do
          begin
             data_id:=(FieldByName('id').AsInteger);
             data_1:=StrToInt(StringReplace((FieldByName('sroki').AsString), '.', '', [rfReplaceAll, rfIgnoreCase]));
             data_1:=StrToInt(copy(IntToStr(data_1),5,4)+copy(IntToStr(data_1),3,2)+copy(IntToStr(data_1),1,2));
             if ((data_1-data_current)<=5) and ((data_1-data_current)>=0) then
             begin
             i:=i+1;
             array_id[i]:=(FieldByName('id').AsInteger);
             end;
             Next;
          end;
  end;

end;
Follout вне форума Ответить с цитированием
Старый 26.05.2012, 03:06   #10
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
массив сделал
зачем козе баян?
у вас в DBGrid1.DataSource.DataSet уже все есть...
Цитата:
Перечитал еще раз статью, ничего для себя не нашел
читайте пока не найдете, это путь к успеху.

Последний раз редактировалось =master=; 26.05.2012 в 03:09.
=master= вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с while(!f.eof()) SakHax Общие вопросы C/C++ 1 20.12.2011 18:46
EOF goluzov Общие вопросы C/C++ 1 07.12.2011 09:50
while(! input.eof()) kaljan775 Общие вопросы C/C++ 4 09.10.2010 12:41
функция eof! срочно! kitty_girl Помощь студентам 6 21.05.2009 22:25
fstream.eof() в mingw alexinspir Общие вопросы C/C++ 1 30.09.2008 08:00