Конференция "Компоненты" » Разрешить размещение компонента не более одного раза на форме
 
  • Ele-Ktr-ON © (27.09.06 15:21) [0]
    Всем доброго времени суток!
    Я создал некий невизуальный компонент и необходимо, чтобы его нельзя было распологать на форме более одного раза. Кто-нить могет пособить?
  • DimaBr (27.09.06 15:29) [1]
    для этого ищем подобные и генерим ошибку

    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;

  • MBo © (27.09.06 15:30) [2]
    Простое решение для design-time  - переменная-счетчик  в Implementation модуля компонента. В Create она инкрементируется, если равна нулю, иначе генерируется исключение (raise)
  • Ele-Ktr-ON © (27.09.06 15:31) [3]
    спасибо большое, почти жизнь спас. А то весь день мучался ничего не получалось - дельфя висла!
  • DimaBr (27.09.06 15:48) [4]

    > MBo ©   (27.09.06 15:30) [2]

    Боюсь что переменная-счётчик потянет все формы проэкта.
  • MBo © (27.09.06 16:14) [5]
    >DimaBr   (27.09.06 15:48) [4
    да, это подходит, если нужен Singleton-компонент на уровне всего проекта
  • DimaBr (27.09.06 16:21) [6]
    Цитата автора

    >  необходимо, чтобы его нельзя было распологать на форме более одного раза

    Про проэкт ничо не сказано.
  • Arm79 © (27.09.06 17:01) [7]

    > MBo ©   (27.09.06 15:30) [2]
    > Простое решение для design-time  - переменная-счетчик  в
    > Implementation модуля компонента. В Create она инкрементируется,
    >  если равна нулю, иначе генерируется исключение (raise)


    небольшая модификация :)) Переменная должна быть сложного типа, с учетом имени формы. Например TStringList где Names - имена форм, а Values[Names[i]] - 1 или 0.
  • DimaBr (28.09.06 08:49) [8]

    > Arm79 ©   (27.09.06 17:01) [7]

    Это уже извращение
  • Arm79 © (28.09.06 13:05) [9]

    > DimaBr   (28.09.06 08:49) [8]
    >
    > > Arm79 ©   (27.09.06 17:01) [7]
    >
    > Это уже извращение

    Но ведь будет работать?
  • DimaBr (28.09.06 13:54) [10]
    А зачем, я покаместь не могу придумать такую ситуацию.
    Но работать думаю будет, но список нужно создать и уничтожить - следовательно рождаются дополнительные секции в модуле (initialization, finalization).
  • имя (22.03.07 14:49) [11]
    Удалено модератором
  • Юрий Зотов © (22.03.07 15:15) [12]
    Не понимаю, о чем еще говорить после нормального решения в [1]?

    Но с маленькими доработками.

    1.Нужна проверка Owner на nil.
    2. Сначала inherited, потом поиск. Иначе поиск ничего не найдет.
    3. Если интересует именно форма, то и искать надо на форме, а не в списке Owner. Насколько помню, у компонентов есть готовый метод, дающий именно форму.
  • Reindeer Moss Eater © (22.03.07 17:16) [13]
    В модуле компонента приватный список.
    В конструкторе регистрация в списке (вместе с именем оунера) с проверкой на "уже есть"

    Вот и все. И вся кухня внутри самого компонента.
  • Юрий Зотов © (22.03.07 21:39) [14]
    > Reindeer Moss Eater ©   (22.03.07 17:16) [13]

    > В конструкторе регистрация в списке (вместе с именем оунера) с
    > проверкой на "уже есть"

    Вот это, последнее - уже есть ГДЕ?
  • имя (23.03.07 02:14) [15]
    Удалено модератором
  • имя (23.03.07 07:14) [16]
    Удалено модератором
  • имя (23.03.07 07:20) [17]
    Удалено модератором
  • Reindeer Moss Eater © (23.03.07 09:14) [18]
    Вот это, последнее - уже есть ГДЕ?

    ....Уже есть в списке объявленном в модуле компонента.
    При создании в конструкторе (как минимум)  регистрируем экземпляр в списке, предварительно проверив, что в списке нет экземпляра с таким же оунером
  • Юрий Зотов © (23.03.07 15:45) [19]
    > Reindeer Moss Eater ©   (23.03.07 09:14) [18]

    И в итоге получаем точно то же самое, что и в [1], но  с использованием дополнительного списка и немного сложнее (поскольку придется проверять еще и владельца).

    А зачем?
 
Конференция "Компоненты" » Разрешить размещение компонента не более одного раза на форме
Есть новые Нет новых   [134428   +39][b:0][p:0.001]