Текущий архив: 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.45 MB
Время: 0.045 c