Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизПроблема с указателями Найти похожие ветки
← →
Кодер © (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c