|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Указатель на объект
Правильно ли я понимаю что переменная типа TObject или его наследников, это всегда указатель, про который компилятору (ну или кому там) не нужно объяснять что это указатель ('^', '@' - вот это вот все) . И сам объект существует (если конечно он был создан) независимо от того сколько указателей на него существует.
Ну т.е. в практическом плане: Код:
TPart = class (TObject) private FName: string; FRemainder: Word; public property Name: string read FName write FName; property Remainder: Word read FRemainder write FRemainder; end; TPartsArray = array of TPart; TProduct = class(TObject) private FName: string; FPartList: TPartsArray ; public property Name: string read FName write FName; property PartList: TPartList read FPartList write FPartList; end; Код:
constructor TProduct.Create(AParts: TPartsArray); begin ..... FPartList[someIndex]:= AParts[anotherIndex]; end; Код:
MyProduct1: TProduct; AllParts: TPartsArray; ... MyProduct1.PartList[i].Name; AllParts[j].Name; |
#2
|
|||
|
|||
Не совсем понятне вопрос, но да, любой экземпляр класса - это указатель.
С массивами там немного другая тема. Да, это тоже указатель, но он обрабатывается компилятором тодельным образом. А вот каждый элемент массива объектом - тоже обычный указательна объект. Не уверен, что второй класс в первом примере будет работать так, как ты задумал. В смысле property PartList объявленная как массив. Как я уже приводил пример, там лучше сделать индексированное св-во с геттером и сеттером. Хотя если будешь следить за своим кодом, то может и будет работать... |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Помидоркин (29.08.2022)
|
#3
|
||||
|
||||
Цитата:
Создание объекта это выделение памяти под него и все его поля, присвоение nil указателю не удаляет объект из памяти. Поля типов не являющихся классами (число, строка, boolen) удаляются автоматом при вызове деструктора объекта. Объявление переменной типа TSomeClass не создает новый объект (не выделяет под него память), а присвоение: Код:
CurrenPart:= AllParts[0]; Цитата:
Код:
property Parts[Index: Word]: TPart read GetParts write SetParts; property Products[Index: Byte]: TProduct read GetProducts write SetProducts; property Tasks[Index: Word]: TTask read GetTasks write SetTasks; Код:
function TMyJSONdb.GetTasks(Index: Word): TTask; begin Result:= FTasks[Index]; end; procedure TMyJSONdb.SetTasks(Index: Word; const Value: TTask); begin FTasks[Index]:= Value; end; Последний раз редактировалось Помидоркин, 31.08.2022 в 07:32. |
#4
|
||||
|
||||
Чёта я запутался, собственно что я пытаюсь сделать: есть класс и массив его экземпляров
Код:
TPart = class (TObject) private FName: string; FNeed: Word; FDone: Word; public property Name: string read FName write FName; property Need: Word read FNeed write FNeed; property Done: Word read FDone write FDone; end; TPartsArray = array of TPart; ............. AllParts: TPartsArray; Код:
TProduct = class(TObject) private FName: string; function GetPart(const Index: Byte): TProductPart; procedure SetPart(const Index: Byte; const Value: TProductPart); public property Name: string read FName write FName; property Part[Index]: TProductPart read GetPart write SetPart; //<<<???? end; ............. Product: TProduct Код:
TProductPart = class(TObject) private FItem: TPart; FCount: Byte; public property Item: TPart read FItem write FItem; property Count: Byte read FCount write FCount; //к количесву элементов отношения не имеет end; Вроде как нужно наследовать Код:
TProductPart = class(TPart) private FCount: Byte; public property Count: Byte read FCount write FCount; end; Код:
(Produdct.Part[i] as TPart):= AllPart[k]; //ну или типа того upd. Пришел в голову вот такой вариант: Код:
TProductPart = class(TObject) private FPart: TPart; FCount: Byte; function GetName: string; //SetName - по аналогии; public property Name: string read GetName write SetName; // и все остальное так же property Count: Byte read FCount write FCount; //к количесву элементов отношения не имеет end; ..... function TProductPart.GetName: string begin Result:= FPart.Name; end; Последний раз редактировалось Помидоркин, 31.08.2022 в 11:12. |
#5
|
|||
|
|||
Ой бяда, бяда...
Ты что, пытаешься сделать связь многие-ко-многим в виде объектов? Тогда уж бери какую-нибудь локальную БД и пользуй ее. ЗЫ. Вообще не понимаю задачу. Что ты пытаешься сделать вообще... |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Помидоркин (01.09.2022)
|
#6
|
||||
|
||||
Цитата:
БД в первую очередь и рассматривались, в самом начале я вообще пытался в Access, но со времен Office 97 его настолько улучшили что... печальная тема. Пытался с БД в Delphi, но по старой доброй традиции материалы по теме имеют вид: "одно яблоко плюс одно яблоко будет два яблока, теперь вы знаете математику и для закрепления полученных знаний вот вам квадратное уравнение". Впрочем не это главное, в общем по совокупности многих факторов решил делать сам, с нуля. А бонусом хочу проникнуться духом ООП, в который, как выясняется, я нифига не умею, ну почти. Последний раз редактировалось Помидоркин, 01.09.2022 в 10:18. |