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

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

Проблема с указателями [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]

Да, еще хотел добавить, что ошибка так скажем ничего конкретного не говорит - типа "...не могу записать в адрес" или что-то вроде этого.


Наверх

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