Привязка функции к форме

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

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

Ответить
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Привязка функции к форме

Сообщение Espada »

Ещё раз здравствуйте! У меня вопрос: можно ли привязать функцию к форме? То есть чтобы при открытии формы печати(Ctrl+P) автоматически выполнялся перерасчет цены. Сама функция у меня есть. сперва сделал чтобы перерасчет выполнялся при нажатии кнопки на форме "Сбыт", однако попросили сделать пересчет(на всякий случай) ещё и автоматически при вызове формы печати(ctrl+p). Если кто-нибудь знает функцию или какой-дибо алгоритм выполнения действий, помогите плиз. :)
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Привязка функции к форме

Сообщение Espada »

Вот я пытаюсь обратиться к этой форме

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

#component "REPORT_AND_GROUP"
const
 cmbut1=143213;
end;
alter interface FREESCREEN;
create view var kkk1:longint condition org  as report.cotdel=coGetTune('MYORG');
.
Однако при компиляции возникает ошибка
Interface compiler. Версия 5.4.41 (c) 1992-2012, корпорация "Галактика"
D:\GAL810_VIP\Forms_MAV_2013_01\Forms\форма печати.vip(6)
Ошибка: Имя логической таблицы не указано! (стр.6, поз.13 в D:\GAL810_VIP\Forms
_MAV_2013_01\Forms\форма печати.vip)
create view var kkk1:longint condition org as report.cotdel=coGetTune('MYORG');
.

я просмотрел внешние интерфейсы в галактике и увидел отличие: когда я работал с кнопкой на форме "Сбыт", то там было написано так

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

L_BASEDOC::VSCHET
,
а когда работаю с формой печати то

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

REPORT_AND_GROUP.FREESCREEN
. Тоесть разница в "::" и "." может мне как-то подругому обращаться к данной форме? а не через

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

alter interface FREESCREEN
???
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Привязка функции к форме

Сообщение savov »

Пример перекрытия стандартного фейса. Добавлена кнопка, которая печатает что-то из вьюхи:

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

// Отчет печатает данные о запланированных мероприятиях по договорам
// Для работы он перекрывает стандартный интерфейс Галактики,
// добавлена кнопка ПЕЧАТЬ

    #component 'L_ADVREP'
    #include cfg_all.inc
    #include galnet.inc
    const 
	cmPrintMes = 9999; 
    End;

    Alter interface DOGURGENT;
    overload   end;

    var ButPrint, scrPrint 	:	longint	;
    var Res, CanWork, FL	: 	Boolean	;
    var OutFileName, file_Name	:	String	;
    var IRow, rMeas, RMeas2 	: 	Integer ;
    var szResult		:	String	;
    var ActiveWorkBook 		: 	string  ; // имя активной книги
    var Crec			:       Comp	;

// вьюха, которая пробегает по договорам, которые видны в верхнем окне галактического фейса

    create View TDogovor as 
    select Memtbl_dogurg.nrec, Memtbl_dogurg.cdoc, Memtbl_dogurg.name,
           Memtbl_dogurg.nodoc, Memtbl_dogurg.ddoc, Memtbl_dogurg.dbeg,
	   Memtbl_dogurg.dend, katorg.name, dogovor.desgr
    From Memtbl_dogurg, katorg
    Where((root==Memtbl_dogurg.nrec and
           Memtbl_dogurg.cdoc==dogovor.nrec
           and dogovor.corg==katorg.nrec
          ));

