Страница 1 из 6

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

Добавлено: 04 фев 2011, 17:07
mwoland
Пример добавления кнопки в окно редактирования договора:

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

#component "L_DOGOVOR"
alter interface dogovor;
  window wiDogovorEditMain;
  const
    cmMyTestButton = 9987;
  end;
  handleevent
  cmInit: {
    inherited::handleevent(cmInit);
    if (cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR') <> cfOk) { //cfsGetCurrentContainerSelf
      Message(''#3'Ошибка установки корневого контейнера', Error);
      Exit;
    }
    var l: longint;
    if ( cfsCreateObject('Button', 'SCDOGOVOREDITMAINHEAD', 'cmMyTestButton', False, l) = cfErrCreateObjectError) {
    Message(''#3'Ошибка создания объекта', Error);
    Exit;
    }
    cfsSetProp(l, cfpOrigin_X, 5);
    cfsSetProp(l, cfpOrigin_Y, 110);
    cfsSetProp(l, cfpSize_X, 140);
    cfsSetProp(l, cfpSize_Y, 25);
    cfsSetProp(l, cfpTitle, 'TestButton');
    cfsSetProp(l, 'Command', cmMyTestButton);
  }
  cmMyTestButton: {
    message('gotcha!');
  }
  end;
  end;
end.
Просто чтоб было. По форуму искал - не нашел, пришлось самому разбираться.

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

Добавлено: 04 фев 2011, 22:54
Vik
Так вы бы в Опыт лучше добавили это.

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

Добавлено: 05 фев 2011, 00:14
edward_K
плохо искали - по имени функции будет пара тем

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

Добавлено: 05 фев 2011, 01:26
mwoland
mmm'kay lol. по имени функции не догадался поискать. наверное потому, что не знал

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

Добавлено: 11 фев 2011, 17:08
Robis
Пробую по данному примеру создать кнопку в "L_MCU::KATMC" в скрине с именем "SCLONGNAME".
Кнопка создаётся, но не нажимается (даже визуально не вдавливается мышкой) :) Где собака порылась?

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

#component "L_MCU"

  const
    cmMyTestButton = 9987;
  end;

alter interface katmc;
  handleevent
  cmInit: {
    inherited::handleevent(cmInit);
    if (cfsSetCurrentContainer('L_MCU::KATMC') <> cfOk) 
    { //cfsGetCurrentContainerSelf
      Message(''#3'Ошибка установки корневого контейнера', Error);
      Exit;
    }
    var l: longint;
    if ( cfsCreateObject('Button', 'SCLONGNAME', 'cmMyTestButton', False, l) = cfErrCreateObjectError) {
    Message(''#3'Ошибка создания объекта', Error);
    Exit;
    }
    cfsSetProp(l, cfpOrigin_X, 50);
    cfsSetProp(l, cfpOrigin_Y, 125);
    cfsSetProp(l, cfpSize_X, 140);
    cfsSetProp(l, cfpSize_Y, 25);
    cfsSetProp(l, cfpTitle, 'TestButton');
    cfsSetProp(l, 'Command', cmMyTestButton);
  }
  cmMyTestButton: {
    message('gotcha!');
  }
  end;
end.

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

Добавлено: 11 фев 2011, 18:38
edward_K
нажатие кнопки нужно обрабатывать в handleevent окна

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

Добавлено: 11 фев 2011, 19:55
Robis
Дело в том, что обрабатывать нечего:) она не нажимается совсем... т.е. не происходит даже визуального вдавливания кнопки. Вот в аналогичном списке договоров этот же самый код работает...

Рабочий код:

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

#component "L_DOGOVOR"
alter interface dogovor;
  const
    cmMyTestButton = 9987;
  end;
  handleevent
  cmInit: {
    inherited::handleevent(cmInit);
    if (cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR') <> cfOk) { //cfsGetCurrentContainerSelf
      Message(''#3'Ошибка установки корневого контейнера', Error);
      Exit;
    }
    var l: longint;
    if ( cfsCreateObject('Button', 'SCDOGOVORSELECTMAIN', 'cmMyTestButton', False, l) = cfErrCreateObjectError) {
    Message(''#3'Ошибка создания объекта', Error);
    Exit;
    }
    cfsSetProp(l, cfpOrigin_X, 5);
    cfsSetProp(l, cfpOrigin_Y, 110);
    cfsSetProp(l, cfpSize_X, 140);
    cfsSetProp(l, cfpSize_Y, 25);
    cfsSetProp(l, cfpTitle, 'TestButton');
    cfsSetProp(l, 'Command', cmMyTestButton);
  }
  cmMyTestButton: {
    message('gotcha!');
  }
  end;
end.
Не рабочий код:

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

#component "L_MCU"

  const
    cmMyTestButton = 9987;
  end;

alter interface katmc;
  handleevent
  cmInit: {
    inherited::handleevent(cmInit);
    if (cfsSetCurrentContainer('L_MCU::KATMC') <> cfOk) 
    { //cfsGetCurrentContainerSelf
      Message(''#3'Ошибка установки корневого контейнера', Error);
      Exit;
    }
    var l: longint;
    if ( cfsCreateObject('Button', 'SCLONGNAME', 'cmMyTestButton', False, l) = cfErrCreateObjectError) {
    Message(''#3'Ошибка создания объекта', Error);
    Exit;
    }
    cfsSetProp(l, cfpOrigin_X, 50);
    cfsSetProp(l, cfpOrigin_Y, 125);
    cfsSetProp(l, cfpSize_X, 140);
    cfsSetProp(l, cfpSize_Y, 25);
    cfsSetProp(l, cfpTitle, 'TestButton');
    cfsSetProp(l, 'Command', cmMyTestButton);
  }
  cmMyTestButton: {
    message('gotcha!');
  }
  end;
end.
Различий я в них не вижу:) Но один работает, а второй - нет.
К тому же окна там нету, скрин 'SCLONGNAME' описан прямо в фейсе katmc... у меня была мысль, что при таком описании подразумевается, что окно равняется имени интерфейса, основываясь на данном предположении я пробовал сделать так:

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

alter interface katmc;
 window katmc;
  .....
 end;
end.
Тогда кнопки нет совсем. Через конфигуратор я вижу, что в фейсе создалось окно 'KATMC#1', которое ничего не содержит и на экране не отображается.

P.S. Заранее спасибо за помощь, ковырялся с этим целый день... уже мозг кипит )

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

Добавлено: 14 фев 2011, 14:50
Ged

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

#component "L_MCU"

  const
    cmMyTestButton = 9987;
  end;

Alter interface katmc;
Var
  aSelf : longInt;

Window wKatmc '' EscClose;
HandleEvent
cmValue31:
{
  Message('gotcha!');
}
  end; // HandleEvent window WKATMC
end; // window WKATMC

Handleevent
cmInit:
{
    if (cfsSetCurrentContainer('L_MCU::KATMC') <> cfOk)
    {
      Message(''#3'Ошибка установки корневого контейнера!', Error);
      Exit;
    }

    var l: longint;
    if ( cfsCreateObject('Button', 'SCKATMC','b_SCKATMC_TestButton', False, aSelf) = cfErrCreateObjectError)
    {
     Message(''#3'Ошибка создания объекта!', Error);
     Exit;
    }

    cfsSetProp('b_SCKATMC_TestButton', cfpOrigin_X, 5);
    cfsSetProp('b_SCKATMC_TestButton', cfpOrigin_Y, 97);
    cfsSetProp('b_SCKATMC_TestButton', cfpSize_X, 92);
    cfsSetProp('b_SCKATMC_TestButton', cfpSize_Y, 23);
    cfsSetProp('b_SCKATMC_TestButton', cfpTitle, 'TestButton');
    cfsSetProp('b_SCKATMC_TestButton', 'Command', cmValue31);

    if(inherited::handleevent(cmInit)=tsOk){};

}

end;
end.

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

Добавлено: 14 фев 2011, 15:59
galover
Боюсь, что не получится в screen SCLONGNAME создать кнопку. На мой взгляд это баг - если в скрине все поля с атрибутом skip, то добавить не skip поле уже не получится (ни программно, ни конструктором). Вот пример, воспроизводящий проблему:

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

#component "Test"

interface Test;
   show at (, ,110, 27);
   create view as select * from KatMC;

panel panel1;
   browse browse1;
      show at (, , , 24);
      table KatMC;

      fields
         KatMC.Name #3'Name' : [30] , protect;
         KatMC.BarKod #3'BarKod' : [10] , protect;
         KatMC.BarKod2 #3'BarKod2' : [13] , protect;
   end;
   screen screen1;
      show at (, 25, , );
      table KatMC;

      fields
         KatMC.Name : skip;
         KatMC.BarKod2 : skip;
<<
.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>
   end;
end;
end.

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

Добавлено: 14 фев 2011, 16:32
Ged
Как вариант - делаем свой screen

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

#component "L_MCU"

Alter interface katmc;
Var
  aSelf : longInt;


Panel pan2;         // pass
Screen scLongName_MyScr;
  Show at (, 25, , );
  Table KatMC;

Fields
//------------------------------------------------------------------------------
  if (Not boGetTune('McUsl.VarNameMC_IsUse'), KatMC.Name,
    if (Length(sGetTune('McUsl.VarNameMC')) = 0, KatMC.Name,
      fVarNameMCU.GetVarSub(cgi_VarNameKat_KatMC, KatMC.NRec,
                            sGetTune('McUsl.VarNameMC'), 0, 100)
    )): Skip;
//------------------------------------------------------------------------------
  if (Not boGetTune('McUsl.VarNameMC_IsUse'), '',
    if (Length(sGetTune('McUsl.VarNameMC')) = 0, '',
      fVarNameMCU.GetVarSub(cgi_VarNameKat_KatMC, KatMC.NRec,
                            sGetTune('McUsl.VarNameMC'), 101, 200)
    )): Skip;
//------------------------------------------------------------------------------
  if (Not boGetTune('McUsl.VarNameMC_IsUse'), '',
    if (Length(sGetTune('McUsl.VarNameMC')) = 0, '',
      fVarNameMCU.GetVarSub(cgi_VarNameKat_KatMC, KatMC.NRec,
                            sGetTune('McUsl.VarNameMC'), 201, 0)
    )): Skip;
//------------------------------------------------------------------------------
Buttons
  cmValue31, , , 'TestButton', , sci1Esc;
<<
<.TestButton.>
.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>
end;

end; //Panel

Handleevent
cmValue31:
{
  Message('gotcha!');
}

cmInit:
{

    if(inherited::handleevent(cmInit)=tsOk){};
    SetFormat(scLongName_MyScr);
}


end;

end.

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

Добавлено: 14 фев 2011, 16:59
Robis
galover, Ged... спасибо:) я даже рад, что это оказался баг, а то начал подозревать, что я дефектный xD

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

Добавлено: 18 фев 2011, 16:39
Ged
galover писал(а): Боюсь, что не получится в screen SCLONGNAME создать кнопку. На мой взгляд это баг - если в скрине все поля с атрибутом skip, то добавить не skip поле уже не получится (ни программно, ни конструктором).
SetFormatEnabled(scLongName,true); - лечит данное безобразие.

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

Добавлено: 18 фев 2011, 17:00
galover
SetFormatEnabled(scLongName,true); - лечит данное безобразие.
Проверил, фурычит. Спасибо! Только один фиг баг, да и для конструктора не вызовешь эту функцию (

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

Добавлено: 18 фев 2011, 17:08
Ged
Угу. Тоже об этом подумал.
А так по идее конфигуратор убог. Лучше пользоваться докомпиляцией

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

Добавлено: 22 мар 2012, 14:08
savov
Ged писал(а):Как вариант - делаем свой screen
А если все окно занято галактическими объектами, например, стоят там два броузера. Как впихнуть скрин свой? Компилятор ругается, что скрин выходит за границы основного окна.
Например, размер фейса (0,0,115,20). Ставлю скрин (1,20, ,25). Нужно по У увеличить все окно на 6 пунктов.
Пробовал установить св-во cfsetProp для окна и размер задать по У, но ошибка сохраняется.

Можно вообще такое сделать?