Как добавить кнопку в стандартный интерфейс
Модераторы: m0p3e, edward_K, Модераторы
-
- Местный житель
- Сообщения: 1846
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
в поиске наберите 'PanelInputLine' - там много чего вывалит ....
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как добавить кнопку в стандартный интерфейс
Да. Контейнер лучше устанавливать так
if(cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
...
иначе при повторном открытии фейса установка контейнера не произойдет(например книга покупок и продаж - один и тот же фейс).
Добавление полей лучше делать в отдельной процедуре и вызывать ее в cmOnVipLoad и в cmInit , не забывая перед этим вызвать стандартный обработчик - это позволит вам добавлять объекты как в случае явного вызова, так и при встраиванивании.
Во избежании повторного добавления используйте какую нибудь переменную.
if(cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
...
иначе при повторном открытии фейса установка контейнера не произойдет(например книга покупок и продаж - один и тот же фейс).
Добавление полей лучше делать в отдельной процедуре и вызывать ее в cmOnVipLoad и в cmInit , не забывая перед этим вызвать стандартный обработчик - это позволит вам добавлять объекты как в случае явного вызова, так и при встраиванивании.
Во избежании повторного добавления используйте какую нибудь переменную.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
Спасибо за подсказку, edwadr_k.
Всё же нет ясности по объекту PanelInputLine, коллеги, у кого есть доступ к исходникам, выложите пример. Документацию излазил, ссылок действительно, полтыщи, но это всё перечисление полей к res-файлам, и толку от них для понимания - ноль. На этом форуме такой объект ещё не обсуждался.
Всё же нет ясности по объекту PanelInputLine, коллеги, у кого есть доступ к исходникам, выложите пример. Документацию излазил, ссылок действительно, полтыщи, но это всё перечисление полей к res-файлам, и толку от них для понимания - ноль. На этом форуме такой объект ещё не обсуждался.
-
- Местный житель
- Сообщения: 1846
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
например, вот в этой ссылке :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.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
Упс.. странно, у меня поисковик не выдал ссылок
Спасибо Den, буду разбираться..

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

Re: Как добавить кнопку в стандартный интерфейс
M_MNPLAN::GetMnplan использую.zna писал(а):Мне же надо получить наименование из списка Производственных заказов.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как добавить кнопку в стандартный интерфейс
Вообше то он предназначен для встраивания куда либо.
Найдите фейс, где работает выбор планов(например фильтр) и вычислите там getifccurrentfieldname и также getifccurrentfieldname
в том фейсе, что вызывается для выбора. Вариант вызвать через GetKau аналитику 28.
Найдите фейс, где работает выбор планов(например фильтр) и вычислите там getifccurrentfieldname и также getifccurrentfieldname
в том фейсе, что вызывается для выбора. Вариант вызвать через GetKau аналитику 28.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
Спасибо, попробую!
Свой фейс почти доделал, но стандартный, конечно более функционален.
Свой фейс почти доделал, но стандартный, конечно более функционален.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
Всем доброго, коллеги. В продолжение темы такой вопрос: как обновить экран "Редактирование производственного заказа" после обработки спецификации ПЗ собственной кнопкой? 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.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как добавить кнопку в стандартный интерфейс
обновлять нужно основную таблицу окна - это легко понять войдя в конфигурирование окна и сделать "Добавить поле" в соотв. панели. Если вы где то что то меняете, то не лишне перед вызовом сделать UpdateTable, а после Rereadrecord на все модифицируемые таблицы - во избежании ошибок "запись модифицирована другим пользователем". В тяжелых случаях можно еще спозиционироватся по таблице - типа "if getfirst spmnpl=0 {}" - именно так во избежании ошибок 310.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
Добавлено в обработку кнопки:
Результат туть получше- обновление происходит, когда попрыгаешь по спецификации. Но полноценного обновления нет. 
Ещё где копнуть?
Код: Выделить всё
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!
}
}

Ещё где копнуть?
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как добавить кнопку в стандартный интерфейс
Еще надо посмотреть - окно со спец. не встроено ли другим фейсом. Лень копать без getifccurrentfieldname на нужном поле.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить кнопку в стандартный интерфейс
Да, это встроенный интерфейс. По подсказке Dim_Sol сделал так:
- и получилось полноценное обновление. Как-то сложно с embedded..Благодарю!
Код: Выделить всё
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 {}
}
}