Особенности события cmOpenSearch

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Особенности события cmOpenSearch

Сообщение Max_Ural »

Задача в следующем:
есть броуз, отображающий таблицу в памяти
Для строк, у которых поле1 = 1 необходимо запретить ввод значения в Поле2, при этом, если Поле1 <> 1 - иметь возможность вводить в Поле2 значение.

Нашел стандартный интерфейс "Текущее наличие МЦ по разрезам" (GetTekSaldoParty_Release)
Идею я понял следующим образом:
поле делаем Protect
Попытку ввода значения отлавливаем событием cmOpenSearch. При этом проверяем условие, и если значение ввести можно - запрашиваем его у пользователя через диалог.

Проблема в том, что если в стандартном интерфейсе при вводе в запрещенных строках вообще ничего не происходит, в моем возникает строка поиска и происходит перепозиционирование на подходящую строку, если такая находится.

В своем интерфейсе написал следующим образом:

Код: Выделить всё

BROWSE B1 ('');
    Show at(,8,,);
    TABLE mtTPRICE
    FIELDS
        {Font = {Color = if (mtTPRICE.Prodano > 0, ColorGray, 0)}};
        mtTPRICE.SKATMC       'Объект недвижимости' :[20], SKIP;
        mtTPRICE.PRICE        'Цена 1':[, '\0p[|-]366`666`666`667'], PROTECT, lessNull;
        mtTPRICE.PRICE2       'Цена 2':[, '\0p[|-]366`666`666`667'], PROTECT, lessNull;
END;

handleevent
        cmOpenSearch:{
          if mtTPRICE.Prodano=1
          {
!            message('1');
            exit;
          }
!          message('2');
          var newPMC:double;
          newPMC:=0;
          case CurField of
             #mtTPRICE.PRICE:{
               if RunDialog(NewPriceMC, newPMC) <> cmCancel
               {
                 update current mtTPRICE set price:=newPMC;
               }
               RescanPanel(#mtTPRICE);
             }
             #mtTPRICE.PRICE2:{
               if RunDialog(NewPriceMC, newPMC) <> cmCancel
               {
                 update current mtTPRICE set price2:=newPMC;
               }
               RescanPanel(#mtTPRICE);
             }
           end;
        }
end;
Подскажите пожалуйста, как добиться такого же поведения события в своем интерфейсе.
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Зачем такое городить? Чем не устраивает установка флага tfProtect или обработка cmCheckField?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Даже ещё лучше просто в cmCheckRecord.
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

События cmCheckField и cmCheckRecord срабатывают при попытке выходя из поля/записи.
В нашем случае хотелось бы, чтобы редактирование поля при определенных условиях вообще не происходило.
Если же ставить флаг Protect на поле, в интерфейсе будет происходить перепозиционирование (т.н. быстрый поиск), что сейчас и происходит

Такое впечатление, что в стандартном интерфейсе для этого поля заблокирован быстрый поиск
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Так редактирования и не пройдёт! Изменения-то никуда не попадут.

Перепозиционирование ≡ быстрый поиск ??? Это что-то новенькое или я чего-то не понимаю.

Быстрый поиск в самом деле можно заблокировать, если это нужно. Так же можно не только протектить, но и скипать поле, что б на него вообще нельзя было встать.

Если хочется давать редактировать в отдельном окне - тогда вообще всё надо заблокировать и для редактирования всегда открывать отдельное окно, в котором можно даже скипать соответствующее поле.
Ответить