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

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

Добавлено: 21 май 2013, 11:18
Espada
Ещё раз здравствуйте! У меня вопрос: можно ли привязать функцию к форме? То есть чтобы при открытии формы печати(Ctrl+P) автоматически выполнялся перерасчет цены. Сама функция у меня есть. сперва сделал чтобы перерасчет выполнялся при нажатии кнопки на форме "Сбыт", однако попросили сделать пересчет(на всякий случай) ещё и автоматически при вызове формы печати(ctrl+p). Если кто-нибудь знает функцию или какой-дибо алгоритм выполнения действий, помогите плиз. :)

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

Добавлено: 21 май 2013, 12:09
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
???

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

Добавлено: 21 май 2013, 12:28
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.


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

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

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

 message('Функция работает нормально');
но не знаю как обратиться именно к форме печати(

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

Добавлено: 21 май 2013, 14:27
savov
Во-первых,

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

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

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

Добавлено: 21 май 2013, 14:39
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;

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

Добавлено: 21 май 2013, 14:45
savov
А почему компонент-то Report_And_Group?
Компонент CompData

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

Добавлено: 21 май 2013, 14:49
edward_K
1. У фейса REPORT_AND_GROUP нет компоненты(compdata - это рес).
2. REPORT_AND_GROUP запрещен для докомпиляции(поправьте примером если это не так) - жаль, можно было бы много чего интересного сделать - типа прав на запуск отчетов.
3. REPORT_AND_GROUP вызывается абсолютно везде при печати в формат бизнес-текст, так что смысла модифицировать именно его нет.
4. То есть вам нужно либо докомпилировать тот фейс, из которого идет вызов печати(скорей всего это будет событие cmPrintDoc или то что срабатывает по вашей кнопке ), либо встроить изменения в саму печатную форму.

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

Добавлено: 21 май 2013, 14:55
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-продолжить ] :

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

Добавлено: 21 май 2013, 15:02
Espada
edward_K писал(а):1. У фейса REPORT_AND_GROUP нет компоненты(compdata - это рес).
2. REPORT_AND_GROUP запрещен для докомпиляции(поправьте примером если это не так) - жаль, можно было бы много чего интересного сделать - типа прав на запуск отчетов.
3. REPORT_AND_GROUP вызывается абсолютно везде при печати в формат бизнес-текст, так что смысла модифицировать именно его нет.
4. То есть вам нужно либо докомпилировать тот фейс, из которого идет вызов печати(скорей всего это будет событие cmPrintDoc или то что срабатывает по вашей кнопке ), либо встроить изменения в саму печатную форму.
спасибо я догадывался, что скорее всего эту форму нельзя модифицировать. однако начальство требовало дополнительного пересчета для невнимательных работников) получилось так, что кнопка всё считает нормально, однако работники могут забыть её нажать а сразу пустить документ на печать(CTRL+P), вот и дали задание чтобы скидки автоматически пересчитывались при нажатии на CTRL+P или ,чтобы ,хотя бы, высвечивалось сообщение "Не забудьте пересчитать налог".

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

Добавлено: 21 май 2013, 15:19
m0p3e
Помню ковырял как-то Report_And_Groups на 5.82. Даже разграничение доступа сделал. :) Но муторно очень.
В данном случае пошел бы по такому пути привлечения обработчиков событий. BindEvent и т.д.
Делаем фейсик с событием.
Докомпиляцией в основной интерфейс вешаем слушать данное событие и при срабатывании запускаем нужный нам процесс.
В нужной форме добавляем вызов данного события.

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

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

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

HandleEvent
cmPrintdoc :
 {
  MyCalcFunc;
  inherined::handleevent(cmPrintDoc);
 };
End;

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

Добавлено: 21 май 2013, 16:57
Espada
m0p3e писал(а): Ну а тут вообще все просто.

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

HandleEvent
cmPrintdoc :
 {
  MyCalcFunc;
  inherined::handleevent(cmPrintDoc);
 };
End;
Спасибо большое!)