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

Вниз

Помогите с созданием класса   Найти похожие ветки 

 
alexnmsk   (2004-01-21 15:07) [0]

Помогите создать класс с свойством типа динамический массив. Есть код

type
TPerson = record
Number, Text:String;
end;

PPersons = ^TPersons;
TPersons = array of TPerson;

TNoteBook = class(TPersistent)
private
{ Private declarations }
FPersons: PPersons;
FPersonCount: Integer;
function GetPerson (ID:Integer):TPerson;
procedure SetPerson (ID:Integer; const Value:TPerson);
procedure SetPersonCount (Value:Integer);
public
{ Public declarations }
property MaxPersonCount:Integer read FPersonCount write SetPersonCount;
property Persons[ID:Integer]:TPerson read GetPerson write SetPerson; default;
end;

implementation

function TNoteBook.GetPerson(ID:Integer):TPerson;
begin
if Length(FPersons^)>ID Then Result:=FPersons^[ID] else
Raise Exception.Create("Ошибка индексации");
end;

procedure TNoteBook.SetPerson (ID:Integer; const Value:TPerson);
begin
if Length(FPersons^)>ID Then FPersons^[ID]:=Value else
Raise Exception.Create("Ошибка индексации");
end;

procedure TNoteBook.SetPersonCount (Value:Integer);
begin
SetLength(FPersons^,Value);
end;


При компиляции кода с использованием этого класса строка
n.Persons[0].Text:="Имя"; выдает ошибку
[Error] Unit1.pas(31): Left side cannot be assigned to


 
jack128 ©   (2004-01-21 15:12) [1]


> создать класс с свойством типа динамический массив.
так не бывает. Есть просто свойство-массив.


> n.Persons[0].Text:="Имя"; выдает ошибку
> [Error] Unit1.pas(31): Left side cannot be assigned to

нужно так
var p: TPerson;
begin
p := n.Persons[0];
p.Text := "Имя";
n.Persons[0] := p;
end;


 
Рамиль ©   (2004-01-21 15:14) [2]

FPersons^[ID].Text := Value;
Только зачем тут указатель использовать?!.


 
TUser ©   (2004-01-21 15:16) [3]

TMine = class
privat
FCount:integer;
FAr:array of integer; // или др. тип
public
constructor Create;
procedure wrAr(Value"integer)"
function rAr(Index:integer):integer;

property Ar[Index:integer]:integer read rAr write wrAr;
property Count read FCount;
end;

constructor TMine.Create;
begin
FCount:=0;
setLength(FAr,0);
end;

TMine wrAr(..);
begin
setLength(FAr, length(FAr)+1);
Ar(length(Ar)-1]:=value;
end;

function rAr(Index:integer):integer;
begin
if (Index>=0) and (Index<=FCount-1) then
result:=FAr[Index]
else raise EAccessViolation;
end;
end;


 
MBo ©   (2004-01-21 15:25) [4]

Если свойство типа запись или класс, то присваивать можно только целикомю При желании иметь отдельный доступ к полям заведи еще свойства PersonNumber и PersonText со своими функциями доступа


 
alexnmsk   (2004-01-21 15:33) [5]


> MBo © (21.01.04 15:25) [4]

Спасибо понял. Так и сделаю.


 
alexnmsk   (2004-01-21 15:43) [6]

Еще вопрос. А как сделано например в классе TTreeNodes, где Item ссылается на массив элементов типа TTreeNode?
TreeNodes1.Item[0].Text:="любое значение"
Что нибудь подобное можно сделать?


 
MBo ©   (2004-01-21 15:48) [7]

Item[0] - объект, text - его свойство. Можно.
В [4] я некорректно написал.


 
alexnmsk   (2004-01-21 15:56) [8]

Если я правильно понял, мне следует TPerson=record заменить на TPerson=class(TPersistent), но тогда как сделать инициализацию TPersons или изменение длины массива?


 
Skier ©   (2004-01-21 17:35) [9]

>alexnmsk (21.01.04 15:56) [8]

Вместо TPersons = array of TPerson используй потомок класса TList, что-то типа TPersonList = class(TList), где элементы будут типа PPersons


 
TUser ©   (2004-01-21 17:41) [10]


> А как сделано например в классе TTreeNodes

Сделано так же как в [3], только не integer, а TTreeNode


 
TUser ©   (2004-01-21 17:47) [11]

Про [3] - это я, конечно, погорячился.
Правильнее так

procedure TMine.wrItem(Index:integer; Value:integer);
begin
If (Index>=0) and (Index<=FCount-1) then
FAr[Index]:=Value else raise ...
end;

procedure TMine.Add(Value:integer);
begin
setLength(FAr,length(FAr)+1);
FAr[length(FAr)-1]:=Value;
end;


 
ЮЮ ©   (2004-01-22 05:55) [12]

>Если я правильно понял, мне следует TPerson=record заменить на TPerson=class(TPersistent)

не следует порождать сущности там где их нет. Вряд ли TPerson будет иметь какаие-то полезные методы в рамках TNoteBook.

См. MBo © (21.01.04 15:25) [4]

Достаточно вместо
property Persons[ID:Integer]:TPerson read GetPerson write SetPerson; default;

опубликовать св-ва
property PersonNumber[ID:Integer]: string read GetPersonNumber write SetPersonNumber;
и т.д. и тогда совершенно не важно будет, как внутренне организовано хранение записей, в списке ли или в динамическом массиве



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
8-2236
Sim
2003-09-16 20:07
2004.02.02
Фракталы (мн-во Мандельброта)


1-2207
Alexis
2004-01-20 20:47
2004.02.02
приложение без формы...


7-2392
Vasek
2003-11-14 14:59
2004.02.02
Работающие приложения


14-2308
}|{yk
2004-01-12 12:48
2004.02.02
Вопросы из харьковского ЧГК. №14


3-1995
dimkaaa
2004-01-08 12:05
2004.02.02
Поиск в Access