Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Проблема с указателями   Найти похожие ветки 

 
Кодер ©   (2005-01-07 17:36) [0]

Процедура обработки клика на панели (их > 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-07 17:38) [1]

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


 
begin...end ©   (2005-01-07 17:40) [2]

> Кодер ©   (07.01.05 17:36)

Переменная классового типа (например, типа TPanel) уже представляет собой указатель. Поэтому рекомендую заменить pt: Pointer = nil на pt: TPanel = nil, и убрать @ и ^.


 
GuAV ©   (2005-01-07 17:40) [3]

Что за ошибка. Чему присваивается pt ?


>  pn: ^TPanel;

Зачем лишняя ступень неявности ?

Кодер ©   (07.01.05 17:38) [1]
Да, еще хотел добавить, что ошибка так скажем ничего конкретного не говорит - типа "...не могу записать в адрес


AV ? :-)


 
begin...end ©   (2005-01-07 17:44) [4]

> Кодер ©   (07.01.05 17:36)

> pn:= @Sender

Например, после выполнения этого в pn будет храниться не адрес объекта Sender, а адрес его адреса.


 
Кодер ©   (2005-01-07 17:45) [5]

Просто все дело в том, что панели создаются в рил-тайме, указатели на созданные панели хранятся в массиве указателей, поэтому такое усложнение, приходится работать с массивом указателей на созданные панели. Дык как побороть эту ситуацию  ошибкой?


 
Кодер ©   (2005-01-07 17:47) [6]


> begin...end ©   (07.01.05 17:44) [4]

Сорри, код привел неточно

// Берем указатель на новую панель
// Конечно же тут pt, а не pn
pt:= @Sender; // Sender - это панель

с ошибкой-то как?


 
Anton_K ©   (2005-01-07 18:04) [7]

> Кодер
var Panel : TPanel;

Panel здесь и так указатель!


 
Кодер ©   (2005-01-07 18:14) [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:43) [9]

> Кодер ©   (07.01.05 18:14) [8]

Тут pn указывает на указатель, который указывает на объект Панель. Не просче ли использовать указатели, которые сразу указывают на объекты?


 
Piter ©   (2005-01-07 19:33) [10]

А почему бы не сделать так:

with TPanel.Create(nil) do
begin
  Color:= clWhite;
  ...


Указатели, имхо, тут вообще нафиг не нужны...


 
Кодер ©   (2005-01-07 20:05) [11]


> Piter ©   (07.01.05 19:33) [10]

ну, хорошо - создал я панель таким способом, а как потом тады обратиться к ентим панелям?


 
Кодер ©   (2005-01-07 20:14) [12]

Все, кажись понял... :-)
Получается, что при объявлении
var
 pn: array [0..19] of TPanel;


создается массив указателей, а не выделяется память под сами объекты? Разве это так?


 
Anton_K ©   (2005-01-07 20:35) [13]

> Кодер ©   (07.01.05 20:14) [12]

Да, это так.


 
Piter ©   (2005-01-07 20:43) [14]

Кодер ©   (07.01.05 20:14) [12]
Разве это так?


Конечно, так.
Выделение памяти под объект и его инициализация выполняются при вызове конструктора


 
Кодер ©   (2005-01-08 02:38) [15]

Все сделал, заработало.
Блин, прям глаза на жизнь открыли, спасибо! :-)



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
14-1104313116
data
2004-12-29 12:38
2005.01.23
Кто какие подарки будет дарить на НГ


14-1104901142
YurikGL
2005-01-05 07:59
2005.01.23
Бреш в файрволлах!!!


10-1081131338
niko4543
2004-04-05 06:15
2005.01.23
Word.


4-1101744745
vic_774N
2004-11-29 19:12
2005.01.23
странное поведение LoadLibrary ...


14-1105083779
Чеширский_Кот
2005-01-07 10:42
2005.01.23
Дмитрий Скляров