Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.032 c
1-1097946763
DIS
2004-10-16 21:12
2004.10.31
остановить таймер


4-1095089621
ONIM
2004-09-13 19:33
2004.10.31
Загрузка DLL


14-1097747241
Gorlum
2004-10-14 13:47
2004.10.31
Вот думаю написать одну программку...


6-1092818854
Klopan
2004-08-18 12:47
2004.10.31
TServerSocket


3-1096970244
funtik123
2004-10-05 13:57
2004.10.31
Количсетво записей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский