-
Всем доброго времени суток!
Я создал некий невизуальный компонент и необходимо, чтобы его нельзя было распологать на форме более одного раза. Кто-нить могет пособить?
-
для этого ищем подобные и генерим ошибку
constructor TMyComponent.Create(AOwner: TComponent);
var i: integer;
begin
for i := 0 to AOwner.ComponentCount - 1 do
if AOwner.Components[I] is TMyComponent then
raise Exception.Create('Ура, я нашёл дубликат на форме' + AOwner.Name);
inherited Create(AOwner);
....
end;
-
Простое решение для design-time - переменная-счетчик в Implementation модуля компонента. В Create она инкрементируется, если равна нулю, иначе генерируется исключение (raise)
-
спасибо большое, почти жизнь спас. А то весь день мучался ничего не получалось - дельфя висла!
-
> MBo © (27.09.06 15:30) [2]
Боюсь что переменная-счётчик потянет все формы проэкта.
-
>DimaBr (27.09.06 15:48) [4
да, это подходит, если нужен Singleton-компонент на уровне всего проекта
-
Цитата автора
> необходимо, чтобы его нельзя было распологать на форме более одного раза
Про проэкт ничо не сказано.
-
> MBo © (27.09.06 15:30) [2]
> Простое решение для design-time - переменная-счетчик в
> Implementation модуля компонента. В Create она инкрементируется,
> если равна нулю, иначе генерируется исключение (raise)
небольшая модификация :)) Переменная должна быть сложного типа, с учетом имени формы. Например TStringList где Names - имена форм, а Values[Names[i]] - 1 или 0.
-
> Arm79 © (27.09.06 17:01) [7]
Это уже извращение
-
> DimaBr (28.09.06 08:49) [8]
>
> > Arm79 © (27.09.06 17:01) [7]
>
> Это уже извращение
Но ведь будет работать?
-
А зачем, я покаместь не могу придумать такую ситуацию.
Но работать думаю будет, но список нужно создать и уничтожить - следовательно рождаются дополнительные секции в модуле (initialization, finalization).
-
Удалено модератором
-
Не понимаю, о чем еще говорить после нормального решения в [1]?
Но с маленькими доработками.
1.Нужна проверка Owner на nil.
2. Сначала inherited, потом поиск. Иначе поиск ничего не найдет.
3. Если интересует именно форма, то и искать надо на форме, а не в списке Owner. Насколько помню, у компонентов есть готовый метод, дающий именно форму.
-
В модуле компонента приватный список.
В конструкторе регистрация в списке (вместе с именем оунера) с проверкой на "уже есть"
Вот и все. И вся кухня внутри самого компонента.
-
> Reindeer Moss Eater © (22.03.07 17:16) [13]
> В конструкторе регистрация в списке (вместе с именем оунера) с
> проверкой на "уже есть"
Вот это, последнее - уже есть ГДЕ?
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Вот это, последнее - уже есть ГДЕ?
....Уже есть в списке объявленном в модуле компонента.
При создании в конструкторе (как минимум) регистрируем экземпляр в списке, предварительно проверив, что в списке нет экземпляра с таким же оунером
-
> Reindeer Moss Eater © (23.03.07 09:14) [18]
И в итоге получаем точно то же самое, что и в [1], но с использованием дополнительного списка и немного сложнее (поскольку придется проверять еще и владельца).
А зачем?
-
> А зачем?
Экономия времени. Компонентов может быть и полсотни на форме.
-
Какого времени ???
Цикл по полсотни компонентов займет сколько ???
-
А зачем?
Только ради того, чтобы не заставлять делать это пользователя компонента.
Всю работу делает автор.
-
> Цикл по полсотни компонентов займет сколько ???
Вот благодяря этому милисекунд 50-80 ’AOwner.Components[I] is TMyComponent’ :)
-
Упс. Вижу.
В [1] тоже автор все делает
-
> милисекунд 50-80
Ну и сколько компонент за секунду Вы можете забросить на форму ???
-
Удалено модератором
-
> Ну и сколько компонент за секунду Вы можете забросить на форму ???
Но я же программист! Я должен заботится о том что-бы мои программы работали быстрее… :) (а эти 80 мс пойдут на благо работающего в фоне винрара, например)
-
Удалено модератором
-
Удалено модератором
-
Если вы ПРГРАММИСТ, то однажды получив сообщение о том что компонент может быть только один, вряд ли будите его пытаться закидывать второй раз. Потратить единожды 80 милисекунд - (ради сообщения) думаю можно.
-
да ладно, я же смайлик поставил. просто если бы задача была немного другой, и проверка не была-бы столь редкой, я бы все-же не стал перебирать все компоненты.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором