Главная страница
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.01 c
15-1313561619
vrem
2011-08-17 10:13
2011.12.11
shadow copy - как?


3-1268482847
Grab3
2010-03-13 15:20
2011.12.11
Не применяются изменения в таблице InterBase


15-1314119165
SQLEX
2011-08-23 21:06
2011.12.11
Почему килобайт = 1024 байт?


15-1313675656
Andy BitOff
2011-08-18 17:54
2011.12.11
Протокол обмена с весами CAS AD-25


15-1313841147
Leon-Z
2011-08-20 15:52
2011.12.11
Каретка Windows.