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

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

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

Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

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

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

Сообщение edward_K »

Да. Контейнер лучше устанавливать так
if(cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
...
иначе при повторном открытии фейса установка контейнера не произойдет(например книга покупок и продаж - один и тот же фейс).
Добавление полей лучше делать в отдельной процедуре и вызывать ее в cmOnVipLoad и в cmInit , не забывая перед этим вызвать стандартный обработчик - это позволит вам добавлять объекты как в случае явного вызова, так и при встраиванивании.
Во избежании повторного добавления используйте какую нибудь переменную.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

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

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

Сообщение Den »

zna писал(а):Спасибо за подсказку, edwadr_k.
Всё же нет ясности по объекту PanelInputLine, коллеги, у кого есть доступ к исходникам, выложите пример. Документацию излазил, ссылок действительно, полтыщи, но это всё перечисление полей к res-файлам, и толку от них для понимания - ноль. На этом форуме такой объект ещё не обсуждался.
например, вот в этой ссылке :
http://tyumbit.ru/gal_forum/viewtopic.p ... ine#p51335
можно почитать дискуссию...

какая то странная у Вас терминология "но это все перечисление полей к res файлам"..

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

alter interface VSCHETB;
 create view
  var s1 : string;
      nrecorg : comp;
  from katorg katorg_al
 ;
window WVSCHET;
  const
    cmBut = 9987;
    cmPanelInput = 11111;
  end;
  HandleEvent
  cmInit:
  {
    inherited::handleEvent(cmInit);
    if (cfsSetCurrentContainer('L_BASEDOC::vschetb') <> 0) {                 
    Message(''#3'Ошибка установки контейнера L_BASEDOC::vschetb', Error);
    Exit;}
    var l1, l2: longint;
    cfsCreateObject('Button', 'SCVSCHET', 'cmMnPlan', False, l1);
    cfsSetProp(l1, cfpOrigin_X, 278);
    cfsSetProp(l1, cfpOrigin_Y, 201);
    cfsSetProp(l1, cfpSize_X, 77);
    cfsSetProp(l1, cfpSize_Y, 19);
    cfsSetProp(l1, cfpTitle, 'Кнопка');
    cfsSetProp(l1, 'Command', cmBut);
!   if cfsCreateObject('PanelInputLine', 'SCVSCHET', 'cmPanelInput', FALSE, l2) = cfErrCreateObjectError
   if cfsCreateObject('PanelInputLine', 'SCVSCHET', 's1', FALSE, l2) = cfErrCreateObjectError
     {
        Message(''#3'Ошибка создания cPanelInput, cfErrCreateObjectError = '+cfErrCreateObjectError, Error);
     }
   cfsSetProp(l2,'Size_X',179);
   cfsSetProp(l2,'Size_Y',12);
   cfsSetProp(l2,'Origin_X', 359);
   cfsSetProp(l2,'Origin_Y', 204);
   if cfsSetProp(l2, 'StatusCtx', sci1378Esc) <> cfOk then message(''#3'Ошибка StatusCtx', Error);
   if cfsSetProp(l2, 'pickButton', cmPick)    <> cfOk then message(''#3'Ошибка pickButton', Error); ;
  }
  cmBut:
  {
    message('gotcha!');
   }
  cmPanelInput:
  {
  }
  end;
end;

 TableEvent Table BaseDoc;
   cmPick:
   {
     case curfield of
       #s1:{
             if (RunInterface('L_katorg::GetKatOr', nrecorg, 0, false, 0, 0) = cmDefault)
               if getfirst katorg_al where ((nrecorg == katorg_al.nrec))=tsok
                 s1:=katorg_al.name;
           }
     end;
     (inherited :: HandleEvent (cmPick)=heOk) 
   }
 end;
end.        
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

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

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

Сообщение zna »

Да, Den, всё получилось отлично в Вашем примере: из каталога организаций наименование выводится. Мне же надо получить наименование из списка Производственных заказов. Использую интерфейс M_MNPLAN::MNPLDISP, пытаюсь подобрать параметры

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

nrecmn :=0;
if (RunInterface('M_MNPLAN::MNPLDISP', 1, 17, nrecmn) = cmDefault)
...  
- не получается написать корректный вызов M_MNPLAN::MNPLDISP (хотя если вызвать из ...Утилиты->Запуск внешнего интерфейса с параметрами 1,17,0, то ошибок не выдаёт). Вопрос такой: как вызвать этот интерфейс, чтобы он по Enter вернул бы в переменную nrecmn выбранную запись?
Den, +1
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

Похоже, многого хочу от M_MNPLAN::MNPLDISP, не закрывается он по Esc, и в третий параметр ничего не возвращает. Пробовал с разными значениями первого парамера. Придётся самописный интерфейс лепить, чего не хотел.. :-(
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

zna писал(а):Мне же надо получить наименование из списка Производственных заказов.
M_MNPLAN::GetMnplan использую.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

Вообше то он предназначен для встраивания куда либо.
Найдите фейс, где работает выбор планов(например фильтр) и вычислите там getifccurrentfieldname и также getifccurrentfieldname
в том фейсе, что вызывается для выбора. Вариант вызвать через GetKau аналитику 28.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

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

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

Сообщение zna »

Всем доброго, коллеги. В продолжение темы такой вопрос: как обновить экран "Редактирование производственного заказа" после обработки спецификации ПЗ собственной кнопкой? Rescanpanel(tnspmnplan) не срабатывает, таблицы spmnpl и valspmnp не видны. Приходится выходить из окна редактирования ПЗ и снова заходить- но как-то несерьёзно это.
Сейчас имею работающий код:

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

alter interface IRSPMNPLAN;
var lButSP1: 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, cfpOrigin_X, word(476));
                cfsSetProp(lButSP1, cfpOrigin_Y, word(83));
                cfsSetProp(lButSP1, cfpSize_X,   word(117));
                cfsSetProp(lButSP1, cfpSize_Y,   word(24));
                cfsSetProp(lButSP1, cfpTitle,   'Обновить по ДО');
                cfsSetProp(lButSP1,'StatusCtx',  sci13Esc);  
                cfsSetProp(lButSP1,'Command',    cmButSP1);
                cfsSetProp(lButSP1, cfpVisible,  true);
              }
            }
        }
   }
