Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Обновление записей


Автор: MrForget 30.4.2006, 12:23
Такое дело. На форме есть DBGrid с имеющимися данными из таблицы MSAccess. Ежесекундно по таймеру таблица изменяется, например так:
Код

procedure TForm1.TimerTimer(Sender: TObject);
begin
 Data.workcompanies.First;
 Application.ProcessMessages;
 while not Data.workcompanies.Eof do
  begin
   Application.ProcessMessages;
   Data.Companies.Edit;
   Data.Companies.FieldByName('UCapital').AsCurrency:=Data.WorkCompanies.FieldByName('UCapital').AsCurrency-1;
   Data.Companies.Post;
   Data.companies.Next;
  end;
 Application.ProcessMessages;
end;
При этом в DBGrid начинает бегать ползунок. Суть в том, что пользователь двойным кликом мыши должен кликнуть в DBGrid по интересующей записи и таймер должен остановиться и показаться окно с полными сведениями о выбранной записи. Когда окно закрывается, таймер должен вновь включиться. Проблема в том, что когда прогу запускаю и активизируется таймер прога подвисает и юзер уже не может выбрать интересующую его запись. Доходит даже до того, что юзер не может закрыть даже главное окно программы. Необходимо сделать так чтобы в DBGrid ползунок не бегал и юзер мог свободно выбирать любую запись и просматривать ее содержимое, а так же при даблклике останавливал таймер... Спасибо 

Автор: The Thing 30.4.2006, 13:47
Скорее всего ты не правильно выбрал алгоритм обновления данных.
Я так понял, что у тебя переодически обновляется база, в частности таблица. И ты пытаешься ее каждый раз обновить. Попробуй слеждующий подход, самый простой, и сразу приходит на ум:

Считываешь к-во записей (таким же интервалом) и если оно изменилось, то производишь обновление. Так ты съэкономишь много времени и памяти (особенно если большая база).

Другой вариант, если база очень часто обновляется, при этом как добавляется, так и удаляется из нее информация, т.е. может так совпасть, что одна запись добавилась, а другая удалилась.. в сумме ничего не изменилось. То можно добавить проверку информации. Например:
Считать помимо к-во записей, если к-во записейсовпадает, количество каждой первой буквы по алфавиту (к примеру так).
1. Самое главное, чтобы обработка этой проверки и добавления записи занимала меньгше секунды.. иначе сам знаешь что!

2. или перед обработкой останавливай таймер, а после запуска!

3. Любой подходящий алгоритм поиска информации. 

Автор: Юзверь 30.4.2006, 16:04
действительно надо сделать другой алгоритм апдейта
а в этом случая код следает немножко изменить

procedure TForm1.TimerTimer(Sender: TObject);    
begin    
 Data.workcompanies.First;    
// Application.ProcessMessages;    
Data.disableControls; //отключаем отображение наших действий на форме
 while not Data.workcompanies.Eof do    
  begin    
   Application.ProcessMessages;    
   Data.Companies.Edit;    
   Data.Companies.FieldByName('UCapital').AsCurrency:=Data.WorkCompanies.FieldByName('UCapital').AsCurrency-1;    
   Data.Companies.Post;    
   Data.companies.Next;    
Application.ProcessMessages;    // это надо делать в цикле иначе толку мало
  end;    
Data.enableControls; //включаем отображение наших действий на форме
// Application.ProcessMessages;    
end;

 Application.ProcessMessages;    
считывать сообщения сисьемы из очереди и исполняет их, приложение ето делает постоянно но при больших циклах ето делаеть после них и приложения перестають пририсувиватся ... и т.д.
Data.enableControls; 
все контролы (TDBGrig) которые выводять инфо из дата сета не обновляются (при этом значения на пропадають). команди типа next не приводат к изменению положения курсара

идеальный вариант этот кусок вывести в отдельный поток. 

Автор: MrForget 1.5.2006, 00:24
Спасибо, за код. Очень пригодился. Но прога все равно подвисает. НИчего не могу с ней поделать. Хотелось бы, чтобы юзер мог выделять любую строку в DBGrid. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)