![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как правильно обратиться к полю? [D6, XP]
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]ну и проверить что оно не плеернул