Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

как правильно обратиться к полю?   Найти похожие ветки 

 
brother_home   (2011-08-29 09:55) [0]

Приветствую!
есть:
 TPlayer = record
   No: byte;
   Name: string;
   ...
 end;

TM = class(TObject)
 private
   FActivePlayer: byte;
   ...
   function GetActivePlayer: TPlayer;
  ...
 public
   ...
   Player: array [1..MaxPlayers] of TPlayer;
   ...
   property ActivePlayer: TPlayer read GetActivePlayer write ???
   ...
 end;

function TM.GetActivePlayer: TPlayer;
begin
 if FActivePlayer in [1..6] then
   result:= Player[FActivePlayer]
 else
   result:= PlayerNull;
end;

данная конструкция позволяет только читать поля активного игрока,
а как реализовать запись, например:
ActivePlayer.Name = "Игрок1";
пока пишу так:
if FActivePlayer in [1..6] then Player[FActivePlayer].Name = "Игрок1";


 
brother_home   (2011-08-29 10:15) [1]

может ссылку?


 
Медвежонок Пятачок ©   (2011-08-29 10:32) [2]

гетактивплеер.нэйм = "";


 
Медвежонок Пятачок ©   (2011-08-29 10:35) [3]

ну и проверить что оно не плеернул


 
brother_home   (2011-08-29 11:13) [4]


> гетактивплеер.нэйм = "";

так write не описан, значит будет тока реад онли...


 
Медвежонок Пятачок ©   (2011-08-29 11:19) [5]

с дерева упал?


 
Медвежонок Пятачок ©   (2011-08-29 11:22) [6]

райт не прописан гетактивплееру.
но мы-то меняем не активплеера а его нэйм, уже имея в руках самого TPlayer


 
Медвежонок Пятачок ©   (2011-08-29 11:26) [7]

И при присвоении значений возвращенному рекорду, код твоего дурацкого TM = class(TObject)
уже никаким боком не участвует.


 
Медвежонок Пятачок ©   (2011-08-29 11:27) [8]

... присвоении значений полям рекорда конечно.


 
brother_home   (2011-08-29 11:27) [9]


> гетактивплеер.нэйм = "";

ошибка: Left side cannot assigned to


 
brother_home   (2011-08-29 11:30) [10]

я вопрос не зря задал...


 
Медвежонок Пятачок ©   (2011-08-29 11:31) [11]

Ты не свойству присваивай.


 
brother_home   (2011-08-29 11:33) [12]

а к чему присваивать? можно подробнее?


 
Медвежонок Пятачок ©   (2011-08-29 11:36) [13]

PPlayer = ^TPlayer;
...
function GetActivePlayer: PPlayer;
...

p := TM.Create;
p.GetActivePlayer.Name := "Dunduk";


 
brother_home   (2011-08-29 11:42) [14]

спасибо переделал, так правильно?:
   property ActivePlayer: PPlayer read GetActivePlayer;
...
function TManager.GetActivePlayer: PPlayer;
begin
 if FActivePlayer in [1..6] then
   result:= @Player[FActivePlayer]
 else
   result:= @PlayerNull;
end;


 
brother_home   (2011-08-29 11:43) [15]

только я так и не понял, почему когда функция GetActivePlayer возвращает сам объект, то ошибка, а если указатель, то все норм?


 
И. Павел ©   (2011-08-29 11:47) [16]

Если разделить получение GetActivePlayer от изменения Name - компилятор не заметит подвоха :)
procedure TForm1.Button1Click(Sender: TObject);
var player: TPlayer;
   OTM: TM;
begin
 ...
 player := OTM.GetActivePlayer;
 player.Name := "";
end;


 
Медвежонок Пятачок ©   (2011-08-29 11:47) [17]

Потому что рекорд это не объект.
И при геетактивплеер : TPlayer приходит копия рекорда.
И какой смысл присваивать ее полям что-то, если они дальше этой копии не уйдут и более того, сама копия умрет при выходе из зоны видимости.


 
Медвежонок Пятачок ©   (2011-08-29 11:49) [18]

procedure TForm1.Button1Click(Sender: TObject);
var player: TPlayer;
  OTM: TM;
begin
...
player := OTM.GetActivePlayer;
player.Name := "";
end;


смотри выше.
все твои изменения будут жить недолго да еще и не там где ты хочешь.


 
brother_home   (2011-08-29 11:58) [19]


> И при геетактивплеер : TPlayer приходит копия рекорда.
> И какой смысл присваивать ее полям что-то, если они дальше
> этой копии не уйдут и более того, сама копия умрет при выходе
> из зоны видимости.

это я понял те по ссылке мы получаем не копию а как бы сам объект и тогда все гуд?


 
И. Павел ©   (2011-08-29 12:04) [20]

> это я понял те по ссылке мы получаем не копию а как бы сам
> объект и тогда все гуд?

Адрес получаем, и работаем с объектом по этому адресу. И тогда все гуд.


 
brother_home   (2011-08-29 12:08) [21]

спасибо всем!


 
Anatoly Podgoretsky ©   (2011-08-29 12:09) [22]


> Ты не свойству присваивай.

Можно и свойству, но его надо иметь.



Страницы: 1 вся ветка

Текущий архив: 2011.12.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
1-1276837690
Kukolev
2010-06-18 09:08
2011.12.11
Кнопки на панели задач


2-1314451245
Vladimir
2011-08-27 17:20
2011.12.11
Сколько ресурсов требуется программе


15-1314337996
DelphiN!
2011-08-26 09:53
2011.12.11
Безопасность в Windows 7


6-1246793442
__Алексей__
2009-07-05 15:30
2011.12.11
впорос по SNMP v3


15-1314088885
xayam
2011-08-23 12:41
2011.12.11
Переключатель на светильник