Дополнить browse своей колонкой

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

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

galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Дополнить browse своей колонкой

Сообщение galover »

Реально ли внести в стандартный browse свою колонку? Докомпилить или еще что. Есть план снабжения, все аналитики уже заняты под что-то, остается внешний атрибут, но заходить по Alt+A и смотреть - есть ли что - неудобно. Можно ли добавить новую колонку в которой можно было бы просматривать и редактировать этот внешний атрибут. Есть ли есть пример кода, буду особенно признателен
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

А чем добавление колонки через конфигуратор не устраивает? Конфигурировать окно -> добавить поле -> Атрибут. Выбираете таблицу и атрибут. Не ставите галочку "свойство Protect".
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

мне нужна возможность редактирования, конфигуратор здесь не поможет
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

вернее вставить то я смогу, только нужно больше -> отрабатывать событие изменения данных
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Тогда только докомпиляция, т.к. код для обработки корректности введенных в новое поле данных (или т.п.) сам собой не появится.
Виталий
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

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

Сообщение Den »

Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Дополнить browse своей колонкой

Сообщение Buddy »

Мне вот тоже надо обработать событие.
В Browse через CNF добавлен атрибут. При его изменении нужно менять другой атрибут.
А ссылка http://forum.galaktika.by/viewtopic.php ... 55c7f4eae5 , похоже, померла.
oiko
Местный житель
Сообщения: 417
Зарегистрирован: 29 мар 2005, 17:49

Re: Дополнить browse своей колонкой

Сообщение oiko »

Держи
https://forum.topsoft.by/viewtopic.php? ... 55c7f4eae5
но я бы сразу докомпилировал интерфейс добавив колонку и ее обработчик, без конфигуратора.
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Дополнить browse своей колонкой

Сообщение Buddy »

oiko писал(а):Держи
https://forum.topsoft.by/viewtopic.php? ... 55c7f4eae5
но я бы сразу докомпилировал интерфейс добавив колонку и ее обработчик, без конфигуратора.
Собственно, меня как раз больше бы устроил вариант с докомпиляцией и обработчиком, только я не очень представляю, как в коде обработчика сослаться на поле из атрибутов. У него же "нечеловеческое" имя вида 'ExtAttr: KATNAZNA,281474976741359,2,0,0,0,Дата закрытия заказа'.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Дополнить browse своей колонкой

Сообщение Den »

В alter значит дайте ему человеческое имя )
и избавьтесь от cnf, как сказали уже
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Дополнить browse своей колонкой

Сообщение Buddy »

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

Re: Дополнить browse своей колонкой

Сообщение Den »

Ну в обработчике cmpick смотри значение этого атрибута ДО вызова обработчика родителя и ПОСЛЕ .
Если оно поменялось - вызывай код свой нужный ... И имя поля по барабану будет какое там в cnf сгенерилось.
Buddy
Постоянный обитатель
Сообщения: 119
Зарегистрирован: 02 июн 2016, 15:18
Откуда: Галактика СПб

Re: Дополнить browse своей колонкой

Сообщение Buddy »

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

Re: Дополнить browse своей колонкой

Сообщение edward_K »

Вот вам два варианта

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

//--------------------------------------------------
#Doc
 Добавить колонку
 Add_Column (cfsGetCurrentContainerSelf,'BRWPERSONS','KARTANM'  ,10,'Карта'       ,12)
