Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Вниз

Согласованность получения данных   Найти похожие ветки 

 
Alex_C   (2011-03-05 10:30) [0]

Получаю в отдельном треде данные из инета. Затем мне их надо занести в таблицу к уже имеющимся данным. Проблема заключается в следующем: если пользователь просматривает таблицу (делает скроллинг) и в этот момент приходят данные, то естественно у него весь просмотр сбивается (при вставке данных я использую DisableControl).
Интересна следующая идея: как наилучшим образом согласовать вставку данных, чтоб при просмотре таблицы она не мешала пользователю?
Как вариант отказаться от использования DBTable+DBGrid, а использовать другие компоненты.


 
Сергей М. ©   (2011-03-05 10:52) [1]

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

Никак. Все равно будет мешать.
Пользователь сам должен решать когда ему обновить НД.
Кнопуля у него должна быть соответствующая. Ну и можно еще индикатор некий предусмотреть, извещающий о необходимости рефреша НД с целью получить актуальную его версию.


 
Геннадий Петрович   (2011-03-05 11:07) [2]

procedure TTLCustomGrid.FreezeScroll;
begin
 if (FFreezeCount = 0) then
 begin
   FFreezeKey := CurrentKey;
   FFreezeRow := Row;
 end;
 FFreezeCount := FFreezeCount + 1;
end;

procedure TTLCustomGrid.UnfreezeScroll;
begin
 FFreezeCount := FFreezeCount - 1;

 if (FFreezeCount = 0) and Active and (CurrentKey = FFreezeKey) then
   ScrollActiveToRow(FFreezeRow);
end;

procedure TTLCustomGrid.ScrollActiveToRow(const ARow: integer);
var
 TitleOffset: integer;
 Distance: integer;
 NewRect: TRect;
 RowHeight: integer;
 NewRow: integer;
begin
 if Active then
 begin
   NewRow := Row;
   TitleOffset:= 0;
   if (dgTitles in Options) then
     inc(iTitleOffset);
   if (ARow <> NewRow) then
   begin
     BeginUpdate;
     try
       Scroll(NewRow - ARow);
       if ((NewRow - ARow) < 0) then
         DataLink.ActiveRecord := 0
       else
         DataLink.ActiveRecord := VisibleRowCount - 1;
       Distance := DataSet.MoveBy(NewRow - ARow);
       NewRow := NewRow - Distance;
       DataSet.MoveBy(ARow - DataLink.ActiveRecord - TitleOffset);
       RowHeight := DefaultRowHeight;
       NewRect:= BoxRect(0, TitleOffset, ColCount - 1, 1000);
       ScrollWindowEx(Handle, 0, - RowHeight * Distance, @NewRect, @NewRect, 0, nil, SW_Invalidate);
       MoveColRow(Col, NewRow, false, false);
     finally
       EndUpdate;
     end;
   end;
 end;
end;


(C) НеПомнюКто & C°


 
Alex_C   (2011-03-05 11:12) [3]


> Пользователь сам должен решать когда ему обновить НД.


Сергей, понимаешь, там по условию нельзя так делать. Пользователь должен видеть то, что пришло сразу. Никаких кнопок - так сделано во всех других аналогичных программах.
Тут вот почему еще вопрос возник: в одной из программ аналогичных моей, данные в таблицу добавляются , как бы это сказать, не мешая пользователю... Программа написана на визуал базике. Т.е. там все эти мерцания сведены к минимому. Получается вариант решения этой проблемы есть.


 
Alex_C   (2011-03-05 11:16) [4]


> Геннадий Петрович


Да, да вот примерно про это я и имел ввиду. Сейчас изучаю код - есть несколько не ясных моментов, но сама идея - то, что надо! Спасибо!


 
clickmaker ©   (2011-03-05 11:18) [5]

> вариант решения этой проблемы есть

есть. Можно использовать ListView. Зависит еще от того, как эти новые данные должны ложиться: с сохранением порядка сортировки или в конец списка, как в виндовом Проводнике новый файл


 
Inovet ©   (2011-03-05 11:23) [6]

> [3] Alex_C   (05.03.11 11:12)
> данные в таблицу добавляются , как бы это сказать, не мешая
> пользователю...

А в чём мешание пользователю проявляется? И что за база что Table пользуешь?

> [0] Alex_C   (05.03.11 10:30)
> занести в таблицу к уже имеющимся данным

