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

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

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

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

Сообщение son » 09.01.2017 22:35:54

Доброго дня. Не могу разобраться с простым вопросом по 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 объект класса, то он хранит ссылку на него. Но я получаю по ссылке фигню. Где я ошибаюсь?
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

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

Сообщение скалогрыз » 09.01.2017 22:41:30

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;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение runewalsh » 09.01.2017 22:45:09

Главное, ты в одном месте работаешь правильно (TMuClass(List[index])), в другом нет.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение son » 09.01.2017 23:02:37

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

Код: Выделить всё
var pClass : TMuClass;
begin
  pClass:=List[SpinEdit1.Value];
  Edit1.Text:=inttostr(pClass.Count);
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

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

Сообщение скалогрыз » 10.01.2017 00:45:55

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

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

что такое конструктор копирования?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение son » 10.01.2017 01:37:47

Про FreePascal не уверен, а в C++ если переменной класса присвоить объект класса из другой переменной, то создастся полная копия этого объекта с помощью конструктора копирования.
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

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

Сообщение runewalsh » 10.01.2017 01:52:36

В FPC/Delphi для классов принципиально нет семантики значений, экземпляры создаются в куче, т. о. переменные классового типа — всегда указатели.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение скалогрыз » 10.01.2017 02:00:52

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

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

обратная сторона медали - не так-то просто сделать копию объекта, т.к. встроеных механизмов в языке нет... пока что...
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение sign » 10.01.2017 06:50:48

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

Я для своих классов всегда пишу Assign.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

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

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

и да! не рассказывайте son-у ничего про advanced record-ы... а то мало ли! :mrgreen:
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение zub » 10.01.2017 09:25:11

>>обратная сторона медали - не так-то просто сделать копию объекта, т.к. встроеных механизмов в языке нет... пока что...
Кто мешает написать свой TMyClass.DeepCopy?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение son » 10.01.2017 15:57:24

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

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


таак... а ну рассказывайте что это такое!!! а то мне мало!!! это как я понял вроде "недокласса" или "переструктура"?
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

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

Сообщение скалогрыз » 10.01.2017 17:03:49

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

тебе это не нужно. Классы решают все твои запросы!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение serbod » 11.01.2017 10:34:27

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

Код: Выделить всё
property ListIndex: Integer read FListIndex write SetListIndex;

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


Так выглядит логичней, и сложнее ошибиться в дальнейшем.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru