powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сетевой Refresh локальной БД
9 сообщений из 9, страница 1 из 1
Сетевой Refresh локальной БД
    #33952618
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую "старую" базу данных dBASE в локальной сети. Сделал общий доступ для нескольких пользователей а вот Refresh изменений в гриде мерцает.
Кто может поделиться опытом для такой ситуации? Как сделает лучше из мерцания?

Нашел статью в «Королевства Delphi», но не получается переложить код на С++ (не дружу с делфи):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
Если вы работаете локально, то никаких проблем с обновлением набора данных у  вас не возникает. При изменении данных, вы сразу видите результат на экране. В  сети ситуация несколько иная : пользователи на других компьютерах не видят тех  изменений, которые происходят без их участия. Конечно, ничто не мешает нам через определенные интервалы времени обновлять элементы управления с помощью   Refresh, однако не очень приятно наблюдать за тем, как ваша программа  превращается в новогоднюю елку, постоянно мерцая элементами управления. 

  Проблема решается с помощью BDE Callback Functions : 

// Объявления...        
 TForm1 = class(TForm)
// ...
public
 function TableChangeCallBack(CBInfo: Pointer): CBRType;
 procedure UpdateTableData(var Msg: TMessage); message WM_UPDATETABLE;
 procedure TablesAfterOpen(DataSet: TDataSet);
end; 

// Реализация... 
function TForm1.TableChangeCallBack(CBInfo: Pointer): CBRType;
 begin
  PostMessage(Handle, WM_UPDATETABLE,  0 ,  0 );
 end;

procedure TForm1.UpdateTableData(var Msg: TMessage);
 Var
   Index : Integer;
 begin
  For Index :=  0  To DBDataModule.ComponentCount -  1  Do
  // DBDataModule - это Data module, в котором находятся все
  // TTable нашего   проекта...
     If DBDataModule.Components[Index] Is TTable Then
       If TTable(DBDataModule.Components[Index]).State = dsBrowse 
       then TTable(DBDataModule.Components[Index]).Refresh;
 end;

procedure TForm1.TablesAfterOpen(DataSet: TDataSet);
 begin
  TBDECallback.Create(Self, TTable(DataSet).Handle, cbTableChanged, nil,  0 ,
TableChangeCallBack, True);
 end;
// На событие OnCreate в Data Module подключаем наши функции к TTable... 
procedure TDBDataModule.DBDataModuleCreate(Sender: TObject);
 Var
   Index : Integer;
begin
 For Index :=  0  To ComponentCount -  1  Do
    If Components[Index] Is TTable Then
      TTable(Components[Index]).AfterOpen := Form1.TablesAfterOpen;
end;
  Но и это еще не все... Теперь нам нужен TTimer... 
procedure TForm1.FrashmanTimer(Sender: TObject);
 Var
   Index : Integer;
begin
 Try
  For Index :=  0  To DBDataModule.ComponentCount -  1  Do
     If DBDataModule.Components[Index] Is TTable Then
       If (TTable(DBDataModule.Components[Index]).Active)
         And
          (TTable(DBDataModule.Components[Index]).State = dsBrowse) Then
           DBIForceReRead(TTable(DBDataModule.Components[Index]).Handle);
 Except End;
end;
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33952728
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SCORPION ZНашел статью в «Королевства Delphi», но не получается переложить код на С++ (не дружу с делфи):Код на Паскале настолько прозрачен, что существуют даже прямые конвертеры Паскаль->C++.
На вскидку одна из процедур твоего сорца:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// было: procedure TForm1.UpdateTableData(var Msg: TMessage);
// стало
void TForm1::UpdateTableData(TMessage& Msg)
{  for(int Index=  0 ;Index < DBDataModule->ComponentCount;++Index)
  // DBDataModule - это Data module, в котором находятся все
  // TTable нашего   проекта...
    TTable * table=dynamic_cast<TTable*>Components[Index] ;
    if(table && table->State == dbBrowse)
       table->Refresh;
}
Ну и твори в том же духе.
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33952960
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня этот код и работает сейчас. Но дергается скрол в гриде...
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33952983
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вместо ++Index надо наверное Index++
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33953309
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SCORPION ZУ меня этот код и работает сейчас. Но дергается скрол в гриде...Тогда причем тут сабж. Про грид и спрашивай.
SCORPION ZИ вместо ++Index надо наверное Index++А что, результат изменится?
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33954989
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SCORPION ZУ меня этот код и работает сейчас. Но дергается скрол в гриде...
помнится когда-то перед апдейтом, просто делал невидимым грид, а потом после обновления видимым, работало дето в раз 10 быстрее :) и тогда ничего не мерцало, а если записей было много, то лепил чтобы юзеру нескучно было - прогресбар :)
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33955551
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sashka304 SCORPION ZУ меня этот код и работает сейчас. Но дергается скрол в гриде...
помнится когда-то перед апдейтом, просто делал невидимым грид, а потом после обновления видимым, работало дето в раз 10 быстрее :) и тогда ничего не мерцало, а если записей было много, то лепил чтобы юзеру нескучно было - прогресбар :)
Ну в этом варианте действительно будет быстрее. Только вот что лучше "дергание скрола" или "появл/исчезание грида"?
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33955555
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisableControls + EnableControls
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Сетевой Refresh локальной БД
    #33955559
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Карабас БарабасDisableControls + EnableControls
Posted via ActualForum NNTP Server 1.3
Может быть ...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сетевой Refresh локальной БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]