Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Зачем Borland так делает???   Найти похожие ветки 

 
Ega23 ©   (2005-06-14 11:06) [0]


 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;



?????????

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


 
-=XP=- ©   (2005-06-14 11:16) [1]

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


 
Ega23 ©   (2005-06-14 11:19) [2]

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

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


 
TUser ©   (2005-06-14 11:54) [3]

> 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:56) [4]

TUser ©   (14.06.05 11:54) [3]

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



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

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.063 c
1-1118612839
Вин2
2005-06-13 01:47
2005.07.11
Как добавить к TPanel свойства OnKeyPress, OnKeyUp, OnKeyDown ?


4-1115894651
misyachniy
2005-05-12 14:44
2005.07.11
Как правильно организовать задержку при обращении к USB?


1-1118604619
Tigraman
2005-06-12 23:30
2005.07.11
Про реестр


10-1095424935
AlexXn
2004-09-17 16:42
2005.07.11
Подключение tlb к проекту


8-1111129984
Leeechhhh
2005-03-18 10:13
2005.07.11
Как заменить цвета прописанные в массиве