![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Предложите идею/решение
Сатир © (2002-11-06 17:23:00)есть такой класс:
TColorMap = class(TComponent)
...
published
property Base: TColorMap read fBase write SetBase
...
end;
Если поместить на форму два экземпляра Colormap1, Colormap2 данного класса, то можно
для первого задать с помощью инспектора объектов
Colormap1.Base := Colormap2
и для второго
Colormap2.Base := Colormap1
в результате IDE выдаст ошибку переполнения стека:(
Как программно можно исключить такую ситуацию?
Заранее благодарен за любые идеи
Андрей Прокофьев (2002-11-06 18:15:00) [1]Сатир © (06.11.02 18:13)
Угу :)) см Андрей Прокофьев © (06.11.02 17:36)
Сатир (2002-11-06 18:13:00) [2]о, появилась идея!
в
procedure TColorMap.SetBase(const Value: TColorMap);
добавить
if Value.Base = self then Exit;
han_malign (2002-11-06 17:57:00) [3]Do для примера - внутри своих методов сделай проверку на повторное вхождение. Правда это криво и по умум нужно продумать получше взаимодействие между объектами, но изредка мне приходилось это делать, дабы не плодить лишних методов(от лени короче).
Сатир (2002-11-06 17:50:00) [4]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:37:00) [5]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:36:00) [6]В SetBase(P : TColorBase)
как-то проверить циклические ссылки
if P.Base = Self then
raise...
Digitman (2002-11-06 17:33:00) [7]похоже на циклическую ссылку
а что делается в теле SetBase() ?
Smithson (2002-11-06 17:32:00) [8]Никак. У тебя вечная рекурсия