![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TObject через ссылку [XP]
aka © (2015-03-11 12:58:00)
SL: TStringList;
................................................................
Push(Pointer(SL.Objects[i]));
//SL.Objects[i] := TObject(3) - напрямую работает
//так - нет
procedure Push(obj: Pointer);
begin
TObject(obj) := TObject(3);
end;
Почему так происходит?
Юрий Зотов (2015-03-20 18:30:00) [1]Это будет адрес поля, естественно. Но получаем мы адрес этого поля именно как адрес свойства.
Palladin (2015-03-20 12:54:00) [2]Но это будет не адрес свойства
Юрий Зотов (2015-03-19 10:11:00) [3]icWasya © (16.03.15 09:24) [21]
Можно, если это свойство имеет прямой доступ по чтению.
icWasya (2015-03-16 09:24:00) [4]Повторяю ещё раз
брать адрес свойства НЕЛЬЗЯ.
Германн (2015-03-14 03:20:00) [5]Удалено модератором
Palladin (2015-03-13 16:02:00) [6]в свойстве ничего не содержится, его можно считать макроподстановкой
Rouse_ (2015-03-13 12:18:00) [7]
> Нет бы сказать что те 4 байта, которые содержатся в свойстве
> Objects - это просто 4 байта
А это не 4 байта, это либо 4 либо 8 байт :)
Ega23 (2015-03-13 08:13:00) [8]
> Сергей, а какие еще варианты? Поделитесь...
Пара ID-Caption например. До дженериков - сплошь и рядом.
Германн (2015-03-13 03:09:00) [9]
> Rouse_ © (12.03.15 21:29) [15]
>
> Давайте "это" рассматривать просто как число :)
>
Ну вот опять некоторые запрещают мне "рассматривать это" как мне вздумается. :)
Нет бы сказать что те 4 байта, которые содержатся в свойстве Objects - это просто 4 байта, которые всяк может использовать/трактовать как он хочет.
Единственное замечание. Речь идет о Паскале. А он очень требователен к типам параметров/переменных.
Rouse_ (2015-03-12 21:29:00) [10]Давайте "это" рассматривать просто как число :)
Германн (2015-03-12 21:27:00) [11]
> Dennis I. Komarov © (12.03.15 15:37) [13]
>
> Сергей, а какие еще варианты?
Любые. Порядковый номер чего-либо. Количество чего-либо. Номер правильного ответа. И т.д. и т.п.
Dennis I. Komarov (2015-03-12 15:37:00) [12]Сергей, а какие еще варианты? Поделитесь...
Германн (2015-03-12 00:34:00) [13]А где видно что эта тройка используется именно как адрес?
Dennis I. Komarov (2015-03-11 23:11:00) [14]Вот она, где утечка памяти)))
Rouse_ (2015-03-11 23:02:00) [15]Технически все адреса от нуля до 65535 являются областью битых указателей (первая стопка страниц памяти) поэтому, в данном случае не волшебство - а просто чудо какой адрес :)
Dennis I. Komarov (2015-03-11 22:56:00) [16]Просветите темного, а адрес "3" это некое волшебство, или результат генерации больного воображения?
Rouse_ (2015-03-11 19:54:00) [17]А почему так не должно происходить?
Давай посмотрим на твой код:
procedure Push(obj: Pointer);
begin
TObject(obj) := TObject(3);
end;
Здесь некая переменная obj присваивается тройке.
Ну присвоили и присвоили, а дальше что с ней делать?
Передай ее по ссылке - уже будет цимус, но нет - тыж ее по значению кидаешь.
> Тут вопрос не в этом... В Objects[i] не присваевается значение
> через ссылку, как писал в кусочке кода.
А знаешь почему?
А потому что не читаем мы мануалы - лишнее оно для нас, вот так не хотим писать: Push(@P); - но я знаю, что читать мануалы нужно, важно и тщательно, желательно каждый день перед началом работы программистом (нам же за эту работу деньги платят - за то что мы такие умные :)
junglecat (2015-03-11 14:25:00) [18]> В Objects[i] не присваевается значение
почему бы не так тогда?
function Push: TObject;
begin
Result := TObject(3);
end;
SL.Objects[i] := Push;
icWasya (2015-03-11 14:24:00) [19]На проперти нельзя взять ссылку.
aka (2015-03-11 14:07:00) [20]
> Плохиш © (11.03.15 13:56) [4]
Спасибо тебе за наука, о всезнающий гуру.
> junglecat © (11.03.15 13:53) [3]
>
> P := Pointer(SL.Objects[i]);
> Push(P);
Тут вопрос не в этом... В Objects[i] не присваевается значение через ссылку, как писал в кусочке кода.
> Плохиш © (11.03.15 13:56) [4]
А, и не забудь еще написать, что слово "присваевается" выше написано с ошибкой.