Т.е. добавить записи?

Запомнить текущую запись, добавить новые, вернуться на запомненую. Добавлять не в этос Dataset. Вообще как может не мешать, если постоянно меняется содержимое записи же не обязательно в конце будут или как там они сортированы?


 
Alex_C   (2011-03-05 11:26) [7]


> Можно использовать ListView.


Именно его сейчас и изучаю. По году в той программе так и сделано.
Другое дело, что у меня в программе


> данные должны ложиться: с сохранением порядка сортировки


а тут получается уже проблема - или отказваться от этого (в принципе это не такая уж и большая потеря), или смериться с мерцанием.


 
Alex_C   (2011-03-05 11:27) [8]


> Запомнить текущую запись, добавить новые, вернуться на запомненую.


Да я так и пробовал - но мигание, особенно если данные начинают идти достаточно активно, весьма раздражает.


 
Alex_C   (2011-03-05 11:31) [9]

Есть конечно вариант вообще безумный))) - он кстати в одном месте моей программы весь удачно реализован:
вот эти данные, что я получаю из инета мне не только в таблицу нужно вывести, но и в графическом виде. Так вот там то все просто - я в памяти рисую потом через BitBlt вывожу на канвас формы - там все великолепно, мерцания вообще нет.
Как вариант - просто таблицу в памяти рисовать, и так же выводить на форму))) Но это шутка... хотя... )))


 
Геннадий Петрович   (2011-03-05 11:32) [10]

> Да, да вот примерно про это я и имел ввиду.

Для полноты картины:

TTLStorage:

const
 hack_deFreezeControls = $F0;
 hack_deUnfreezeControls = $F1;

procedure TTLStorage.FreezeControls; // вместо DisableControls
begin
 DataEvent(TDataEvent(hack_deFreezeControls), 0);
 DisableControls;
end;

procedure TTLStorage.UnfreezeControls; // вместо EnableControls
begin
 EnableControls;
 DataEvent(TDataEvent(hack_deUnfreezeControls), 0);
end;


TTLGridDataLink:

procedure TTLGridDataLink.DataEvent(AEvent: TDataEvent; AInfo: integer);
begin
 inherited DataEvent(AEvent, AInfo);
 if (Grid is TTLCustomGrid) then
   TTLCustomGrid(Grid).InnerDataEvent(AEvent, AInfo);
end;


TTLCustomGrid:

procedure TTLCustomGrid.InnerDataEvent(AEvent: TDataEvent; AInfo: Integer);
begin
 {$WARNINGS OFF}
 case AEvent of
   TDataEvent(hack_deFreezeControls): FreezeScroll;
   TDataEvent(hack_deUnfreezeControls): UnfreezeScroll;
 end;
 {$WARNINGS ON}  
end;

function TTLCustomGrid.CreateDataLink: TGridDataLink;
begin
 Result := TTLGridDataLink.Create(Self);
end;

function TTLCustomGrid.GetActive: boolean;
begin
 Result := (DataSet <> nil) and DataSet.Active;
end;


 
Геннадий Петрович   (2011-03-05 11:42) [11]

> // вместо DisableControls
> // вместо EnableControls


К сожалению, DisableControls и EnableControls  не виртуальные методы; и даже во внутренние вызовы никак не втиснуться. То есть, совершенно прозрачно сделать не получается. С другой стороны, нет ничего страшного в использовании Freeze- и UnfreezeControls  вместо Disable- и EnableControls.


 
Anatoly Podgoretsky ©   (2011-03-05 11:49) [12]

> Alex_C  (05.03.2011 11:12:03)  [3]

Пусть пользователь вешается, ему ничего другого не остается. Особенно в
современных сетях, когда базу одновременно изменяют сотни и тысячи
пользователей.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1295616326
Pcrepair
2011-01-21 16:25
2011.06.12
Использование компенента Indy IdTCPServer в зависимости от версии


15-1298575574
Leon-Z
2011-02-24 22:26
2011.06.12
Экземпляр объекта.


2-1299056752
cross
2011-03-02 12:05
2011.06.12
функция или процедура


6-1237587638
1uka
2009-03-21 01:20
2011.06.12
как заставить TIdTCPClient "слушать" ?


2-1299242761
advise
2011-03-04 15:46
2011.06.12
По готовой программе можно узнать какие компоненты в ней





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский