Как добавить кнопку в стандартный интерфейс

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Как добавить кнопку в стандартный интерфейс

Сообщение zna »

Доброй пятницы, коллеги. На пути к совершенствованию замечательного интерфейса M_MNPLAN::IRSPMNPLAN
потребовалось добавить вторую кнопку в дополнение к добавленной ранее. Казалось бы, ничего сложного- делай, как первую. Сделал, вторая кнопка видна, но на её нажатие реакции нет. Отключил первую- реакция на вторую появилась.
Как сделать, чтобы вторая кнопка нормально обрабатывалась?
Изображение
Ctrl+F4 на кнопку 1: 'M_MNPLAN::IRMNPLAN.WMNEDIT.SCMNEDIT.M_MNPLAN::IMNPLANEDIT.SCMNPLAN.
M_MNPLAN::IRSPMNPLAN.SCRMNPLAN.cmButSP2'

Ctrl+F4 на кнопку 2: 'M_MNPLAN::IRMNPLAN.WMNEDIT.SCMNEDIT.M_MNPLAN::IMNPLANEDIT.SCMNPLAN.
M_MNPLAN::IRSPMNPLAN.SCRMNPLAN.cmButSP1'

Обработка такая:

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

#component "M_MNPLAN"
const
  cmButSP1=55591;
  cmButSP2=55593;
end;
alter interface IRSPMNPLAN;
var lButSP1, lButSP2: longint;
..
overload Function InitVidWindow : Boolean; end;
Function InitVidWindow : Boolean;   
   {
     if inherited::InitVidWindow = true and PWORKTYPE = 17 then
        {
          if cfsSetCurrentContainer(cfsGetCurrentContainerSelf) = cfOk then
            {
              if cfsCreateObject ('Button','SCRMNPLAN','cmButSP1',true, lButSP1) = cfOk then
              {
                cfsCreateObject ('Button','SCRMNPLAN','cmButSP1',false,lButSP1)
                cfsSetProp(lButSP1, cfpTitle,   'Загрузить продолжительность рабочих дней');
                cfsSetProp(lButSP1,'Command',    cmButSP1);
                 ....
              }
              if cfsCreateObject ('Button','SCRMNPLAN','cmButSP2',true, lButSP2) = cfOk then
              {
                cfsCreateObject ('Button','SCRMNPLAN','cmButSP2',false,lButSP2)
                 cfsSetProp(lButSP2, cfpTitle,   'Передать данные в табель');
                cfsSetProp(lButSP2,'Command',    cmButSP2);
                ...
              }
            }
          InitVidWindow:= true;
        }
   }
Handleevent                         //Главное окно
  {
    cmButSP1: {message('Button1');}
    cmButSP2: {message('Button2');}
  }
end;
end.
??
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Как добавить кнопку в стандартный интерфейс

Сообщение Алексей »

Попробуйте так переделать...
cfsCreateObject ('Button','SCRMNPLAN','ButSP1',false,ButSP1)
cfsSetProp('ButSP'1, cfpTitle, 'Загрузить продолжительность рабочих дней');
cfsSetProp('ButSP1','Command', cmButSP1);

вторую по аналогии
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как добавить кнопку в стандартный интерфейс

Сообщение edward_K »

а причем здесь Ctrl+F4? Надо в конфигураторе смотреть свойство - Command
Вообще лучше юзать cmValue. Поскольку разработчики обычно юзают из начала, то надо брать например cmValue60 и идти вниз
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Как добавить кнопку в стандартный интерфейс

Сообщение zna »

Алексей писал(а):Попробуйте так переделать...
cfsCreateObject ('Button','SCRMNPLAN','ButSP1',false,ButSP1)
cfsSetProp('ButSP'1, cfpTitle, 'Загрузить продолжительность рабочих дней');
cfsSetProp('ButSP1','Command', cmButSP1);

вторую по аналогии
Да, так помогло, причём только у 2-й кнопки переделал.. Благодарю!

To Edward Свойство "Сommand" у обеих кнопок совпадает с объявленными константами. Попробую с cmValue тожe, а то непонятно, как константы назначать.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Как добавить кнопку в стандартный интерфейс

Сообщение zna »

В итоге так получилось, более удобно со встроенными константами:

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

    #component "M_MNPLAN"
       end;
    alter interface IRSPMNPLAN;
    var lButSP1, lButSP2: longint;
    ..
    overload Function InitVidWindow : Boolean; end;
    Function InitVidWindow : Boolean;   
       {
         if inherited::InitVidWindow = true and PWORKTYPE = 17 then
            {
              if cfsSetCurrentContainer(cfsGetCurrentContainerSelf) = cfOk then
                {
                  if cfsCreateObject ('Button','SCRMNPLAN','lButSP1',true, lButSP1) = cfOk then
                  {
                    cfsCreateObject ('Button','SCRMNPLAN','lButSP1',false,lButSP1)
                    cfsSetProp('lButSP1', cfpTitle,   'Загрузить продолжительность рабочих дней');
                    cfsSetProp('lButSP1','Command',    cmValue59);
                     ....
                  }
                  if cfsCreateObject ('Button','SCRMNPLAN','lButSP2',true, lButSP2) = cfOk then
                  {
                    cfsCreateObject ('Button','SCRMNPLAN','lButSP2',false,lButSP2)
                     cfsSetProp('lButSP2', cfpTitle,   'Передать данные в табель');
                    cfsSetProp('lButSP2','Command',    cmValue60);
                    ...
                  }
                }
              InitVidWindow:= true;
            }
       }
    Handleevent                         //Главное окно
      {
        cmValue59: {message('Button1');}
        cmValue60: {message('Button2');}
      }
    end;
    end.
Алексей +
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Как добавить обработку спецификации плана?

Сообщение zna »

Ещё пара вопросов по интерфейсу, прошу ответить.
1. Как обработать изменение числового поля спецификации производственного заказа? Встроенные интерфейсы. Путь на поле:
'M_MNPLAN::IRMNPLAN.WMNEDIT.SCMNEDIT.M_MNPLAN::IMNPLANEDIT.SCMNPLAN.
M_MNPLAN::IRSPMNPLAN.SCRSP.M_MNPLAN::ISPSPPL01.TR2.FLD2'

Изображение
Попытка добавить строку

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

Alter interface ispSpPl01
приводит к ошибке загрузки описателя таблицы "ISPSPPL01=>TMPBUFFORMPL" родительского интерфейса C:\Viper\160121_irMnPlan_Trud_MKS\irMnPlan_Trud_MKS.vip(стр. 669, поз. 26)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как добавить кнопку в стандартный интерфейс

Сообщение edward_K »

строка аже 669. Вы что все фейсы в один файл пихаете? Лучше и правильней придерживаться правила - один фейс = один файл и лучше, чтобы имена фейсов совпадали с именем фейса. Это не аксиома, но желательно. После этого вы могли бы привести весь фейс, а не одну строчку.
ошибке загрузки описателя таблицы
- выдается при компиляции или при запуске интерфейса? Если при компиляции, то для начала проверьте версию vip и exe(21 вип не пашет на ресах, собранных на 22), а также соотв. vih файлов. Если при запуске(что я вижу чаще), то собрали не тех ресах.
Вот с таблицей вам не повезло - ее описание сидит в каждом фейсе, и там оно свое, но вроде не было особых проблем.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Как добавить обработку спецификации плана?

Сообщение zna »

От перемены слагаемых результат не изменился. Ошибка компиляции на простейшем варианте

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

#component "M_MNPLAN"
#include galnet.inc
end;
#make "TestSomeOne.vip"
//Файл TestSomeOne.vip:
alter interface IRSPMNPLAN;
end.
Alter interface ispSpPl01;
end.  
Версии всегда мирно сосуществовали, проблем не было:
atlexec.exe- 5.4.44.5
vip.exe- 5.4.43

Галактика 8.10
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как добавить кнопку в стандартный интерфейс

Сообщение edward_K »

Вчера случайно увидел повтор этой ошибки. Но там была таблица описана в vih, а в подключенном ресе таблица была еще старая.
Попробуйте добавить в фейс(сразу после alter)

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

Table Struct TmpSort
(
 cRec : tNRec,
 Sort : String [240]
)
With Index
(
 TmpSort01 = Sort
);

Table Struct TmpBufFormPl
(
 FormPlNRec : tNRec
)
With Index
(
 TmpBufFormPl01 = FormPlNRec
);

Table Struct TmpSpMnPlan
(
  cRec       : tNRec,
  NewNumSort : comp
)
With Index
(
 TmpSpMnPlan01 = cRec
);
Но вообще все таки vip надо привести к той же версии. Закономерность следующая - новый вип успешно работает с ресами, скомпилированными более старыми версиями. Старый вип может не работать с ресурсами, собранными более новой. То есть тут может быть вопрос - на какой версии собирал M_MNPLAN.
А вот это зачем?

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

#component "M_MNPLAN"
#include galnet.inc
end;
#make "TestSomeOne.vip"
Alter ....
По всей видимости вы докомпилцию делается прям в проекте.
Лучше так

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

#statusline "statgal"
#include galnet.inc
end;
#component "M_MNPLAN"

#make "Alter\M_MNPLAN_ispSpPl01.vip"
//или #make "Alter\*.vip"
и докомпиляцию делать уже в Alter\M_MNPLAN_ispSpPl01.vip с коментами в #doc - потом же забудете, что это. Судя по стилю вы любите один проект= один файл - это не есть гуд - должно быть 2-5 ваших ресов на все, разделенных по контурам.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Как добавить обработку спецификации плана?

Сообщение zna »

Благодарю за рекомендации, Эдвард. Добавил описание таблиц в alter- не помогло. Подозреваю, что надо пользовать свойства каких-то объектов, относящихся к интерфейсу ПЗ, например-iSetPl, iOm.. Примерчик бы..
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Как добавить кнопку в стандартный интерфейс

Сообщение Masygreen »

Один из удивительных косяков.. при докомпиляции накладной на снабжение, кнопка добавляется и работает.
Но перестает работать Alt+S и меню по правой кнопке "просмотр ордеров" .. с значением константы cmMyFuncStrCU игрался .. хелп??

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

#component 'L_SOPRDOC'
const
  cmMyFuncStrCU = 15222;
end;

alter interface SOPRDOCB;

create view;

procedure prSetCU;
{
//5) Если по документу сформированы ордера - не запускаем интерфейс
  if(katsopr.dopr = 0)
    runInterface('MBUH_RES::mIntCreateCU', katsopr.nrec);
  else
    message('Удалите ордер', Information);
}

window EDITSOPR EscClose;
HandleEvent
  cmMyFuncStrCU:
    prSetCU;
end;
end;

HandleEvent
  cmInit:
  {
    inherited:: HandleEvent(cmInit);

    if(cfsSetCurrentContainer('L_SOPRDOC::SOPRDOCB') <> cfOK)//интерфейс
    {
      Message(''#3'Ошибка установки корневого контейнера', Error);
      Exit;
    }
//#region кнопки собственное
    var
      iObjBtn00: longint;
    if (cfsCreateObject(cfcButton, 'SCRHEADER', 'cmMyFuncStrCU', FALSE, iObjBtn00) = cfErrCreateObjectError)
    {
      Message(''#3'Ошибка создания объекта', Error);
      Exit;
    }
    cfsSetProp(iObjBtn00, cfpOrigin_X, 890);//по горизонтали
    cfsSetProp(iObjBtn00, cfpOrigin_Y, 253);//по вертикали
    cfsSetProp(iObjBtn00, cfpSize_X, 212);//длинна
    cfsSetProp(iObjBtn00, cfpSize_Y, 26);//ширина
    cfsSetProp(iObjBtn00, cfpCommand, cmMyFuncStrCU);
    cfsSetProp(iObjBtn00, cfpVisible, TRUE);
    cfsSetProp(iObjBtn00, cfpTitle, 'Разноска');
//#endregion
  };
end;
end. 
Время ведет!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как добавить кнопку в стандартный интерфейс

Сообщение edward_K »

Выше уже писал - нежелательно юзать свои константы - лучше cmValue60 и вниз, а уж если юзаете, то ставьте их значение выше стандартных 30000 и выше
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Как добавить кнопку в стандартный интерфейс

Сообщение Masygreen »

edward_K писал(а):Выше уже писал - нежелательно юзать свои константы - лучше cmValue60 и вниз, а уж если юзаете, то ставьте их значение выше стандартных 30000 и выше
Ну это уже от безнадежности .. пробовал разные значения константы, заменил на cmValue60 .. один фиг ..
Время ведет!
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как добавить кнопку в стандартный интерфейс

Сообщение Den »

Masygreen, собрал тупо ваш код - проверил работает alt+s и "просмотр ордеров" в лок меню
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как добавить кнопку в стандартный интерфейс

Сообщение edward_K »

тогда скорей всего при сборке не было в проекте строк
#statusline "statgal"
#include galnet.inc end;
#include glovars.inc
Ответить