Ламерский вопрос про TList

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Ламерский вопрос про TList

Сообщение son »

Доброго дня. Не могу разобраться с простым вопросом по TList. По идее TList хранит указатели на объекты класса. Почему я не могу получить их в виде указателей. Вод код:

Код: Выделить всё

{ TMuClass }

  PMuClass = ^TMuClass;
  TMuClass = class
  private
    FActive: boolean;
    FCount: integer;
    procedure SetActive(AValue: boolean);
    procedure SetCount(AValue: integer);

  public
    property Active:boolean read FActive write SetActive;
    property Count : integer read FCount write SetCount;

    constructor Create;
    destructor Destroy;override;
  end;

var
  Form1: TForm1;
  List : TList; 
 
implementation

{$R *.lfm}

{ TMuClass }

procedure TMuClass.SetActive(AValue: boolean);
begin
  if FActive=AValue then Exit;
  FActive:=AValue;
end;

procedure TMuClass.SetCount(AValue: integer);
begin
  if FCount=AValue then Exit;
  FCount:=AValue;
end;

constructor TMuClass.Create;
begin
  FActive:=false;
end;

destructor TMuClass.Destroy;
begin

end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  List:=TList.Create;
end;

procedure TForm1.btAddClick(Sender: TObject);
var index:integer;
begin
  index:=List.Add(TMuClass.Create);
  TMuClass(List[index]).Count:=index;

end;

procedure TForm1.btGet0pointClick(Sender: TObject);
var pClass : PMuClass;
begin
  pClass:=List[SpinEdit1.Value];
  Edit1.Text:=inttostr(pClass^.Count);
end;


То есть если я добавил в TList объект класса, то он хранит ссылку на него. Но я получаю по ссылке фигню. Где я ошибаюсь?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Ламерский вопрос про TList

Сообщение скалогрыз »

1) К классам всегда обращаются через указатали! выкидывай нафиг PMuClass, чтобы не смущал! И помни, что переменная TMuClass это уже указатель (на класс).
2) код btGet0pointClick противоречит btAddClick. Ведь в btAddClick ты записал класс, а в btGe0pointClick ты этот класс, приводишь к указателю на класс (читай к указателю на указатель).

Так вот, если ты избавишься от PMuClass, то у тебя всё заработает

Код: Выделить всё

procedure TForm1.btGet0pointClick(Sender: TObject);
var m : TMuClass;
begin
  m:=TMuClass(List[SpinEdit1.Value]);
  Edit1.Text:=inttostr(m.Count);
end;
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Ламерский вопрос про TList

Сообщение runewalsh »

Главное, ты в одном месте работаешь правильно (TMuClass(List[index])), в другом нет.
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Ламерский вопрос про TList

Сообщение son »

Понятно. То есть такой код не приводит к созданию нового объекта класса через конструктор копирования?:

Код: Выделить всё

var pClass : TMuClass;
begin
  pClass:=List[SpinEdit1.Value];
  Edit1.Text:=inttostr(pClass.Count);
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Ламерский вопрос про TList

Сообщение скалогрыз »

son писал(а):То есть такой код не приводит к созданию нового объекта класса

не приводит!
son писал(а):через конструктор копирования

что такое конструктор копирования?
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Ламерский вопрос про TList

Сообщение son »

Про FreePascal не уверен, а в C++ если переменной класса присвоить объект класса из другой переменной, то создастся полная копия этого объекта с помощью конструктора копирования.
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Ламерский вопрос про TList

Сообщение runewalsh »

В FPC/Delphi для классов принципиально нет семантики значений, экземпляры создаются в куче, т. о. переменные классового типа — всегда указатели.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Ламерский вопрос про TList

Сообщение скалогрыз »

runewalsh писал(а):В FPC/Delphi для классов принципиально нет семантики значений, экземпляры создаются в куче, т. о. переменные классового типа — всегда указатели.

вспомнилось:
"В мире деревьев нет зла, а значит и нет защиты от него, Брендон" (c) :mrgreen:

обратная сторона медали - не так-то просто сделать копию объекта, т.к. встроеных механизмов в языке нет... пока что...
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Ламерский вопрос про TList

Сообщение sign »

скалогрыз писал(а):не так-то просто сделать копию объекта, т.к. встроеных механизмов в языке нет... пока что...

Я для своих классов всегда пишу Assign.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Ламерский вопрос про TList

Сообщение скалогрыз »

sign писал(а):Я для своих классов всегда пишу Assign.

и да! не рассказывайте son-у ничего про advanced record-ы... а то мало ли! :mrgreen:
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Re: Ламерский вопрос про TList

Сообщение zub »

>>обратная сторона медали - не так-то просто сделать копию объекта, т.к. встроеных механизмов в языке нет... пока что...
Кто мешает написать свой TMyClass.DeepCopy?
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Ламерский вопрос про TList

Сообщение son »

скалогрыз писал(а):
sign писал(а):Я для своих классов всегда пишу Assign.

и да! не рассказывайте son-у ничего про advanced record-ы... а то мало ли! :mrgreen:


таак... а ну рассказывайте что это такое!!! а то мне мало!!! это как я понял вроде "недокласса" или "переструктура"?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Ламерский вопрос про TList

Сообщение скалогрыз »

son писал(а):таак... а ну рассказывайте что это такое!!! а то мне мало!!! это как я понял вроде "недокласса" или "переструктура"?

тебе это не нужно. Классы решают все твои запросы!
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Re: Ламерский вопрос про TList

Сообщение serbod »

Еще одно замечание - Count это, традиционно, число элементов в списке. А позиция элемента называется Index.

Код: Выделить всё

property ListIndex: Integer read FListIndex write SetListIndex;

TMuClass(List[Index]).ListIndex := Index;


Так выглядит логичней, и сложнее ошибиться в дальнейшем.
Ответить