#end
Procedure Add_Column(Container:Longint
       ; ww_browse :string
       ; ww_fieldname : string
       ; ww_width: integer
       ; ww_title:string
       ; ww_index:integer=30
       ; isTree :boolean=false
       );
{   var ww_int:integer;
    var ww_field:longint;
    var i     :integer;
    //----------------- сначала нужно все сдвинуть
    /*
    iVisHidd.SetVisibleForField( cfsGetCurrentContainerSelf
                               , GetInterfaceComponentName
                               , #(__InterfaceName__)
                               , 'brwPersons');
    */
    var Res              : integer;
    var ObjList : array [1] of string;
    var _sSubContName :string;
    var sFieldName    : string;

    _sSubContName := Upcase(Trim(ww_browse));

    //Res := cfsSetCurrentContainer(cfsGetCurrentContainerSelf);
    Res := cfsSetCurrentContainer(Container);
    SetLimit(ObjList, 0);
    // загрузить список объектов, вставленных в данный контейнер
    if cfsEnumObjects(_sSubContName, ObjList, false) = cfOk
    { //for(i := 1; i <= Count(ObjList); Inc(i))
      for(i :=  Count(ObjList);i>=1; i--)
      {  ww_int:=0;
         cfsGetProp(ObjList[i], cfpIndex, ww_int);
         cfsGetProp(ObjList[i], cfpName    , sFieldName);

         if ww_int>=ww_index
         { ww_int++;
           cfsSetProp(ObjList[i], cfpIndex, ww_int);
         }
      } //for(i := 1; i <= Count(ObjList); Inc(i))
    }
    else
    {
    }
    //------------- добавляем колонку
//message('1')
    ww_field:=0;
    var _sTypeFld:string= if(isTree ,'Tree','' )+'Column';
    cfsCreateObject ( _sTypeFld,    ww_browse ,ww_fieldname,FALSE,ww_field);
    //ww_int:=15;

    cfsSetProp(ww_field,'Visible',False);//ww_fieldname
    ww_int:=ww_index;
    cfsSetProp(ww_field,'Index',ww_int);
    cfsSetProp(ww_field,'Protect',True);
    //cfsSetProp(ww_fieldname,'Title',    ww_title);
//message('2')

    //cfsSetProp(ww_fieldname,'SKIP',False);
    ww_int:=10;
    ww_int:=ww_width;
    cfsSetProp(ww_field,'DefaultWidth',ww_int);
    cfsSetProp(ww_field,'StatusCtx',    'sci1Esc');
    cfsSetProp(ww_field,'Visible',True);
    cfsSetProp(ww_field,cfcQuickChoice,True);
    cfsSetProp(ww_field,cfpTitle,    ww_title);
} //Procedure Add_Column(Container:Longint


//------------------------------------------------------------------------------
#doc
структура для добавления полей в функции ADD_Column_A
#end
Type TAdd_FLD = Record
  Fld_Count            : Longint;
  Fld_Type             : Longint;//Тип создаваемых объектов 0 - Column, 1 - TreeColumn
  Fld_Name             : Array[0..0] Of String ; //Наименование Поля
  Fld_Title            : Array[0..0] Of String ; //Заголовок поля
  Fld_Visible          : Array[0..0] Of boolean; //Видимость
  Fld_Hidden           : Array[0..0] Of boolean; //True - скрыть
  Fld_Protect          : Array[0..0] Of boolean; //Защитить от ручного ввода
  Fld_SKip             : Array[0..0] Of boolean; //Запретить позиционирование
  Fld_Index            : Array[0..0] Of Integer; //
  Fld_StatusCtx        : Array[0..0] Of Integer; //
  Fld_PassiveFormat    : Array[0..0] Of String ; //'\2p[|-]36`666`666`666`666.88'
  Fld_DefaultWidth     : Array[0..0] Of Integer; //Ширина колонки по умолчанию (текстовые координаты)
  Fld_ButtonType       : Array[0..0] Of Integer; //16 для ...  inPickButton + DefaultPickButton=True
  Fld_DefaultPickButton: Array[0..0] Of boolean; //
  Fld_FontColor        : Array[0..0] Of String ; // функция
  Fld_FontBold         : Array[0..0] Of String ; // функция
end;


#Doc
 Добавить колонки
 Add_Column_A (cfsGetCurrentContainerSelf,'BRWPERSONS',pAdd_FLD)
