Автор | Сообщение |
|
| постоянный участник
|
Пост N: 1564
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.10.10 23:01. Заголовок: Закрытие EXCEL'а при "вылете" из программы ?
Всем привет ! Столкнулся с проблемой.... Написал на MiniGui программу по переводу файлов из XLS в DBF ! Если случается ошибка при обработки, то программа сваливается, а EXCEL остается в памяти. И так штук 10 !!! И файлы МОИ держит открытыми ! Пока понял в чем дело .... Как можно при АВАРИЙНОМ вылете программы ЗАКРЫТЬ EXCEL в памяти ? Заранее спасибо !
|
|
|
Новых ответов нет
[см. все]
|
|
|
| постоянный участник
|
Пост N: 462
Зарегистрирован: 27.01.07
|
|
Отправлено: 10.10.10 09:17. Заголовок: BEGIN SEQUENCE не по..
BEGIN SEQUENCE не подходит? PS: плюс свой error handler
|
|
|
|
| постоянный участник
|
Пост N: 1565
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.10.10 12:31. Заголовок: Это типа так: :sm33..
Это типа так: LOCAL bError := ErrorBlock( {|e| Break(e) } ) // // Открытие Экселя и Базы // BEGIN SEQUENCE // Обработка XLS-файла .......... .......... .......... RECOVER // Error - Закрытие Экселя и БАЗЫ! CLOSE DBFBASE oExcel:Quit() ENDSEQUENCE ErrorBlock( bError ) // Нормальное закрытие Экселя и базы ! CLOSE DBFBASE oExcel:Quit() ....................
|
|
|
|
| постоянный участник
|
Пост N: 1566
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.10.10 12:38. Заголовок: А как можно это сдел..
А как можно это сделать при выходе из программы ? В хХарборе есть процедура при выходе: EXIT PROCEDURE Exit() // Error - Закрытие Экселя и БАЗЫ! CLOSE ALL oExcel:Quit() RETURN PROCEDURE MAIN() RETURN А как в МиниГуи делать ?
|
|
|
|
| постоянный участник
|
Пост N: 1567
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.10.10 18:06. Заголовок: Dima пишет: Вероят..
Dima пишет: Хотелось бы знать как узнать, что программа вылетела и передать туда oExcel:Quit() из функции обработки XLS ? Я в функции обработки XLS последовательно открываю файлы XLS. И на каком "споткнется" программа я не знаю. При выходе же не всегда нужно делать oExcel:Quit(), а только по ошибке ! Как это все реализовать ?
|
|
|
|
| |
Пост N: 38
Зарегистрирован: 17.06.10
|
|
Отправлено: 10.10.10 18:35. Заголовок: А что понимается под..
А что понимается под "споткнется программа" ? Какая - Excel?, хХарбор ? Чего вдруг ?
|
|
|
|
| постоянный участник
|
Пост N: 1568
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.10.10 20:02. Заголовок: fil пишет: А что по..
fil пишет: цитата: | А что понимается под "споткнется программа" ? Какая - Excel?, хХарбор ? Чего вдруг ? |
| Харбор "споткнется" ! Дело в том что если в таблице EXCEL-я не заполнена графа, то происходит вылет ! Нужно проверять на значение в таблице NIL или не NIL ! Ну программеры из ЕИРЦ так заполнили таблицу ! Несоответствие типов в ячейке... И так далее... Я с Экселем мало работал, вот и натыкаюсь на грабли... Как вообще правильно считывать значение в ячейке и записывать в БАЗУ ?
|
|
|
|
| |
Пост N: 39
Зарегистрирован: 17.06.10
|
|
Отправлено: 10.10.10 21:42. Заголовок: Выделяем рабочую обл..
Выделяем рабочую область таблицы. В цикле считываем знчение .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
|
|
|
|
| постоянный участник
|
Пост N: 1569
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.10.10 16:48. Заголовок: Я не пользуюсь выдел..
Я не пользуюсь выделением таблицы. Как Григорий подсказал мне ранее, так я и делаю. Скрытый текст
#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
|
|
|
|
|
| постоянный участник
|
Пост N: 975
Зарегистрирован: 09.10.06
|
|
Отправлено: 14.10.10 00:15. Заголовок: Andrey пишет: Как э..
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, но тогда вы должны точно представлять, что делаете и просчитать все варианты поведения программы. У Лопеза, наверное, не получилось..
|
|
|
|
| |
Пост N: 12
Зарегистрирован: 28.07.10
|
|
Отправлено: 14.10.10 01:18. Заголовок: А событие ON_RELEASE..
А событие ON_RELEASE для главного окна не прокатит вместо EXIT PROCEDURE?
|
|
|
|
| постоянный участник
|
Пост N: 464
Зарегистрирован: 27.01.07
|
|
Отправлено: 14.10.10 08:08. Заголовок: SADSTAR33 пишет: А ..
SADSTAR33 пишет: Вопрос в том, наступает ли это событие при аварийном завершении.
|
|
|
|
|
| постоянный участник
|
Пост N: 1571
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.10.10 18:49. Заголовок: Петр пишет: Это пло..
Петр пишет: цитата: | Это плохая идея и ее не надо реализовывать. |
| Спасибо большое за подробное разъяснение !
|
|
|
|