Еще раз...Множественный выбор в интерфейсе

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

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

RAJAH
Местный житель
Сообщения: 931
Зарегистрирован: 18 фев 2008, 12:49

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение RAJAH »

alfmaster писал(а):как передать нреки из маркера во вьюху
Завести временную таблицу в памяти с полем типа comp и сбрасывать нреки туда.

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

   for(IndexNo:=0; IndexNo<=GetMarkerCount(Markers)-1; IndexNo:=IndexNo+1)
   begin
     if GetMarker(Markers, IndexNo, tmpnrec) then
     insert tmptable set
       tmptable.fnrec:=tmpnrec;
   end;
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

Подмогите разобраться, почему не помечаются записи с таким статус-лайн

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

Interface MBPg 'Выбор актов'
  (,hcDictInterface) DoAccept,EscClose, Cyan;
!  show at ( 3, 1, 76, 26);

  create view vMBPMtable
  var
    Markers      : LongInt;
    FieldMarkers : LongInt;
    IndexNo      : LongInt;

  (MarkerStr)

  As Select
   if (SearchMarker(Markers, MBPMove.nrec, IndexNo) = True, 'v', ' '),

   * from MBPMove, katpodr
where (('5'==mbpmove.status
and MBPMove.cpodrf==katpodr.nrec

))
;
form myform ('myform.out');


procedure out_my_form;
{
_loop MBPMove {
                  if (SearchMarker(Markers, MBPMove.nrec, IndexNo) <> True)
                     then continue;                             
!                  myform.PutEventById(feDoLoop, fcfmMBPMove);
                  myform.write(MBPMove.nom);
                   }
if (not myform.error)
  then myform.showfile('myform.out')
  else
  message ('Не получилась форма');
}

  Panel pnTablesList;
  Table MBPMove;
    Browse bwTableList(,,sci1378InsPM);
!  show at (,,,15);
      Fields
        MarkerStr        ''                 :[1], Skip;
!        MBPMove.nrec  'Nrec'              : Protect;
        MBPMove.nom  'номер акта'      : Protect;
        MBPMove.dmove 'дата акта' : Protect;
        katpodr.name  'Подразделение'      : Protect;
    end;
!  screen sc1;
!  show at (,16,,);
!  buttons
!  cmPrint;
!<<
!
!                        <. Отчет .>           
!>>
!  end;
!  cmMarkUnMark   =  cmDoMarkUnMark;

    HandleEvent
!      cmMarkRec    : begin
      cmDoMarkUnMark    : begin
                       InvertMarker(Markers, MBPMove.nrec);
                       if ((GetNext MBPMove) = tsOk) {};
                       RescanPanel(tnMBPMove);
                     end;
!      cmMarkAll    : begin
      cmSelAll    : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Помечаю все', 1);
                       PushPos(tnMBPMove);
                       if ((Modifier GetFirst MBPMove) = tsOk)
                       begin
                         do
                         begin
                           InsertMarker(Markers, MBPMove.nrec);
                           NextVisual;
                         end;
                         while (Modifier GetNext MBPMove = tsOk)
                       end;
                       PopPos(tnMBPMove);
                       StopVisual('', 0);
                       RescanPanel(tnMBPMove);
                     end;
!      cmInvertMark : begin
      cmDoInvertMark : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Инвертирую список', 1);
                       PushPos(tnMBPMove);
                       if ((Modifier GetFirst MBPMove) = tsOk)
                       begin
                         do
                         begin
                           InvertMarker(Markers, MBPMove.nrec);
                           NextVisual;
                         end;
                         while (Modifier GetNext MBPMove = tsOk)
                       end;
                       PopPos(tnMBPMove);
                       StopVisual( '', 0);
                       RescanPanel(tnMBPMove);
                     end;
!      cmUnMarkAll  : begin
      cmUnSelAll  : begin
                       ClearMarker(Markers);
                       RescanPanel(tnMBPMove);
                     end;
!      cmprint: {
!                out_my_form;
!                }
    end;
  end; // panel


  HandleEvent
    cmInit    : begin
!RunInterface   ('F_MBP::SPIS_MBP.GETMBPMOVESPIS')     // 'F_MBP::SPIS_MBP.GETMBPMOVESPIS.KATPODR.NAME'
                  Markers:=InitMarker('SPIS_MBP', 8, 1000, 100);
                  FieldMarkers:=InitMarker('', 8, 20, 20);
                end;
    cmDone    : begin
                  DoneMarker(Markers, 'SPIS_MBP');
                  DoneMarker(FieldMarkers, '');
                end;
  end;
end.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение Den »

Быстрее всего потому что в sci1378InsPM по клавише Ins обрабатывается другая команда нежели cmDoMarkUnMark ,а именно cmMarkUnMark
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

cmMarkUnMark - пишет при компиляции ... нет такой команды! :-?
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение n0where »

