![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зачем придумали 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-компонентов с различнымиисточниками данных.