Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как расставить DisableControls и EnableControls [D7, Paradox]


тот же ©   (2004-10-02 13:37:00) 

Есть  главная 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;


mike-d   (2004-10-02 19:46:00) [1]

> если сделать как > Внук ©   (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 значения этих сумм не обновяться...


sniknik   (2004-10-02 17:00:00) [2]

если сделать как > Внук ©   (02.10.04 14:05) [1]
то единственно почему как DisableControls; так и без его скорость почти одна и таже, это то, что "//выполнение опр. операций" настолько длительное, что скрывает весь выыгрыш от его применения. (хотя нет... ;), еще может быть так мало данных в таблицах что выигрыша просто не видно)


Внук   (2004-10-02 16:48:00) [3]

Я все-таки не понял, у тебя при выполнении Table1.Next данные в Table2 не меняются (тот же (02.10.04 14:48) [3])? Или внешний цикл только одну итерацию делает?
 Или что? Или скорость не устраивает?


тот же   (2004-10-02 15:52:00) [4]


> sniknik ©   (02.10.04 15:29) [6]
Обе таблицы связаны с DBGrid'ами.Естественно, нужна скорость. Если на период расчетов разрывать связь с ними, то пользователя это может смутить.


sniknik   (2004-10-02 15:29:00) [5]

а что ты хочеш чтобы изменилось? скорость? тогда скажи у тебя таблици с визуальными контролами связаны?


тот же   (2004-10-02 15:23:00) [6]


> Внук ©   (02.10.04 15:03) [4]
> Очевидно, надо в отладчике смотреть, какое значение возвращает
> Table1.RecordCount. DisableControls здесь ни при чем. Хотя
> нафига там RecordCount тоже непонятно. Лучше писать
> While not Table1.Eof do

с While not Table1.Eof do результат тот же
Если оставить только Table1.DisableControls;то ничего не меняется


Внук   (2004-10-02 15:03:00) [7]

Очевидно, надо в отладчике смотреть, какое значение возвращает Table1.RecordCount. DisableControls здесь ни при чем. Хотя нафига там RecordCount тоже непонятно. Лучше писать
While not Table1.Eof do


тот же   (2004-10-02 14:48:00) [8]


> Внук ©   (02.10.04 14:05) [1]

Именно про это. Но в данном случае вычисления проводятся только для данных Table2, связанных только с первой записью Table1, а для остальных - нет. Пробовал оставить только Table1.DisableControls; Table2.DisableControls; а Table1.EnableControls; Table2.EnableControls;удалял полностью - результат тот же. Где грабли???


Vemer   (2004-10-02 14:13:00) [9]

Иногда еще надо делать .Refresh в визуальном компоненте после изменений, чтоб пользователь их увидел.


Внук   (2004-10-02 14:05:00) [10]

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;

Ты про это?


Наверх

Титульная страница Поиск, карта сайта Написать письмо