Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 628

/ вопрос открыт /

Здравствуйте, эксперты! B снова прошу вашей помощи!
Написал программку, которая загружает из базы данных access количество комнат, номера комнат, даты въезда и освобождения комнат и отображает это в StringGrid.
Но всё работает очень медленно. Не могли ли бы Вы указать на возможные ошибки(или как это можно сделать проще)

Приложение:
  1. var
  2. i,n,s,i1,s1:integer;
  3. begin
  4.  
  5. ADOQuery1.Open;
  6. n:=ADOQuery1.Fields[0].AsInteger;
  7. s2:=n;
  8. StringGrid1.RowCount:= n+1;
  9. ADOQuery1.Close;
  10. ADOQuery1.Active:=false;
  11. ADOQuery1.SQL.Clear;
  12.  
  13. for i:=1 to n+1 do
  14. begin
  15.  
  16. ADOQuery1.Active:=true;
  17. ADOQuery1.Open;
  18. StringGrid1.Cells[0,i]:= ADOQuery1.Fields[0].AsString;
  19. end;
  20.  
  21. for s:=1 to n do
  22. begin
  23.  
  24. ADOQuery1.Open;
  25. if not (ADOQuery1.Fields[0].AsString='')
  26. then
  27. begin
  28. for i1:=0 to StringGrid1.ColCount do
  29. if StringGrid1.Cells[i1,0]=FormatDateTime('dd.mm', ADOQuery1.Fields[0].AsDateTime) then
  30. begin
  31. a1:=i1;
  32. a2:=s;
  33. StringGrid1.Cells[a1,a2]:='X';
  34. for s1:=0 to n do
  35. begin
  36. ADOQuery1.Close;
  37. ADOQuery1.Active:=false;
  38. ADOQuery1.SQL.Clear;
  39.  
  40. ADOQuery1.Open;
  41. end;
  42. end;
  43. end;
  44. end;


Елагин Сергей Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Елагин Сергей (статус: Посетитель)
Вопрос отправлен: 23 мая 2016, 21:44
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Елагин Сергей!
Рекомендую пройти по шагам в режиме отладки.
Будет окончательно ясно.
Мои предположения:

ADOQuery1.SQL.Text:='SELECT * FROM Номера WHERE №Комнаты='+IntToStr(i);
Если вы используете в текущем цикле только одно поле, зачем делать выборку по всем? При наличии вычисляемых полей в таблице это серьезно тормозит выборку.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 24 мая 2016, 22:18
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 26 мая 2016, 00:31; участников в обсуждении: 2.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 23 мая 2016, 22:29 [#1]:

Рекомендую пройти по шагам в режиме отладки.
Будет окончательно ясно.
Мои предположения:
ADOQuery1.SQL.Text:='SELECT * FROM Номера WHERE №Комнаты='+IntToStr(i);
Если вы используете в текущем цикле только одно поле, зачем делать выборку по всем? При наличии вычисляемых полей в таблице это серьезно тормозит выборку.
Елагин Сергей

Елагин Сергей (статус: Посетитель), 24 мая 2016, 21:31 [#2]:

Шичко Игорь: Спасибо за совет! Изменил пару циклов - стало быстрее. И почему-то когда программа запущена не в среде delphi она работает быстрее.
Разрешите задать Вам ещё один вопрос, не получается догадаться как реализовать.

В stringgrid я выделяю крестиком ячейки, которые соответствуют датам заезда и датам выезда. Как реализовать, что бы ячейки которые находятся между ними так-же были с крестиком. Заранее спасибо!
Прости меня, я стал ничтожным прахом,
Холодный дождь смешал меня с землёй.
Нет больше боли, нет любви, нет страха.
Лишь только грусть осталась нам с тобой.....
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 24 мая 2016, 22:17 [#3]:

Цитата:

И почему-то когда программа запущена не в среде delphi она работает быстрее.

Это логично. При запуске в среде Delphi кроме модулей программы в работе еще модули самого компилятора и среды разработки.
При запуске *.exe файла - работает только скомпилированный модуль программы.

Цитата:

В stringgrid я выделяю крестиком ячейки, которые соответствуют датам заезда и датам выезда. Как реализовать, что бы ячейки которые находятся между ними так-же были с крестиком. Заранее спасибо!

0. Подготовьте переменную признак, например: pr_select:= 0;
1. Запускаете цикл по ячейкам stringgrid данной строки. В каждом шаге анализируете содержимое ячейки stringgrid.
1а. Пока pr_select = 0 крестик в ячейке не ставите
2. Находите 1-й крестик.
3. Переводите pr_select:= 1
3а. В следующих ячейках ставите крестик (но не забывайте перед установкой крестика проанализировать первоначальное значение ячейки, а то пропустите второй крестик)
4. Находите 2-й крестик.
5. Переводите обратно pr_select:= 0
завершаем проход по строке.
Таким методом даже можете два периода выделить (4 крестика)
Елагин Сергей

Елагин Сергей (статус: Посетитель), 25 мая 2016, 21:32 [#4]:

Шичко Игорь: Спасибо за подсказку! Но у меня не получается это реализовать на деле. Не могли ли бы Вы показать маленький пример. Спасибо!
Прости меня, я стал ничтожным прахом,
Холодный дождь смешал меня с землёй.
Нет больше боли, нет любви, нет страха.
Лишь только грусть осталась нам с тобой.....
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 26 мая 2016, 00:31 [#5]:

примерно так (вариант: при четном количестве крестиков в строке заполняет крестиками ячейки между нечетными и четными и крестиками, например для 4-х крестиков: между 1 и 2, между 3 и 4):

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i, pr_select: integer;
begin
pr_select:= 0;
for i:= 0 to StringGrid1.ColCount - 1 do
  begin
    if (StringGrid1.Cells[i,1] = 'x') then
    begin
      if pr_select = 0 then pr_select:= 1
      else
      pr_select:= 0;
    end
    else
    begin
      if pr_select = 1 then StringGrid1.Cells[i,1]:= 'x'
      else
      StringGrid1.Cells[i,1]:= '';
    end;
  end;
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 15:31
Выполнено за 0.02 сек.