![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с указателями [D7, Win95/98, Win2k, WinXP]
Кодер © (2005-01-07 17:36:00)Процедура обработки клика на панели (их > 1),при этом панель, на которую кликнули, меняет свой цвет на красный, а панель, которая была до этого красной, становиться белой.
Проблема, вот исходный текст (часть):
// Глобальные
var
pn: ^TPanel;
pt: Pointer = nil; // Хранит указатель на панель, которая
// в данный момент красного цвета
procedure ...
begin
...
// Закрашиваем старую панель белым
if Assigned(pt)
then
begin
pn:= pt;
pn^.Color:= clWhite;
end;
// Берем указатель на новую панель
pn:= @Sender; // Sender - это панель
// Закрашиваем новую панель красным
pn:= pt;
pn^.Color:= clRed;
...
end;
Вроде все работает как часы, вот когда дело доходит до выполнения блока
if Assigned(pt)
then
begin
pn:= pt;
pn^.Color:= clWhite;
end;
то здесь выдается ошибка на pn^.Color:= clWhite;Подскажите, в чем проблема?
Кодер (2005-01-08 02:38:00) [1]Все сделал, заработало.
Блин, прям глаза на жизнь открыли, спасибо! :-)
Piter (2005-01-07 20:43:00) [2]Кодер © (07.01.05 20:14) [12]
Разве это так?
Конечно, так.
Выделение памяти под объект и его инициализация выполняются при вызове конструктора
Anton_K (2005-01-07 20:35:00) [3]> Кодер © (07.01.05 20:14) [12]
Да, это так.
Кодер (2005-01-07 20:14:00) [4]Все, кажись понял... :-)
Получается, что при объявлении
var
pn: array [0..19] of TPanel;
создается массив указателей, а не выделяется память под сами объекты? Разве это так?
Кодер (2005-01-07 20:05:00) [5]
> Piter © (07.01.05 19:33) [10]
ну, хорошо - создал я панель таким способом, а как потом тады обратиться к ентим панелям?
Piter (2005-01-07 19:33:00) [6]А почему бы не сделать так:
with TPanel.Create(nil) do
begin
Color:= clWhite;
...
Указатели, имхо, тут вообще нафиг не нужны...
Anton_K (2005-01-07 18:43:00) [7]> Кодер © (07.01.05 18:14) [8]
Тут pn указывает на указатель, который указывает на объект Панель. Не просче ли использовать указатели, которые сразу указывают на объекты?
Кодер (2005-01-07 18:14:00) [8]
> Anton_K © (07.01.05 18:04) [7]
Прога устроена так
// Генерим новую панель
New(pn);
pn^:= TPanel.Create(nil);
with pn^ do
begin
Color:= clWhite;
...
Разве здесь что-то не так?
Anton_K (2005-01-07 18:04:00) [9]> Кодер
var Panel : TPanel;
Panel здесь и так указатель!
Кодер (2005-01-07 17:47:00) [10]
> begin...end © (07.01.05 17:44) [4]
Сорри, код привел неточно
// Берем указатель на новую панель
// Конечно же тут pt, а не pn
pt:= @Sender; // Sender - это панель
с ошибкой-то как?
Кодер (2005-01-07 17:45:00) [11]Просто все дело в том, что панели создаются в рил-тайме, указатели на созданные панели хранятся в массиве указателей, поэтому такое усложнение, приходится работать с массивом указателей на созданные панели. Дык как побороть эту ситуацию ошибкой?
begin...end (2005-01-07 17:44:00) [12]> Кодер © (07.01.05 17:36)
> pn:= @Sender
Например, после выполнения этого в pn будет храниться не адрес объекта Sender, а адрес его адреса.
begin...end (2005-01-07 17:40:00) [13]> Кодер © (07.01.05 17:36)
Переменная классового типа (например, типа TPanel) уже представляет собой указатель. Поэтому рекомендую заменить pt: Pointer = nilна pt: TPanel = nil, и убрать @ и ^.
GuAV (2005-01-07 17:40:00) [14]Что за ошибка. Чему присваивается pt ?
> pn: ^TPanel;
Зачем лишняя ступень неявности ?
Кодер © (07.01.05 17:38) [1]
Да, еще хотел добавить, что ошибка так скажем ничего конкретного не говорит - типа "...не могу записать в адрес
AV ? :-)
Кодер (2005-01-07 17:38:00) [15]Да, еще хотел добавить, что ошибка так скажем ничего конкретного не говорит - типа "...не могу записать в адрес" или что-то вроде этого.