|
Вопрос # 6 628/ вопрос открыт / |
|
Здравствуйте, эксперты! B снова прошу вашей помощи!
Написал программку, которая загружает из базы данных access количество комнат, номера комнат, даты въезда и освобождения комнат и отображает это в StringGrid.
Но всё работает очень медленно. Не могли ли бы Вы указать на возможные ошибки(или как это можно сделать проще)
Приложение: Переключить в обычный режим- var
- i,n,s,i1,s1:integer;
- begin
-
- ADOQuery1.Open;
- n:=ADOQuery1.Fields[0].AsInteger;
- s2:=n;
- StringGrid1.RowCount:= n+1;
- ADOQuery1.Close;
- ADOQuery1.Active:=false;
- ADOQuery1.SQL.Clear;
-
- for i:=1 to n+1 do
- begin
-
- ADOQuery1.Active:=true;
- ADOQuery1.Open;
- StringGrid1.Cells[0,i]:= ADOQuery1.Fields[0].AsString;
- end;
-
- for s:=1 to n do
- begin
-
- ADOQuery1.Open;
- if not (ADOQuery1.Fields[0].AsString='')
- then
- begin
- for i1:=0 to StringGrid1.ColCount do
- if StringGrid1.Cells[i1,0]=FormatDateTime('dd.mm', ADOQuery1.Fields[0].AsDateTime) then
- begin
- a1:=i1;
- a2:=s;
- StringGrid1.Cells[a1,a2]:='X';
- for s1:=0 to n do
- begin
- ADOQuery1.Close;
- ADOQuery1.Active:=false;
- ADOQuery1.SQL.Clear;
-
- ADOQuery1.Open;
- end;
- end;
- end;
- 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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|