Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как правильно обратиться к полю? [D6, XP]


Страницы:   1 2

brother_home ©   (2011-08-29 09:55:00) 

Приветствую!
есть:
 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';


Anatoly Podgoretsky   (2011-08-29 12:09:00) [1]


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

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


brother_home   (2011-08-29 12:08:00) [2]

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


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

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

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


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


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

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


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

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


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


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

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


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

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


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

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


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

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


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

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

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


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

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


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

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


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

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


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


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

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


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

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


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

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


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

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


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

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


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


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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо