Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-2338
race1
2004-01-10 18:12
2004.02.02
длинныое имя файла


1-2126
zamkom
2004-01-19 17:07
2004.02.02
Поиск текста в файле


9-1943
RIMMER
2003-07-17 23:32
2004.02.02
DelphiX: DXDraw на полный экран и обратно в runtime


3-1975
Layner
2004-01-08 11:47
2004.02.02
Господа, помогите с выборкой, надо выбрать людей, у кого день


1-2106
killer
2004-01-18 00:33
2004.02.02
Ярлык около кнопки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский