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

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

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

mwoland

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

Сообщение 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.
Просто чтоб было. По форуму искал - не нашел, пришлось самому разбираться.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Vik »

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

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

Сообщение edward_K »

плохо искали - по имени функции будет пара тем
mwoland

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

Сообщение mwoland »

mmm'kay lol. по имени функции не догадался поискать. наверное потому, что не знал
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

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

Сообщение 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.
Последний раз редактировалось Robis 14 фев 2011, 12:48, всего редактировалось 1 раз.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

нажатие кнопки нужно обрабатывать в handleevent окна
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

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

Сообщение 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. Заранее спасибо за помощь, ковырялся с этим целый день... уже мозг кипит )
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

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

Сообщение 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.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение 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.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

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

Сообщение 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.
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

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

Сообщение Robis »

galover, Ged... спасибо:) я даже рад, что это оказался баг, а то начал подозревать, что я дефектный xD
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

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

Сообщение Ged »

galover писал(а): Боюсь, что не получится в screen SCLONGNAME создать кнопку. На мой взгляд это баг - если в скрине все поля с атрибутом skip, то добавить не skip поле уже не получится (ни программно, ни конструктором).
SetFormatEnabled(scLongName,true); - лечит данное безобразие.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение galover »

SetFormatEnabled(scLongName,true); - лечит данное безобразие.
Проверил, фурычит. Спасибо! Только один фиг баг, да и для конструктора не вызовешь эту функцию (
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

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

Сообщение Ged »

Угу. Тоже об этом подумал.
А так по идее конфигуратор убог. Лучше пользоваться докомпиляцией
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение savov »

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

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