handleevent
 cmButSP1:
  {
    if isvalid(tnmnplan) then
      {
        runinterface('Read_BaseDoc', mnplan.nrec); // Здесь обрабатывается спецификация ПЗ нормально
        rescanpanel(tnspmnplan);   // Не обновляется browse со спецификацией ПЗ
      }
  }
end;
end. 
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

обновлять нужно основную таблицу окна - это легко понять войдя в конфигурирование окна и сделать "Добавить поле" в соотв. панели. Если вы где то что то меняете, то не лишне перед вызовом сделать UpdateTable, а после Rereadrecord на все модифицируемые таблицы - во избежании ошибок "запись модифицирована другим пользователем". В тяжелых случаях можно еще спозиционироватся по таблице - типа "if getfirst spmnpl=0 {}" - именно так во избежании ошибок 310.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

Добавлено в обработку кнопки:

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

alter interface IRSPMNPLAN;
var lButSP1: longint;
create view as select * from spmnpl, valspmnp where((mnplan.nrec==spmnpl.cmnplan and spmnpl.nrec==valspmnp.cspmnpl));
overload Function InitVidWindow : Boolean; end;
...
cmButSP1:
  {
    if isvalid(tnmnplan) then
      {
        runinterface('Read_BaseDoc', mnplan.nrec);
        message('UpdateTable = '+ UpdateTable);  // Здесь TRUE
        iScrSp.SetGetParam
                   (
                     LongInt(10000), // Был выполнен алгоритм из шапки документа,
                     word(1)    ,    // сообщаем встроенному пользовательскому интерфейсу
                     comp(0)    ,
                     Double(0)  ,
                     LongInt(0) ,
                     word(0)    ,
                     to_Date(0,0,0),
                    _datetime(0,0,0,0,0,0,0),
                     string('')
                   );
        Rereadrecord(tnmnplan);
        Rereadrecord(tnspmnplan);
        Rereadrecord(tnspmnpl);
        Rereadrecord(tnvalspmnp);
        if getfirst spmnplan = 0
         and getfirst spmnpl = 0
         and getfirst valspmnp = 0 then message('GetFirstAll = > Ok!');  //Здесь Оk!
      }
  }
Результат туть получше- обновление происходит, когда попрыгаешь по спецификации. Но полноценного обновления нет. :razz:
Ещё где копнуть?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

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

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

Сообщение zna »

Да, это встроенный интерфейс. По подсказке Dim_Sol сделал так:

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

cmButSP1:
  {
    if isvalid(tnmnplan) then
      {
        runinterface('Read_BaseDoc', mnplan.nrec);
        var wCurVid : word;
        wCurVid := iSetPl.GetCurVid;
        ioM.LockScr();
        iSetPl.ResetAllWayValue();
        IsetPl.setCurVid(wCurVid);
        iSetPl.InitAll(MNPLAN.cWayAccou);
        gldt.GetMainInter.SetKolCol(string( iSetPl.GetNumSetKolCol(gldt.GetCurVid())));
        ioM.UnLockScr();
        iOm.EventSetParVid(0);
        iScrSp.SetGetParam
                   (
                     LongInt(10000), // Был выполнен алгоритм из шапки документа,
                     word(1)    ,    // сообщаем встроенному пользовательскому интерфейсу
                     comp(0)    ,
                     Double(0)  ,
                     LongInt(0) ,
                     word(0)    ,
                     to_Date(0,0,0),
                    _datetime(0,0,0,0,0,0,0),
                     string('')
                   );
        if getfirst spmnplan = 0
         and getfirst spmnpl = 0
         and getfirst valspmnp = 0 then {}
      }
  }
- и получилось полноценное обновление. Как-то сложно с embedded..Благодарю!
Ответить