Перехват отмены выбора отчета. REPORT_AND_GROUP2.

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

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

Ответить
edd
Постоянный обитатель
Сообщения: 170
Зарегистрирован: 29 мар 2005, 17:49

Перехват отмены выбора отчета. REPORT_AND_GROUP2.

Сообщение edd »

Приветствую!

Навешал VBscript при формировании slk отчета в модуле Управление персоналом.

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

alter interface PRINTT13 (fix 'Альбомная ориентация');
var b_PrintRep : boolean;
procedure mySetOrientation;
{
  var iStrFunc : StringFunctions;
  var FileName, VBSFileName : string;
  FileName := CreateTmpFileName;
  VBSFileName := TranslatePath ( GetStringParameter ( 'Files','OutputFilesDirectory', 0 ) + 'tdmacro_prs.vbs' );
  //message(CurrentFileName)
  if instr('out', CurrentFileName)<> 0 then exit;                          //если *.OUT файл, то ниннада
  LogStrToFile ( FileName, oem2ansi( 'wdReplaceAll = 2') );
  LogStrToFile ( FileName, oem2ansi( 'Dim aStory') );                     // As Range
  LogStrToFile ( FileName, oem2ansi( 'Dim aField') );                     // As Field
  LogStrToFile ( FileName, oem2ansi( 'Dim myTOC') );                      // As TableOfContents

  LogStrToFile ( FileName, oem2ansi( 'Dim activeDoc') );

  LogStrToFile ( FileName, oem2ansi( 'Dim oDoc') );
  LogStrToFile ( FileName, oem2ansi( 'Dim oXls') );
  LogStrToFile ( FileName, oem2ansi( 'Dim bActXls') );
  LogStrToFile ( FileName, oem2ansi( 'dim bkActive') );
  LogStrToFile ( FileName, oem2ansi( 'Dim objWorksheet') );
  LogStrToFile ( FileName, oem2ansi( 'dim shActive') );
  If FileExist ( VBSFileName ) {
  LogStrToFile ( FileName, oem2ansi( 'bActXls = true ' ));
   }
  LogStrToFile ( FileName, oem2ansi( 'Set WshShell = CreateObject("WScript.Shell")') );
  LogStrToFile ( FileName, oem2ansi( 'On Error Resume next ') );                         //дает возможность обработать ошибку, а не выводить её
  LogStrToFile ( FileName, oem2ansi( 'do while bActXls ' ));
  LogStrToFile ( FileName, oem2ansi( 'if WshShell.AppActivate("TabT13") then ') );       //ждем когда можно активировать окно в заголовке которого есть нужные символы
  LogStrToFile ( FileName, oem2ansi( '  Set oXls = GetObject(,"Excel.Application")') )
  LogStrToFile ( FileName, oem2ansi( '  if err.number<>0 then bActXls = false  ') )      //даст возможность выйти из цикла при ошибке создания объекта эксель (это когда отчет word запустили)
  LogStrToFile ( FileName, oem2ansi( '  If Not (oXls Is Nothing) then') );               //при предыдущей ошибке не выполнится условие
  LogStrToFile ( FileName, oem2ansi( '   set bkActive = oXls.ActiveWorkbook') );
  //LogStrToFile ( FileName, oem2ansi( '   WScript.Echo ( bkActive.Name ) ') );
  LogStrToFile ( FileName, oem2ansi( '   If InStr(1,bkActive.Name,"TabT13") then ') );
  LogStrToFile ( FileName, oem2ansi( '     Set shActive = bkActive.Sheets(1) ') );
  LogStrToFile ( FileName, oem2ansi( '     Const xlLandscape = 2') );
  LogStrToFile ( FileName, oem2ansi( '     With shActive.Pagesetup') );
  LogStrToFile ( FileName, oem2ansi( '       .Orientation = xlLandscape') );
  LogStrToFile ( FileName, oem2ansi( '       .Zoom = 78') );
  LogStrToFile ( FileName, oem2ansi( '       .LeftMargin = oXls.InchesToPoints(0.7)') );
  LogStrToFile ( FileName, oem2ansi( '       .RightMargin = oXls.InchesToPoints(0.7)') );
  LogStrToFile ( FileName, oem2ansi( '       .TopMargin = oXls.InchesToPoints(0.512)') );
  LogStrToFile ( FileName, oem2ansi( '       .BottomMargin = oXls.InchesToPoints(0.63)') );
  LogStrToFile ( FileName, oem2ansi( '       .HeaderMargin = oXls.InchesToPoints(0)') );
  LogStrToFile ( FileName, oem2ansi( '       .FooterMargin = oXls.InchesToPoints(0)') );
  LogStrToFile ( FileName, oem2ansi( '       .PrintQuality = 600') );
  LogStrToFile ( FileName, oem2ansi( '       .Draft = False') );
  LogStrToFile ( FileName, oem2ansi( '       .FitToPagesWide = 1') );
  LogStrToFile ( FileName, oem2ansi( '     End With ') );
  LogStrToFile ( FileName, oem2ansi( '     bActXls = false ') );
  LogStrToFile ( FileName, oem2ansi( '     bkActive.Save ') );
  LogStrToFile ( FileName, oem2ansi( '   End If') );
  LogStrToFile ( FileName, oem2ansi( '  End If') );
  LogStrToFile ( FileName, oem2ansi( 'End If') );
  LogStrToFile ( FileName, oem2ansi( 'Loop') );
  If FileExist ( VBSFileName )
     DeleteFile ( VBSFileName );

     var iErrorCode : integer

 if CopyMoveFile ( FileName, VBSFileName, true, ecmfClientFrom + ecmfClientTo )
   ExecProgram ( 'start', VBSFileName,'Альбомная ориентация...',pfSilent,iErrorCode );
 //   message('ошибок не обнаружено, файл ' + Filename + ' перемещается в файл ' + VBSFileName)

}
HandleEvent
cmOk :
{ 
  if inherited::handleevent(cmOk)<> heAbort  then
     {
       if(GetFieldStringValue (#TYPEREP))='0' then mySetOrientation   //тип отчета текст, в нем есть наш slk
     }
}
end;
end. 
Вопрос в том, как обработать отмену выбора отчета (юзер жмет "Отмена" на форме REPORT_AND_GROUP2.). Читал что до REPORT_AND_GROUP2 не добраться.
Но если жмут отмену, то выполняется ExecProgram и окошко 'Альбомная ориентация...' лочит галактику.
Есть какой нибудь рабочий вариант обработки отмены?
Если выдается сообщение "Нет данных для формирования отчета", то может быть его появление как то можно обработать? Код ошибки?
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Перехват отмены выбора отчета. REPORT_AND_GROUP2.

Сообщение Den »

Вряд ли словишь нажатие "Отмена" в REPORT_AND_GROUP2.
Какую то подкорячку придумывать. Например, считать количество процессов excel ДО inherited::handleevent(cmOk) и ПОСЛЕ него сразу . И запускать mySetOrientation. только если значение увечилось на 1 (ок сформировался некий отчет slk при попытке напечатать юзером... )
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Перехват отмены выбора отчета. REPORT_AND_GROUP2.

Сообщение edward_K »

Я когда то давно вешал VB на открытие Excel , а потом смотрел какая книга активная. Но это было так давно.
Надо уходить на Excel шаблоны - даже если делаете отчет на Fcom. Лучше потратить пару часов на переделку формы, но потом иметь все возможности по форматированию вплоть до вызова макроса. У меня так есть свой набор функций в frn для вывода в Excel на Fcom, и даже писал конвертор на делфятке под это.
А что теперь Alter это фейса проходит? Я как то пробовал - бесполезно. Хотя мож компонента где то подхватилась.
edd
Постоянный обитатель
Сообщения: 170
Зарегистрирован: 29 мар 2005, 17:49

Re: Перехват отмены выбора отчета. REPORT_AND_GROUP2.

Сообщение edd »

edward_K писал(а):Я когда то давно вешал VB на открытие Excel , а потом смотрел какая книга активная. Но это было так давно.
Надо уходить на Excel шаблоны - даже если делаете отчет на Fcom. Лучше потратить пару часов на переделку формы...
На rtf мне тоже надо навешивать другой vb скрипт. Тут уже шаблонами не обойтись.

Попробую вываливаться по таймауту уже в vb, другого варианта я не вижу.
Ответить