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

Вниз

Предложите идею/решение   Найти похожие ветки 

 
Сатир ©   (2002-11-06 17:23) [0]

есть такой класс:
TColorMap = class(TComponent)
...
published
property Base: TColorMap read fBase write SetBase
...
end;

Если поместить на форму два экземпляра Colormap1, Colormap2 данного класса, то можно
для первого задать с помощью инспектора объектов
Colormap1.Base := Colormap2
и для второго
Colormap2.Base := Colormap1

в результате IDE выдаст ошибку переполнения стека:(

Как программно можно исключить такую ситуацию?

Заранее благодарен за любые идеи


 
Smithson ©   (2002-11-06 17:32) [1]

Никак. У тебя вечная рекурсия


 
Digitman ©   (2002-11-06 17:33) [2]

похоже на циклическую ссылку
а что делается в теле SetBase() ?


 
Андрей Прокофьев ©   (2002-11-06 17:36) [3]

В SetBase(P : TColorBase)
как-то проверить циклические ссылки
if P.Base = Self then
raise...


 
han_malign ©   (2002-11-06 17:37) [4]

TColorMap = class(TComponent)
...
fInside: boolean;
published
property Base: TColorMap read fBase write SetBase
...
end;

procedure TColorMap.Do;
begin
if(not fInside)then begin
fInside := true;
Base.Do;
end;
fInside:=false;
end;

простейший случай семафора.


 
Сатир ©   (2002-11-06 17:50) [5]

2Digitman © (06.11.02 17:33)
procedure TColorMap.SetBase(const Value: TColorMap);
begin
if (fBase <> Value) and (Value<>Self) then
begin
if fBase<>nil then fBase.fChilds.Remove(Self);
fBase := Value;
if fBase<>nil then fBase.fChilds.Add(Self);
UpdateColors(0);
end;
end;


2han_malign © (06.11.02 17:37)
а куда этот метод Do присобачить?


 
han_malign ©   (2002-11-06 17:57) [6]

Do для примера - внутри своих методов сделай проверку на повторное вхождение. Правда это криво и по умум нужно продумать получше взаимодействие между объектами, но изредка мне приходилось это делать, дабы не плодить лишних методов(от лени короче).


 
Сатир ©   (2002-11-06 18:13) [7]

о, появилась идея!
в
procedure TColorMap.SetBase(const Value: TColorMap);

добавить

if Value.Base = self then Exit;


 
Андрей Прокофьев ©   (2002-11-06 18:15) [8]

Сатир © (06.11.02 18:13)
Угу :)) см Андрей Прокофьев © (06.11.02 17:36)



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

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

Наверх




Память: 0.48 MB
Время: 0.022 c
1-59269
LittleBat
2002-11-06 22:59
2002.11.18
Помогите!


3-59049
MetalFan
2002-10-30 11:06
2002.11.18
траблы с Установкой MS SQL server 2000


14-59417
maxim2
2002-10-25 08:47
2002.11.18
Непорали сделать форум по Kylix ?


3-58994
AKondor
2002-10-28 20:33
2002.11.18
Как организовать обмен данными в InterBase ?


6-59302
liy2
2002-09-13 05:45
2002.11.18
Как считать трафик с сетевой карты