Форум » GUI » Закрытие EXCEL'а при "вылете" из программы ? » Ответить

Закрытие EXCEL'а при "вылете" из программы ?

Andrey: Всем привет ! Столкнулся с проблемой.... Написал на MiniGui программу по переводу файлов из XLS в DBF ! Если случается ошибка при обработки, то программа сваливается, а EXCEL остается в памяти. И так штук 10 !!! И файлы МОИ держит открытыми ! Пока понял в чем дело .... Как можно при АВАРИЙНОМ вылете программы ЗАКРЫТЬ EXCEL в памяти ? Заранее спасибо !

Ответов - 12

PSP: BEGIN SEQUENCE не подходит? PS: плюс свой error handler

Andrey: Это типа так: LOCAL bError := ErrorBlock( {|e| Break(e) } ) // // Открытие Экселя и Базы // BEGIN SEQUENCE // Обработка XLS-файла .......... .......... .......... RECOVER // Error - Закрытие Экселя и БАЗЫ! CLOSE DBFBASE oExcel:Quit() ENDSEQUENCE ErrorBlock( bError ) // Нормальное закрытие Экселя и базы ! CLOSE DBFBASE oExcel:Quit() ....................

Andrey: А как можно это сделать при выходе из программы ? В хХарборе есть процедура при выходе: EXIT PROCEDURE Exit() // Error - Закрытие Экселя и БАЗЫ! CLOSE ALL oExcel:Quit() RETURN PROCEDURE MAIN() RETURN А как в МиниГуи делать ?


Andrey: Dima пишет: Вероятно так же. Хотелось бы знать как узнать, что программа вылетела и передать туда oExcel:Quit() из функции обработки XLS ? Я в функции обработки XLS последовательно открываю файлы XLS. И на каком "споткнется" программа я не знаю. При выходе же не всегда нужно делать oExcel:Quit(), а только по ошибке ! Как это все реализовать ?

fil: А что понимается под "споткнется программа" ? Какая - Excel?, хХарбор ? Чего вдруг ?

Andrey: fil пишет: А что понимается под "споткнется программа" ? Какая - Excel?, хХарбор ? Чего вдруг ? Харбор "споткнется" ! Дело в том что если в таблице EXCEL-я не заполнена графа, то происходит вылет ! Нужно проверять на значение в таблице NIL или не NIL ! Ну программеры из ЕИРЦ так заполнили таблицу ! Несоответствие типов в ячейке... И так далее... Я с Экселем мало работал, вот и натыкаюсь на грабли... Как вообще правильно считывать значение в ячейке и записывать в БАЗУ ?

fil: Выделяем рабочую область таблицы. В цикле считываем знчение .Value каждой ячейки и пишем в базу. Разбираемся с цифрами и датой, ну может еще какие хитрые форматы есть. Типа так: mas[1]:=oExc:ActiveSheet:Cells:SpecialCells(xlCellTypeLastCell):Row mas[2]:=oExc:ActiveSheet:Range("A1"):CurrentRegion:Columns:Count for st=1 to mas[1] for zzt=1 to mas[2] el:=iif(zzt>26,"A","")+chr(64+zzt-iif(st>26,26,0))+ltrim(str(st)) cll:=oExc:ActiveSheet:Range(el):NumberFormat if "0,00"$cll &&.or.cll=tip[2] fl:=oExc:ActiveSheet:Cells(st, zz):Value if cll="ДД".and.valtype(fl)="D" ....... elseif "0,00"$cll.and.valtype(fl)="N" ....... endif endif next next

