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

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

Зачем Borland так делает???


Ega23 ©   (2005-06-14 11:06:00) 


 TDataSet = class(TComponent, IProviderSupport)
 private
   ........
   FActiveRecord: Integer;
   ........
 
 end;

 TDataLink = class(TPersistent)
 private
   ........
   FDataSource: TDataSource;
   ........
   function GetDataSet: TDataSet;
   ........
   procedure UpdateRange;
   ........
 protected
   ........
 public
   ........
   property DataSet: TDataSet read GetDataSet;
   ........
 end;
 

function TDataLink.GetDataSet: TDataSet;
begin
 if DataSource <> nil then Result := DataSource.DataSet else Result := nil;
end;

procedure TDataLink.UpdateRange;
var
 Min, Max: Integer;
begin
 Min := DataSet. FActiveRecord- FBufferCount + 1;
 if Min < 0 then Min := 0;
 Max := DataSet. FBufferCount- FBufferCount;
 if Max < 0 then Max := 0;
 if Max > DataSet.FActiveRecord then Max := DataSet.FActiveRecord;
 if FFirstRecord < Min then FFirstRecord := Min;
 if FFirstRecord > Max then FFirstRecord := Max;
 if (FFirstRecord <> 0) and
    (DataSet.FActiveRecord - FFirstRecord < FBufferCount - 1) then
   Dec(FFirstRecord);
end;



?????????

Я конечно понимаю, что единицей инкапсуляции является юнит, а не класс, но всё-таки....


Ega23   (2005-06-14 11:56:00) [1]

TUser ©   (14.06.05 11:54) [3]

Это public-property
Речь идёт о том, чтобы "достучаться" до private-полей.


TUser   (2005-06-14 11:54:00) [2]

> 1. Нарушу "генофонд" (в DB.pas пропишу собственный класс)

Т.е. вы хотите прописать свое значение в read-only свойство?
unit Unit1;

interface

type
TTest = class
 private
  FField: integer;
 public
  procedure SetInteger (Value: integer);
  property Field: integer read FField;
 end;

implementation

procedure TTest.SetInteger (Value: integer);
begin
 FField:=Value;
end;

end.

// =========================

unit Unit2;

interface
uses Unit1;

procedure SetField (T: TTest; Value: integer);

implementation

type
PInteger = ^integer;

procedure SetField (T: TTest; Value: integer);
var p: PInteger;
begin
 p:=@T.Field;
 p^:=Value;
end;

end.

// =============================

{$apptype console}
program Test;
uses Unit1, Unit2, SysUtils;

var T: TTest;
begin
 T:=TTest.Create;
 try
  T.SetInteger (10);
  SetField (T,20);
  writeln (inttostr(T.Field));
 finally
  T.Free;
 end;
end.


Ega23   (2005-06-14 11:19:00) [3]

2 -=XP=- ©   (14.06.05 11:16) [1]

Да я это знаю... Тут другое: я вот пытаюсь понять, каким образом DataLink реагирует на изменение данных в DataSet'е и где хранится буфер данных. Самое обидное, что я САМ такого сделать не смогу. Точнее, смогу только если:
1. Нарушу "генофонд" (в DB.pas пропишу собственный класс)
2. Унаследую класс от TDataSet в своём модуле.
Обидно...


-=XP=-   (2005-06-14 11:16:00) [4]

В Delphi нет явного понятия "дружественные классы". "Дружественность" определяется на уровне модуля - все классы, объявленные в одном модуле являются "дружественными". Поэтому никто не запрещает делать так, как сделано в приведенном Вами примере.


Наверх

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