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

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

Зачем придумали DataSource?


StriderMan ©   (2006-11-17 10:49:00) 

Я конечно понимаю где и как он используется в Delphi, но мне кажется это лишняя прослойка между DataSet и контролами. Объясните глубокую мысль разработчиков VCL.


ЮЮ   (2006-11-17 13:24:00) [1]

как видно, никто никого не оповещает, а только флажок возводится.
Если оповещать некого, то какая разница кого? :)

procedure TDataSet.DataEvent(Event: TDataEvent; Info: Longint);
...
begin
 NotifyDataSources := not (ControlsDisabled or (State = dsBlockRead));
 case Event of
   deFieldChange:
     begin
       if TField(Info).FieldKind in [fkData, fkInternalCalc] then
         SetModified(True);
       UpdateCalcFields;
     end;
   deFieldListChange:
     FieldList.Updated := False;
   dePropertyChange:
     FieldDefs.Updated := False;
   deCheckBrowseMode:
     CheckNestedBrowseMode;
   deDataSetChange, deDataSetScroll:
     NotifyDetails;
   deLayoutChange:
     begin
       FieldList.Updated := False;
       if ControlsDisabled then
         FEnableEvent := deLayoutChange;
     end;
   deUpdateState:
     if ControlsDisabled then
     begin
       Event := deDisabledStateChange;
       Info := Integer(State <> dsInactive);
       NotifyDataSources := True;
     end;
 end;

  if NotifyDataSources then
 begin
   for I := 0 to FDataSources.Count - 1 do
     TDataSource(FDataSources[I]).DataEvent(Event, Info);
   if FDesigner <> nil then FDesigner.DataEvent(Event, Info);
 end;

end;


Т.е. в выделенном месте потребовалось бы
  TControl(F...Controls[I]).DataEvent(Event, Info);


StriderMan   (2006-11-17 13:10:00) [2]

насчет DisableControls:

procedure TDataSet.DisableControls;
begin
 if FDisableCount = 0 then
 begin
   FDisableState := FState;
   FEnableEvent := deDataSetChange;
 end;
 Inc(FDisableCount);
end;

как видно, никто никого не оповещает, а только флажок возводится.

а в EnableControls уже генерится событие DataEvent:
procedure TDataSet.EnableControls;
begin
 if FDisableCount <> 0 then
 begin
   Dec(FDisableCount);
   if FDisableCount = 0 then
   begin
     if FDisableState <> FState then DataEvent(deUpdateState, 0);
     if (FDisableState <> dsInactive) and (FState <> dsInactive) then
        DataEvent(FEnableEvent, 0);
   end;
 end;
end;


и в DataEventкстати, все операции совершаются только с TField, и только в случае флажка NotifyDataSources идет обращение к DataSource.


> оповешать их. А их это кого - любых наследников TControl. Т.е. TControl должен был знать о TDataSet

как видно, напрямую TControl'ы не оповещають и не надо. только через флажок или через TField.


Anatoly Podgoretsky   (2006-11-17 12:57:00) [3]

> StriderMan  (17.11.2006 12:29:08)  [8]

А ведь с DisableControls был только первый попавший пример.


ЮЮ   (2006-11-17 12:39:00) [4]


> зачем TControl'у знать о DataSet? о нем могли бы знать TDBXxx-
> контролы.

какая разница, знает о контролах DataSet или DataSource?


Вот и я о том же. А почему они о нем знают. Потому что у них есть DataSource. И они реагирует на его поведение (достаточно простое) так или иначе. А если бы у них был DataSet, то он должен был оповешать их. А их это кого - любых наследников TControl.  Т.е. TControl должен был знать о TDataSet и о его сообщениях.


StriderMan   (2006-11-17 12:29:00) [5]


> Anatoly Podgoretsky ©   (17.11.06 12:00) [7]
> Так ты еще и DB Aware компоненты предлагаешь переписать :-)

теперь-то че переписывать... сделали как сделали...

все же не вижу насущной необходимости


Anatoly Podgoretsky   (2006-11-17 12:00:00) [6]

> StriderMan  (17.11.2006 11:32:05)  [5]

Так ты еще и DB Aware компоненты предлагаешь переписать :-)


Игорь Шевченко   (2006-11-17 11:48:00) [7]

StriderMan ©   (17.11.06 11:32) [5]

У меня не вызывает


StriderMan   (2006-11-17 11:32:00) [8]


> Иначе ему пришлось бы общаться с TControl, а тому знать  о существовании TDataSet

зачем TControl'у знать о DataSet? о нем могли бы знать TDBXxx-контролы.


> TDataSet.DisableControls не общается с контролами, а с DataSiurce.


какая разница, знает о контролах DataSet или DataSource?


> Игорь Шевченко ©   (17.11.06 11:12) [4]

Вы и это серьезно? т.е. сабж тоже вызывает у вас сомнения в необходимости?


Игорь Шевченко   (2006-11-17 11:12:00) [9]

В Delphi придумано много лишнего. Не обращай внимания


ЮЮ   (2006-11-17 11:05:00) [10]

TDataSet.DisableControls не общается с контролами, а с DataSiurce. Иначе ему пришлось бы общаться с TControl, а тому знать о существовании TDataSet. А так с DataSet-ом (через DataSource) знакомятся только DB-Aware компоненты.


StriderMan   (2006-11-17 10:53:00) [11]


> Плохиш ©   (17.11.06 10:51) [1]

в TDataSet и так все есть что нужно, ИМХО.


Плохиш   (2006-11-17 10:51:00) [12]


> StriderMan ©   (17.11.06 10:49)  

Эта прослойка позволяет унифицировать связи различныхDBAware-компонентов с различнымиисточниками данных.


Наверх

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