Andrey: Я не пользуюсь выделением таблицы. Как Григорий подсказал мне ранее, так я и делаю. [pre2]#include "excel.ch" ........ oExcel:Visible := .F. // Не показывать EXCEL oExcel:Workbooks:Open( cFileXls, 0 ) oSheet := oExcel:Get( "ActiveSheet" ) oRange := oExcel:ActiveCell:SpecialCells( xlLastCell ) // определено в excel.ch nLenRecnoXls := oRange:Row nLenColumnXls := oRange:Column FOR nI := 2 TO nLenRecnoXls cJ := AllTrim(Str(nI)) lSayErr:= .F. cTemp := "" xTemp1 := oSheet:Cells( nI, 1 ):Value IF xTemp1 == NIL xTemp1 := 0 ENDIF cTemp += Str( nI ) + ",1 - " + ValType( xTemp1 ) + " = " + Str(Int(xTemp1)) + CLRF xTemp2 := oSheet:Cells( nI, 2 ):Value IF xTemp2 == NIL xTemp2 := 0 ENDIF cTemp += Str( nI ) + ",2 - " + ValType( xTemp2 ) + " = " + Str(Int(xTemp2)) + CLRF xTemp3 := oSheet:Cells( nI, 3 ):Value IF xTemp3 == NIL xTemp3 := "" ENDIF cTemp += Str( nI ) + ",3 - " + ValType( xTemp3 ) + " = " + xTemp3 + CLRF xTemp4 := oSheet:Cells( nI, 4 ):Value IF xTemp4 == NIL xTemp4 := "" ENDIF cTemp += Str( nI ) + ",4 - " + ValType( xTemp4 ) + " = " + xTemp4 + CLRF xTemp5 := oSheet:Cells( nI, 5 ):Value IF xTemp5 == NIL xTemp5 := 0 ENDIF cTemp += Str( nI ) + ",5 - " + ValType( xTemp5 ) + " = " + Str(xTemp5) + CLRF xTemp6 := oSheet:Cells( nI, 6 ):Value IF xTemp6 == NIL xTemp6 := CToD(cDateFile) lSayErr:= .T. ENDIF cTemp += Str( nI ) + ",6 - " + ValType( xTemp6 ) + " = " + DToC(xTemp6) + CLRF // StatusCopy.Bar_2.Value:=nI // STATUS BAR 2 - бегунок Select DBFBASE APPEND BLANK cText := AllTrim(Str(Int(xTemp1))) DBFBASE->LC_EIRC := cText //"C", 12,0 cText := AllTrim(Str(Int(xTemp2))) DBFBASE->LC := PadL(cText,8,"0") //"C", 8,0 DBFBASE->ADRES := HB_ANSITOOEM( xTemp3 ) //"C", 50,0 DBFBASE->FIO := HB_ANSITOOEM( xTemp4 ) //"C", 40,0 DBFBASE->SUMMA := xTemp5 //"N", 10,2 DBFBASE->DATEPL := xTemp6 //"D", 8,0 DO EVENTS IF lSayErr == .T. cError2 = 'Строка № '+cJ+' - НЕТ ДАТЫ ОПЛАТЫ ! Заменил на "' + cDateFile+ '" ! ' + CLRF MsgInfo( cError+CLRF+cError2+CLRF+CLRF+cTemp+CLRF+CLRF, "Ошибка" ) ENDIF NEXT[/pre2]

Петр: Andrey пишет: Как это все реализовать ? Это плохая идея и ее не надо реализовывать. Но если сильно хочется - объявляйте oExcel как публичную или глобальную переменную и проверяйте ее при выходе. Если вы пробовали прилинковать какую-нибудь exit процедуру к програме с использованием MiniGUI - то, наверняка, видели такое сообщение EXIT PROCEDURE Statement is not Supported in MiniGUI. Use Main Window ON RELEASE Event Procedure Instead. Вот вам и подсказка как делать в МиниГуи. Но, что-то мне подсказывает, что такой вариант не рассчитан на аварийное завершение работы, утверждать не стану. Можете конечно и в MiniGUI\Include\i_controlmisc.ch закомментировать часть кода переопределяющего EXIT PROCEDURE, но тогда вы должны точно представлять, что делаете и просчитать все варианты поведения программы. У Лопеза, наверное, не получилось..

SADSTAR33: А событие ON_RELEASE для главного окна не прокатит вместо EXIT PROCEDURE?

PSP: SADSTAR33 пишет: А событие ON_RELEASE Вопрос в том, наступает ли это событие при аварийном завершении.

Andrey: Петр пишет: Это плохая идея и ее не надо реализовывать. Спасибо большое за подробное разъяснение !



полная версия страницы