Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизКак расставить DisableControls и EnableControls Найти похожие ветки
← →
тот же (2004-10-02 13:37) [0]Есть главная Table1 и подчиненная Table2. В Table2 необходимо внести некоторые изменения. Для этого использую нижеприведенный код. Необходимо расставить в нем DisableControls и EnableControls для ускорения вычислений. Помогите расставить, никак не соображу. В принципе можно убрать связь между таблицами и работать только с Table2, но не желательно.
procedure TForm1.Button1Click(Sender: TObject);
var
z: longint;
begin
Table1.First;
for z := 1 to Table1.RecordCount do
begin
Table2.First;
While not Table2.Eof do
begin
Table2.Edit;
//выполнение опр. операций
Table2.Post;
Table2.Next;
end;
Table1.Next;
end;
end;
← →
Внук © (2004-10-02 14:05) [1]procedure TForm1.Button1Click(Sender: TObject);
var z: longint;
begin
try
Table1.DisableControls;
Table2.DisableControls;
Table1.First;
for z := 1 to Table1.RecordCount do
begin
Table2.First;
While not Table2.Eof do
begin
Table2.Edit;
//выполнение опр. операций
Table2.Post;
Table2.Next;
end;
Table1.Next;
end;
finally
Table1.EnableControls;
Table2.EnableControls;
end;
end;
Ты про это?
← →
Vemer © (2004-10-02 14:13) [2]Иногда еще надо делать .Refresh в визуальном компоненте после изменений, чтоб пользователь их увидел.
← →
тот же (2004-10-02 14:48) [3]
> Внук © (02.10.04 14:05) [1]
Именно про это. Но в данном случае вычисления проводятся только для данных Table2, связанных только с первой записью Table1, а для остальных - нет. Пробовал оставить только Table1.DisableControls; Table2.DisableControls; а Table1.EnableControls; Table2.EnableControls;удалял полностью - результат тот же. Где грабли???
← →
Внук © (2004-10-02 15:03) [4]Очевидно, надо в отладчике смотреть, какое значение возвращает Table1.RecordCount. DisableControls здесь ни при чем. Хотя нафига там RecordCount тоже непонятно. Лучше писать
While not Table1.Eof do
← →
тот же (2004-10-02 15:23) [5]
> Внук © (02.10.04 15:03) [4]
> Очевидно, надо в отладчике смотреть, какое значение возвращает
> Table1.RecordCount. DisableControls здесь ни при чем. Хотя
> нафига там RecordCount тоже непонятно. Лучше писать
> While not Table1.Eof do
с While not Table1.Eof do результат тот же
Если оставить толькоTable1.DisableControls;
то ничего не меняется
← →
sniknik © (2004-10-02 15:29) [6]а что ты хочеш чтобы изменилось? скорость? тогда скажи у тебя таблици с визуальными контролами связаны?
← →
тот же (2004-10-02 15:52) [7]
> sniknik © (02.10.04 15:29) [6]
Обе таблицы связаны с DBGrid"ами.Естественно, нужна скорость. Если на период расчетов разрывать связь с ними, то пользователя это может смутить.
← →
Внук © (2004-10-02 16:48) [8]Я все-таки не понял, у тебя при выполнении Table1.Next данные в Table2 не меняются (тот же (02.10.04 14:48) [3])? Или внешний цикл только одну итерацию делает?
Или что? Или скорость не устраивает?
← →
sniknik © (2004-10-02 17:00) [9]если сделать как > Внук © (02.10.04 14:05) [1]
то единственно почему как DisableControls; так и без его скорость почти одна и таже, это то, что "//выполнение опр. операций" настолько длительное, что скрывает весь выыгрыш от его применения. (хотя нет... ;), еще может быть так мало данных в таблицах что выигрыша просто не видно)
← →
mike-d © (2004-10-02 19:46) [10]> если сделать как > Внук © (02.10.04 14:05) [1]
> Table1.DisableControls;
TTable связываются отношением Master-Detail через TDataSource. Делая DisableControls ты эту связь отключаешь - т.е. Table2 у тебя остается "привязанной" к той записи Table1, что была до отключения...
>Но в данном случае вычисления проводятся только для данных Table2, связанных только с первой записью Table1
Именно так и происходит :)
Поэтому, чтобы не потерять связь - отключать ничего не нужно. Но в таком случае у тебя вся навигация по таблицам будет отображаться в Grid"ах, что существенно увеличит время расчета.
Можно обойти эту проблему например так: завести какие-то clcTable1, clcTable2 и DataSource к clcTable1 для создания связи Master-Detail к clcTable2. При расчете открыть их, дальше как у тебя уже написано в сабже - только навигация идет по clcTable1 и clcTable2 с расчетом //выполнение опр. операций. Лучше писать While not Table1.Eof do, как верно замечено в [4], а по окончании сделать -Table1.Refresh;
)
Table2.Refresh;
Данные в твоих Grid"ах обновятся...
маленькое ЗЫ - Если ты используешь DBGridEh и его встроенный расчет сумм, то при Refresh значения этих сумм не обновяться...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c