#end
Procedure Add_Column_A(Container:Longint
       ; ww_browse :string
       ; pAdd_FLD :TAdd_FLD
       );
{   var ww_int:integer;
    var ww_field:longint;
    var i,j     :integer;
    //----------------- сначала нужно все сдвинуть
    /*
    iVisHidd.SetVisibleForField( cfsGetCurrentContainerSelf
                               , GetInterfaceComponentName
                               , #(__InterfaceName__)
                               , 'brwPersons');
    */
    var Res              : integer;
    var ObjList : array [1] of string;
    var _sSubContName :string;
    var sFieldName    : string;

    _sSubContName := Upcase(Trim(ww_browse));

    //Res := cfsSetCurrentContainer(cfsGetCurrentContainerSelf);
    Res := cfsSetCurrentContainer(Container);
    SetLimit(ObjList, 0);
    // загрузить список объектов, вставленных в данный контейнер
    var _boObjLoad:boolean=cfsEnumObjects(_sSubContName, ObjList, false) = cfOk;
    //------------- добавляем колонку
//message('1')
    ww_field:=0;
    var _sTypeFld:string= if(pAdd_FLD.Fld_Type=1 ,'Tree','' )+'Column';
    var _ObjCount:longint=Count(ObjList);
    var _Delta   :integer;
    For(j:=pAdd_FLD.Fld_Count;j>0;j--)
    { _Delta:=pAdd_FLD.Fld_Count+1-j;
      if _boObjLoad
      { for(i := _ObjCount;i>=1; i--)
        { ww_int:=0;
          cfsGetProp(ObjList[i], cfpIndex, ww_int);
          cfsGetProp(ObjList[i], cfpName    , sFieldName);

          if ww_int>=pAdd_FLD.Fld_Index[j]
          { ww_int:=ww_int+_Delta;
            cfsSetProp(ObjList[i], cfpIndex, ww_int);
          }
          if ww_int>0
           if ww_int<=pAdd_FLD.Fld_Index[j]
           { _ObjCount:=i; break;// По идее дальше сдвигать не нужно
           }
        }
      } //if _boObjLoad
      cfsCreateObject ( _sTypeFld,    ww_browse ,pAdd_FLD.Fld_name[j],FALSE,ww_field);
      //ww_int:=15;

      cfsSetProp(ww_field,'Visible',False);//ww_fieldname
      ww_int:=pAdd_FLD.Fld_Index[j]+(_Delta-1);// сложный вопрос
      cfsSetProp(ww_field,'Index',ww_int);
      cfsSetProp(ww_field,'Protect', pAdd_FLD.Fld_Protect[j]);
      //cfsSetProp(ww_fieldname,'Title',    ww_title);
      //message('2')

      cfsSetProp(ww_field,'SKIP',False);
      ww_int:=10;
      if pAdd_FLD.Fld_DefaultWidth[j]>0
         ww_int:=pAdd_FLD.Fld_DefaultWidth[j];
      cfsSetProp(ww_field,'DefaultWidth',ww_int);
      cfsSetProp(ww_field,'StatusCtx',    'sci1Esc');
      if pAdd_FLD.Fld_StatusCtx[j]<>0
        cfsSetProp(ww_field,'StatusCtx', pAdd_FLD.Fld_StatusCtx[j]);

      cfsSetProp(ww_field,'Visible',pAdd_FLD.Fld_Visible[j]);
      cfsSetProp(ww_field,'Hidden' ,pAdd_FLD.Fld_Visible[j]);
      cfsSetProp(ww_field,cfcQuickChoice,True);
      cfsSetProp(ww_field,cfpTitle,   pAdd_FLD.Fld_title[j]);
      cfsSetProp(ww_field,cfpSKip,     pAdd_FLD.Fld_SKip[j]);
      cfsSetProp(ww_field,cfpPassiveFormat    ,pAdd_FLD.Fld_PassiveFormat    ); //'\2p[|-]36`666`666`666`666.88'
      cfsSetProp(ww_field,cfpDefWidth         ,pAdd_FLD.Fld_DefaultWidth     ); //Ширина колонки по умолчанию (текстовые координаты)
      cfsSetProp(ww_field,cfpButtonType       ,pAdd_FLD.Fld_ButtonType       ); //16 для ...  inPickButton + DefaultPickButton=True
      cfsSetProp(ww_field,cfpDefaultPickButton,pAdd_FLD.Fld_DefaultPickButton); //
      cfsSetProp(ww_field,cfpFontColor        ,pAdd_FLD.Fld_FontColor        ); // функция
      cfsSetProp(ww_field,cfpFontBold         ,pAdd_FLD.Fld_FontBold         ); // функция

    }//For(j:=pAdd_FLD.Fld_Count;j>0;j--)
} //Procedure Add_Column(Container:Longint
Добавляете сие в объект со static и добавление сводится к вызову одной функции. Если обратите внимание они умеют добавлять в любое место. Вторая функция удобна, когда нужно добавить несколько колонок.
Ответить