Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Как расставить 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
14-1097473967
Rule
2004-10-11 09:52
2004.10.31
вопрос про .NET Framework mobile & Windows Mobile 2003


1-1097120934
newver
2004-10-07 07:48
2004.10.31
работа с DLL и тем что внутри.


1-1097591122
Wish
2004-10-12 18:25
2004.10.31
Что писать в OnCloseQuery?


4-1096405863
Alex870
2004-09-29 01:11
2004.10.31
Цвет бордюра


1-1097654097
Pentium133
2004-10-13 11:54
2004.10.31
О TList и функциях