|
Тема |
Търси се програмист за задачка... |
|
Автор | kozhuharov@bitex.com (Нерегистриран) | |
Публикувано | 07.08.04 16:37 |
|
|
Търси се програмист, владеещ разработването на компоненти, за написване на два невизуални такива. Те няма да имат реална функционалност а ще бъдат използвани за обучение на ученици.
Ето и кратко описание на компонентите:
TSBINARY = record
cb:ULONG; // дължина на масива от байтове в lpb
lpb:PByte; // указател към блок от паметта съдържащ поредица от байтове
end;
TMRec = class(TPersistent)
private
FName:String;
FDefault:Boolean;
FEntryID: TSBINARY;
function GetMSEntryID:string;
public
procedure SetMSEntryID(const Value:string);
public
property MSName:String read FName write FName;
property MSDefault:Boolean read FDefault write FDefault;
property MSEntryID:String read GetMSEntryID;
end;
TMasterComp = class(TComponent)
private
FActive:Boolean;
FList:TList;
public
function GetList:TList;
published
property Active:Boolean Read FActive Write SetActive;
end;
TSlaveComp = class(TComponent)
private
FComp:TMasterComp;
FMRec:TMRec;
public
procedure ShowMRec; // Показва стойността на публикуваните пропертита на FMRec
published
property Active:Boolean;
property MasterComp:TMasterComp read FMasterComp write SetMasterComp;
property MRec:TMRec read FMRec write SetMRec;
end;
///////////////////////////////////////////////
//Помощни функции
///////////////////////////////////////////////
function StringToEntryId(const EntryId: string): TSBINARY;
type
TCharToArray = array [0..1] of Char;
PCharToArray = ^TCharToArray;
var
_I: Integer;
CurrentByte: PByte;
CurrentChar: PCharToArray;
begin
Result.cb := Length(EntryId) div 2;
GetMem(Result.lpb, Result.cb);
FillChar(Result.lpb^, Result.cb, 0);
CurrentByte := Result.lpb;
if Result.cb > 0 then
begin
CurrentChar := @EntryId[1];
for _I := 0 to Result.cb - 1 do
begin
CurrentByte^ := StrToIntDef('$' + CurrentChar^, 0);
Inc(CurrentByte);
Inc(CurrentChar);
end;
end;
end;
function EntryIdToString(const EntryId: TSBINARY): string;
var
_i: Integer;
CurrentByte: pByte;
begin
Result := '';
if EntryId.cb > 0 then
begin
CurrentByte := EntryId.lpb;
for _i := 0 to EntryId.cb - 1 do
begin
Result := Result + IntToHex(CurrentByte^, 2);
Inc(CurrentByte);
end;
end;
end;
///////////////////////////////////////////////
//КРАЙ Помощни функции
///////////////////////////////////////////////
function TMasterComp.GetList:TList;
var
_iCount:Integer;
_MRec:TMRec;
begin
if not Assigned(FList) then
begin
FList:=TList.Create;
for _iCount:=0 to 15 do
begin
_MRec:=TMRec.Create;
_MRec.MSDefault:=iCount mod 2 = 0;
_MRec.MSName:= IntToHEX(iCount,8);
_MRec.SetMSEntryID(IntToHEX(iCount*3,8));
TList.Add(_MRec);
end;
end;
Result:=FList;
end;
procedure _MRec.SetMSEntryID(const Value:string);
begin
FEntryID:=StringToEntryId(Value);
end;
function _MRec.GetMSEntryID:String;
begin
Result:=EntryIdToString(FEntryID);
end;
/////////////////////////////////////
Търсена функционалност
- TSlaveComp може да бъде активен само и единствено когато има присвоен TMasterComp
- MRec на TSlaveComp в DesignTime трябва да позволява избирането на такова от върнатия списък от
function TMasterComp.GetList, и не може да приема стойност различна от тези,
които връща TMasterComp.GetList При избора, потребителя трябва да има възможнос да вижда стойностите
на публикуваните свойства на MRec, но не и да ги променя, т.е. връщаните от TMasterComp.GetList обекти
са ReadOnly
- При преминаване на TMasterComp.Active=False, TMasterComp.GetList трябва да връща nil
- При преминаване на TMasterComp.Active=False, всички инстанции на TSlaveComp също стават Active = False
и присвоеното свойство MRec на TSlaveComp става nil
|
| |
|
|
|