Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
ВнизПомогите с созданием класса Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c