cmMarkUnMark : Word = 1221;
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение Masygreen »

Устаревшая конструкция ...

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

if ((GetNext MBPMove) = tsOk) {};
рекомедндуется использовать

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

RedrawCurrentAndGo(br_Head,true);
Кусочек

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

Window wnGetPrice 'Выбор прайс-листов' ('',, sci178InsPM) cyan,AlwaysReturn; 
browse br_Head;
Table KLPRICE;

Fields 
....
HandleEvent // Interface

//#region
cmMarkUnMark:
{
  InvertMarker(_MarkerCrPr, KLPRICE.NREC);
  RedrawCurrentAndGo(br_Head,true);
}
cmSelectAll:
{
  PushPos(tnKLPRICE);
  _loop KLPRICE
   InsertMarker(_MarkerCrPr, KLPRICE.NREC);
  PopPos(tnKLPRICE);
  ReReadRecord(#KLPRICE);
}
cmUnSelectAll:
{
  ClearMarker(_MarkerCrPr);
  ReReadRecord(#KLPRICE);
}
//#endregion

cmDefault:
{
 if(not FoundMarker(_MarkerCrPr, KLPRICE.NREC))
  InsertMarker(_MarkerCrPr, KLPRICE.NREC);
 CloseWindow(wnGetPrice);
 abort;
}
End;

End;

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

Const cmSelectAll    =  cmSelAll;
Const cmUnSelectAll  =  cmUnSelAll;
Const cmMarkUnMark   =  cmDoMarkUnMark;
Const cmInvertAll    =  cmDoInvertMark;  

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

cmSelAll       = 1219;
cmUnSelAll     = 1220;
cmDoMarkUnMark = 1221;
cmDoInvertMark = 1222;    
Время ведет!
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

Блин, выбрал стандартный статуслайн из GALNET.CSC (sci178InsPM = 6959;)
прописал в GALNET.CCM

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

cmSelAll       = 1219;
cmUnSelAll     = 1220;
cmDoMarkUnMark = 1221;
cmDoInvertMark = 1222;    

  cmSelectAll    =  cmSelAll;
  cmUnSelectAll  =  cmUnSelAll;
  cmMarkUnMark   =  cmDoMarkUnMark;
  cmInvertAll    =  cmDoInvertMark;


поправил в фейсе и все равно не помечаются записи :sad:

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

Interface MBPg 'Выбор актов'
  (,hcDictInterface) DoAccept,EscClose, Cyan;
!  show at ( 3, 1, 76, 26);

  create view vMBPMtable
  var
    Markers      : LongInt;
    FieldMarkers : LongInt;
    IndexNo      : LongInt;

  (MarkerStr)

  As Select
   if (SearchMarker(Markers, MBPMove.nrec, IndexNo) = True, 'v', ' '),

   * from MBPMove, katpodr
where (('5'==mbpmove.status
and MBPMove.cpodrf==katpodr.nrec

))
;
form myform ('myform.out');


procedure out_my_form;
{
_loop MBPMove {
                  if (SearchMarker(Markers, MBPMove.nrec, IndexNo) <> True)
                     then continue;                             
!                  myform.PutEventById(feDoLoop, fcfmMBPMove);
                  myform.write(MBPMove.nom);
                   }
if (not myform.error)
  then myform.showfile('myform.out')
  else
  message ('Не получилась форма');
}

  Panel pnTablesList;
  Table MBPMove;
    Browse bwTableList(,,sci178InsPM);
!  show at (,,,15);
      Fields
        MarkerStr        ''                 :[1], Skip;
!        MBPMove.nrec  'Nrec'              : Protect;
        MBPMove.nom  'номер акта'      : Protect;
        MBPMove.dmove 'дата акта' : Protect;
        katpodr.name  'Подразделение'      : Protect;
    end;
!  screen sc1;
!  show at (,16,,);
!  buttons
!  cmPrint;
!<<
!
!                        <. Отчет .>           
!>>
!  end;
!  cmMarkUnMark   =  cmDoMarkUnMark;

    HandleEvent
!      cmMarkRec    : begin
      cmDoMarkUnMark    : begin
                       InvertMarker(Markers, MBPMove.nrec);
                       if ((GetNext MBPMove) = tsOk) {};
                       RescanPanel(tnMBPMove);
                     end;
!      cmMarkAll    : begin
      cmSelAll    : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Помечаю все', 1);
                       PushPos(tnMBPMove);
                       if ((Modifier GetFirst MBPMove) = tsOk)
                       begin
                         do
                         begin
                           InsertMarker(Markers, MBPMove.nrec);
                           NextVisual;
                         end;
                         while (Modifier GetNext MBPMove = tsOk)
                       end;
                       PopPos(tnMBPMove);
                       StopVisual('', 0);
                       RescanPanel(tnMBPMove);
                     end;
!      cmInvertMark : begin
      cmDoInvertMark : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Инвертирую список', 1);
                       PushPos(tnMBPMove);
                       if ((Modifier GetFirst MBPMove) = tsOk)
                       begin
                         do
                         begin
                           InvertMarker(Markers, MBPMove.nrec);
                           NextVisual;
                         end;
                         while (Modifier GetNext MBPMove = tsOk)
                       end;
                       PopPos(tnMBPMove);
                       StopVisual( '', 0);
                       RescanPanel(tnMBPMove);
                     end;
!      cmUnMarkAll  : begin
      cmUnSelAll  : begin
                       ClearMarker(Markers);
                       RescanPanel(tnMBPMove);
                     end;
!      cmprint: {
!                out_my_form;
!                }
    end;
  end; // panel


  HandleEvent
    cmInit    : begin
!RunInterface   ('F_MBP::SPIS_MBP.GETMBPMOVESPIS')     // 'F_MBP::SPIS_MBP.GETMBPMOVESPIS.KATPODR.NAME'
                  Markers:=InitMarker('SPIS_MBP', 8, 1000, 100);
                  FieldMarkers:=InitMarker('', 8, 20, 20);
                end;
    cmDone    : begin
                  DoneMarker(Markers, 'SPIS_MBP');
                  DoneMarker(FieldMarkers, '');
                end;
  end;
end.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение Masygreen »

Ну вот вам полный код Wind .. соберите посмотрите как работает.. потом внедрите сюда свои данные

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

  
Interface inCreatePrice (,,sci178InsPM) cyan,AlwaysReturn;;
var
 _MarkerCrPr:longint;
create view
from KLPRICE,KATNOTES
Where (( KLPRICE.CNOTE == KATNOTES.nrec))
; 
cmInit:
{
  _MarkerCrPr := InitMarker('PriceChose', 8, 100, 10);
   ClearMarker(_MarkerCrPr);
  RunWindowModal(wnGetPrice);
 

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

Window wnGetPrice 'Выбор прайс-листов' ('',, sci178InsPM) cyan,AlwaysReturn;
show at(2,12,260,34);

browse br_Head;
Table KLPRICE;

Fields
 KLPRICE.NAME   #3'Наименование':[50] ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
 KLPRICE.DPRICE #3'Дата цен':[10]     ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
 KLPRICE.DBEG   #3'с:':[10]           ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
 KLPRICE.DEND   #3'по:':[10]          ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
 KATNOTES.NAME  #3'Статус':[20]       ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
end;

HandleEvent // Interface

//#region
cmMarkUnMark:
{
  InvertMarker(_MarkerCrPr, KLPRICE.NREC);
  RedrawCurrentAndGo(br_Head,true);
}
cmSelectAll:
{
  PushPos(tnKLPRICE);
  _loop KLPRICE
   InsertMarker(_MarkerCrPr, KLPRICE.NREC);
  PopPos(tnKLPRICE);
  ReReadRecord(#KLPRICE);
}
cmUnSelectAll:
{
  ClearMarker(_MarkerCrPr);
  ReReadRecord(#KLPRICE);
}
//#endregion

cmDefault:
{
 if(not FoundMarker(_MarkerCrPr, KLPRICE.NREC))
  InsertMarker(_MarkerCrPr, KLPRICE.NREC);
 CloseWindow(wnGetPrice);
 abort;
}
End;

End;  
Время ведет!
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

ПАСИБ! Проштудирую сейчас!
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

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

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение zna »

Тоже вот пытаюсь осилить тему.. Повторил пример Masygreen'a:

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

#include GALNET.CCM
#include GALNET.CSC
cmSelAll       = 1219;
cmUnSelAll     = 1220;
cmDoMarkUnMark = 1221;
cmDoInvertMark = 1222;
Const
      cmSelectAll    =  cmSelAll;
      cmUnSelectAll  =  cmUnSelAll;
      cmMarkUnMark   =  cmDoMarkUnMark;
      cmInvertAll    =  cmDoInvertMark;
end;
Interface inCreatePrice (,,sci178InsPM) cyan, AlwaysReturn;
var
_MarkerCrPr:longint;
create view from KLPRICE,KATNOTES
Where (( KLPRICE.CNOTE == KATNOTES.nrec))
;
Window wnGetPrice 'Выбор прайс-листов' ('',, sci178InsPM) cyan,AlwaysReturn;
show at(2,12,260,34);

browse br_Head;
Table KLPRICE;

Fields
KLPRICE.NAME   #3'Наименование':[50] ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
KLPRICE.DPRICE #3'Дата цен':[10]     ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
KLPRICE.DBEG   #3'с:':[10]           ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
KLPRICE.DEND   #3'по:':[10]          ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
KATNOTES.NAME  #3'Статус':[20]       ,Protect,{font={bold=if(FoundMarker(_MarkerCrPr, KLPRICE.NREC), true, false);}};
end;
end;

HandleEvent // Interface

cmInit:
{
  _MarkerCrPr := InitMarker('PriceChose', 8, 100, 10);
   ClearMarker(_MarkerCrPr);
  RunWindowModal(wnGetPrice);

}
cmMarkUnMark:
{ Message('cmMarkUnMark');
  InvertMarker(_MarkerCrPr, KLPRICE.NREC);
  RedrawCurrentAndGo(br_Head,true);
}
cmSelectAll:
{
  PushPos(tnKLPRICE);
  _loop KLPRICE
   InsertMarker(_MarkerCrPr, KLPRICE.NREC);
  PopPos(tnKLPRICE);
  ReReadRecord(#KLPRICE);
}
cmUnSelectAll:
{
  ClearMarker(_MarkerCrPr);
  ReReadRecord(#KLPRICE);
}
cmDefault:
{
if(not FoundMarker(_MarkerCrPr, KLPRICE.NREC))
  InsertMarker(_MarkerCrPr, KLPRICE.NREC);
CloseWindow(wnGetPrice);
abort;
}
end;
end. 
- строка статуса появилась с кнопками "Ins", "+","-"
но записи не помечаются. И не генерится событие cmMarkUnMark.
Что не так? :eek:
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение KATZ »

События от статус-линии попадают в обработчик текущего окна, а у вас код их обработки вставлен в обработчик главного окна.

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

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение zna »

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

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение zna »

Почти сделал интерфейс, в котором записи помечаются нормально и маркер, я надеюсь создаётся тоже нормально. Осталось дописать выход по нажатию Enter- вот здесь нужна подсказка. В интерфейсе объявлена панель, в которой делается пометка, вопрос- как нормально выйти из обработчика панели, а потом и из обработчика главного окна? Код сейчас такой:

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

Interface McSaldo 'Просмотр Мс' escclose,blue,AlwaysReturn, doAccept;
  Show at (1,1,150,40);
...    //Здесь view и прочая..
Panel Panel_ ;
  Table t_SldDt;
  Screen scMain_
  show at (, , , 5);
  fields
    dsld: noProtect;
  Buttons
   cmSetDate,,,;
   cmSetAll,,,;
<<
      <. Остатки МЦ на дату: .> .@@@@@@@@@@

      <. Показать все МЦ: .>                 
>>
  end;
  browse bmnpl (,,sci178InsPM) ;
  show at (,6 , , );
  fields
      t_SldDt.dSaldoSt1 'Дата остатков': [10], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.McName1   'Наименование' : [40], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.McKod1    'Код'          : [10], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.PodrMame1 'Склад'        : [20], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.MolName1  'МОЛ'          : [20], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.EdIzm1    'Ед. изм.'     : [10], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.Kol1      'Количество'   : [10], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
      t_SldDt.Cena1     'Цена'         : [10], protect, {font = {bold = if(FoundMarker(_MarkerMcSaldo, t_SldDt.cMc1), true, false);}};
  end;
HandleEvent                //Обработчик Panel_
cmMarkUnMark:
{
  InvertMarker(_MarkerMcSaldo, t_SldDt.cMc1);
  RedrawCurrentAndGo(bmnpl,true);
  RescanPanel(#t_SldDt);
}
cmSetDate:
{
 ...}
cmSetAll:
{
...
}
cmCancel:
{
  closeinterface(cmDone);
  mtChangeRefCount( #t_slddt,  -1 ); 
}
cmDefault:
{
 if(not FoundMarker(_MarkerMcSaldo, t_slddt.cmc1))
  InsertMarker(_MarkerMcSaldo, t_slddt.cmc1);
  DoneMarker (_MarkerMcSaldo, 'McChose');         
abort;
}
end; // HandleEvent панели
end; // Panel
HandleEvent          //Обработчик главного окна
cmInit:
{
...
}
cmDefault:     //непонятно, как сюда нормально перейти
{
 
  abort;
}
end; // HandleEvent
end. // interface   
Хочется после пометки записей выйти по одному нажатию Enter.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение edward_K »

if(not FoundMarker(_MarkerMcSaldo, t_slddt.cmc1))
InsertMarker(_MarkerMcSaldo, t_slddt.cmc1);
- это должно быть в главном обработчике. Вообще обычно проверяют было ли что-то выбрано, если нет добавляют текущую.
Гасить маркер надо в cmDone в главном обработчике.
и без всяких abort - кто вам сказал, что это надо всегда писать?
Если вы хотите что то другое по Enter, то уберите DoAccept из заголовка фейса и обрабатывайте cmDefault сами (closeinterface(cmDefault) например) - я так одним фейсом управляю редактированием и выбором - в зависимости от режима окно закрывается или нет.
Ответить