Конференция "Компоненты" » Разрешить размещение компонента не более одного раза на форме
 
  • 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], но  с использованием дополнительного списка и немного сложнее (поскольку придется проверять еще и владельца).

    А зачем?
  • homm © (23.03.07 15:53) [20]
    > А зачем?

    Экономия времени. Компонентов может быть и полсотни на форме.
  • DimaBr (23.03.07 16:11) [21]
    Какого времени ???
    Цикл по полсотни компонентов займет сколько ???
  • Reindeer Moss Eater © (23.03.07 16:13) [22]
    А зачем?

    Только ради того, чтобы не заставлять делать это пользователя компонента.
    Всю работу делает автор.
  • homm © (23.03.07 16:15) [23]
    > Цикл по полсотни компонентов займет сколько ???

    Вот благодяря этому милисекунд 50-80  ’AOwner.Components[I] is TMyComponent’ :)
  • Reindeer Moss Eater © (23.03.07 16:15) [24]
    Упс. Вижу.
    В [1] тоже автор все делает
  • DimaBr (23.03.07 16:30) [25]

    >  милисекунд 50-80

    Ну и сколько компонент за секунду Вы можете забросить на форму ???
  • имя (23.03.07 17:06) [26]
    Удалено модератором
  • homm © (23.03.07 17:27) [27]
    > Ну и сколько компонент за секунду Вы можете забросить на форму ???

    Но я же программист! Я должен заботится о том что-бы мои программы работали быстрее… :) (а эти 80 мс пойдут на благо работающего в фоне винрара, например)
  • имя (23.03.07 23:48) [28]
    Удалено модератором
  • имя (23.03.07 23:49) [29]
    Удалено модератором
  • DimaBr (24.03.07 09:51) [30]
    Если вы ПРГРАММИСТ, то однажды получив сообщение о том что компонент может быть только один, вряд ли будите его пытаться закидывать второй раз. Потратить единожды 80 милисекунд - (ради сообщения) думаю можно.
  • homm © (24.03.07 10:00) [31]
    да ладно, я же смайлик поставил. просто если бы задача была немного другой, и проверка не была-бы столь редкой, я бы все-же не стал перебирать все компоненты.
  • имя (24.03.07 16:24) [32]
    Удалено модератором
  • имя (24.03.07 16:31) [33]
    Удалено модератором
  • имя (25.03.07 03:44) [34]
    Удалено модератором
  • имя (25.03.07 10:42) [35]
    Удалено модератором
 
Конференция "Компоненты" » Разрешить размещение компонента не более одного раза на форме
Есть новые Нет новых   [119012   +20][b:0][p:0.001]