//а эта вьюха цепляет собственно мероприятия к тем договорам, которые получили в предыдущем запросе	

    create View TMesasures as 
    Select
	urgentm.nrec, urgentm.dend, urgentm.nodoc, urgentm.ddoc, measures.name, measures.comment
    From urgentm, measures
    WHERE((Crec==urgentm.cdogovor and
           urgentm.cmeasures==measures.nrec
         ));

    HandleEvent
    cmInit:
    {
    inherited::handleEvent(cmInit);       
    cfsSetCurrentContainer('L_ADVREP::DOGURGENT');

// тут интересный момент. в стандартном фейсе Галактики нет места для кнопки, поэтому сначала
//создаем дополнительный скрин, уменьшив размер броузера стандартного фейса ( нижня часть окна)

       cfsSetProp('BRURGENTM', cfpRectB_Y ,17);
       cfsCreateObject('screen', 'L_ADVREP::DOGURGENT', 'scrPrint', FALSE, scrPrint);
       cfsSetProp ( scrPrint, cfpRectA_X, 1 );
       cfsSetProp ( scrPrint, cfpRectA_Y, 18 );
         cfsSetProp ( scrPrint, cfpRectB_X, 115 );
       cfsSetProp ( scrPrint, cfpRectB_Y, 19);
       cfsSetProp ( scrPrint, cfpVisible,TRUE);       

// а вот теперь в этом скрине создаем кнопку и вешаем на нее команду

       cfsCreateObject('button', 'scrPrint', 'ButPrint', FALSE, ButPrint);
       cfsSetProp ( ButPrint, cfpOrigin_X, 17 );
       cfsSetProp ( ButPrint, cfpOrigin_Y, 10 );
       cfsSetProp ( ButPrint, cfpSize_X, 119 );
       cfsSetProp ( ButPrint, cfpSize_Y, 29 );

       cfsSetProp ( ButPrint, cfpCommand, cmPrintMes );
       cfsSetProp ( ButPrint, cfpTitle, 'ПЕЧАТЬ' );

    }
    cmPrintMes:
    {
  	szResult    := GetStringParameter ( 'Files', 'OutputFilesDirectory' , 0 ) ;
  	OutFileName := Trim(szResult)+'График_Мероприятий_' +'.xls';
 	file_Name:='\\GalaxyV\VRNF$\Res\Template\_Grafik_measures.xls';
        if (not xlCreateExcelWithTemplate(File_Name,true))
        { CanWork:=false;
          Message('Не могу открыть файл: '+file_name,0);
        }
        else
  	{ CanWork:=True;
  	}
  	if CanWork
        {
	   res:=xlDisplayAlerts(false);
	   res:=xlSetActiveSheetByName('Лист1');
	   rMeas:=TDogovor.getFirst;
           IRow:=6;
           res:=xlSetCellStringValue('на дату '+String(Cur_date),2,1,2,1);
           while(rMeas=0)
           {
     	     res:=xlSetCellStringValue(TDogovor.Memtbl_dogurg.NoDoc+' ',IRow,1,IRow,1);
             res:=xlSetCellStringValue(TDogovor.dogovor.desgr,IRow,2,IRow,2);
     	     res:=xlSetCellStringValue(DateToStr(TDogovor.Memtbl_dogurg.DDoc,'DD.MM.YYYY'),IRow,3,IRow,3);
     	     res:=xlSetCellStringValue(TDogovor.Katorg.Name,IRow,4,IRow,4);
     	     res:=xlSetCellStringValue(TDogovor.Memtbl_dogurg.Subject1,IRow,5,IRow,5);

    	     res:=xlSetFontStyle(xlBold,IRow,1,IRow,6);
             res:=xlFrameCells(xlBorderT or xlBorderB or xlBorderL or xlBorderR or xlInsideV or xlInsideH, xlThin,xlContinuous,1,IRow,1,Irow,6);

     	     Crec:=TDogovor.Memtbl_dogurg.cdoc;
             rMeas2:=TMesasures.getFirst;
             FL:=False;
             while(rMeas2=0)
             {
                FL:=true;
		IRow:=IRow+1;             
     	     	res:=xlSetCellStringValue(TMesasures.measures.name,IRow,5,IRow,5);
     	     	res:=xlSetCellStringValue(DateToStr(TMesasures.urgentm.dend,'DD.MM.YYYY'),IRow,6,IRow,6);
                RMeas2:=TMesasures.getNext;
              }
             if FL IRow:=IRow+2 else IRow:=IRow+1;             
             rMeas:=TDogovor.getNext;
	    }	

   	If NOT (xlGetActiveWorkBookName( ActiveWorkBook )) // определяем наименование активной книги
           then Message('Не смог получить имя открытого Excel-файла') ;
        else
            // сохраняем ее с именем OutFileName         
            if not xlSaveAsWorkBookByName( ActiveWorkBook, OutFileName ) 
               message( 'Ошибка сохранения отчета как'#13+OutFileName, Error ) ;
   	res:=xlKillExcel;
       }

    }

    end;
    end.

Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Привязка функции к форме

Сообщение Espada »

savov писал(а):Пример перекрытия стандартного фейса. Добавлена кнопка, которая печатает что-то из вьюхи:
спасибо, но у меня немного не такая ситуация. В данный момент в Галактике я работаю в модуле "Управление сбытом", нужно чтобы после редактирования любого отчета при нажатии CTRL+P выполнялась необходимая функция. Пока что я пробую просто вывести текстовое сообщение

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

 message('Функция работает нормально');
но не знаю как обратиться именно к форме печати(
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Привязка функции к форме

Сообщение savov »

Во-первых,

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

alter interface Report_And_group;
Во-вторых, перехватить HandleEvent сmOK
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Привязка функции к форме

Сообщение Espada »

savov писал(а):Во-первых,

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

alter interface Report_And_group;
Во-вторых, перехватить HandleEvent сmOK
хм... а как быть с

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

#component "REPORT_AND_GROUP"
???
при компиляции выдаёт ошибку

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

D:\GAL810_VIP\Forms_MAV_2013_01\Forms\форма печати.vip(2)
 Ошибка: В ресурсе нет интерфейса REPORT_AND_GROUP::REPORT_AND_GROUP (стр.2, поз
.33 в D:\GAL810_VIP\Forms_MAV_2013_01\Forms\форма печати.vip)
alter interface Report_and_Group;
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Привязка функции к форме

Сообщение savov »

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

Re: Привязка функции к форме

Сообщение edward_K »

1. У фейса REPORT_AND_GROUP нет компоненты(compdata - это рес).
2. REPORT_AND_GROUP запрещен для докомпиляции(поправьте примером если это не так) - жаль, можно было бы много чего интересного сделать - типа прав на запуск отчетов.
3. REPORT_AND_GROUP вызывается абсолютно везде при печати в формат бизнес-текст, так что смысла модифицировать именно его нет.
4. То есть вам нужно либо докомпилировать тот фейс, из которого идет вызов печати(скорей всего это будет событие cmPrintDoc или то что срабатывает по вашей кнопке ), либо встроить изменения в саму печатную форму.
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Привязка функции к форме

Сообщение Espada »

savov писал(а):А почему компонент-то Report_And_Group?
Компонент CompData
при компиляции

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

D:\GAL810_VIP\Forms_MAV_2013_01\Forms\форма печати.vip(2)
 Ошибка: В ресурсе нет интерфейса COMPDATA::REPORT_AND_GROUP (стр.2, поз.33 в D:
\GAL810_VIP\Forms_MAV_2013_01\Forms\форма печати.vip)
alter interface Report_and_Group;
                                ^ [ Enter-продолжить ] :
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Привязка функции к форме

Сообщение Espada »

edward_K писал(а):1. У фейса REPORT_AND_GROUP нет компоненты(compdata - это рес).
2. REPORT_AND_GROUP запрещен для докомпиляции(поправьте примером если это не так) - жаль, можно было бы много чего интересного сделать - типа прав на запуск отчетов.
3. REPORT_AND_GROUP вызывается абсолютно везде при печати в формат бизнес-текст, так что смысла модифицировать именно его нет.
4. То есть вам нужно либо докомпилировать тот фейс, из которого идет вызов печати(скорей всего это будет событие cmPrintDoc или то что срабатывает по вашей кнопке ), либо встроить изменения в саму печатную форму.
спасибо я догадывался, что скорее всего эту форму нельзя модифицировать. однако начальство требовало дополнительного пересчета для невнимательных работников) получилось так, что кнопка всё считает нормально, однако работники могут забыть её нажать а сразу пустить документ на печать(CTRL+P), вот и дали задание чтобы скидки автоматически пересчитывались при нажатии на CTRL+P или ,чтобы ,хотя бы, высвечивалось сообщение "Не забудьте пересчитать налог".
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Привязка функции к форме

Сообщение m0p3e »

Помню ковырял как-то Report_And_Groups на 5.82. Даже разграничение доступа сделал. :) Но муторно очень.
В данном случае пошел бы по такому пути привлечения обработчиков событий. BindEvent и т.д.
Делаем фейсик с событием.
Докомпиляцией в основной интерфейс вешаем слушать данное событие и при срабатывании запускаем нужный нам процесс.
В нужной форме добавляем вызов данного события.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Привязка функции к форме

Сообщение m0p3e »

Espada писал(а):[однако начальство требовало дополнительного пересчета для невнимательных работников) получилось так, что кнопка всё считает нормально, однако работники могут забыть её нажать а сразу пустить документ на печать(CTRL+P), вот и дали задание чтобы скидки автоматически пересчитывались при нажатии на CTRL+P или ,чтобы ,хотя бы, высвечивалось сообщение "Не забудьте пересчитать налог".
Ну а тут вообще все просто.

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

HandleEvent
cmPrintdoc :
 {
  MyCalcFunc;
  inherined::handleevent(cmPrintDoc);
 };
End;
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Привязка функции к форме

Сообщение Espada »

m0p3e писал(а): Ну а тут вообще все просто.

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

HandleEvent
cmPrintdoc :
 {
  MyCalcFunc;
  inherined::handleevent(cmPrintDoc);
 };
End;
Спасибо большое!)
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
Ответить