Exit of the cycle DO WHILE on button pressing in a cycle
Posted: Sun Oct 14, 2012 11:30 pm
Prompt how to make, please, an exit of the cycle DO WHILE on button pressing in a cycle (it is very desirable with a program example)
Donnay Software Web Forums
http://donnay-software.com/DONNAY/
Code: Select all
DO WHILE !Eof() .and. ContinuePrinting()
* print
DbSkip(1)
ENDDO
Code: Select all
FUNCTION ContinuePrinting(lContinue)
STATIC lGoOn := .T.
IF PCount() = 1
lGoOn := lContinue
ENDIF
RETURN lGoOn
Code: Select all
M_Exit = .T.
DO WHILE M_Exit
@10, 0 DCGROUP oGroup6 CAPTION 'Задайте СУММАРНОЕ количество градаций в шкалах:' SIZE 70,3.5
IF K_N_KlSh > 0 && Кол-во числовых классификационных шкал
@ 1, 2 DCSAY "В классификационных шкалах:" PARENT oGroup6;@1,mPosGet DCSAY "" GET N_SKGrKl PARENT oGroup6 PICTURE "#####"
ENDIF
IF K_N_OpSh > 0 && Кол-во числовых описательных шкал
@ 2, 2 DCSAY "В описательных шкалах:" PARENT oGroup6;@2,mPosGet DCSAY "" GET N_SKGrPr PARENT oGroup6 PICTURE "#####"
ENDIF
* N_SKGrKl = IF(N_SKGrKl <= 4000, N_SKGrKl, 4000)
* N_SKGrPr = IF(N_SKGrPr <= 4000, N_SKGrPr, 4000)
* 0 - выход из цикла задания размерности модели
K_N_GrKlSh = N_SKGrKl - K_C_GrKlSh
K_N_GrOpSh = N_SKGrPr - K_C_GrOpSh
********** Если нет шкал, то нет и градаций:
K_N_GrKlSh = IF(K_N_KlSh=0,0,K_N_GrKlSh)
K_N_GrOpSh = IF(K_N_OpSh=0,0,K_N_GrOpSh)
K_C_GrKlSh = IF(K_C_KlSh=0,0,K_C_GrKlSh)
K_C_GrOpSh = IF(K_C_OpSh=0,0,K_C_GrOpSh)
* СУММАРНОЕ КОЛИЧЕСТВО ШКАЛ И ГРАДАЦИЙ СИМ(кл/пр):####### x #######"
* ╔═══════════╦═════════════════════════╦═════════════════════════╗"
* ║ ║ Классификационные ║ Описательные ║"
* ║ ╟────────┬────────┬───────╫────────┬────────┬───────╢"
* ║ ║ Шкалы │Градации│ Гр/шк ║ Шкалы │Градации│ Гр/шк ║"
* ╠═══════════╬════════╪════════╪═══════╬════════╪════════╪═══════╣"
* 1 ║ Числовые ║ 2 │ 3 │ 4 ║ 5 │ 6 │ 7 ║"
* ╟───────────╫────────┼────────┼───────╫────────┼────────┼───────╢"
* 2 ║ Текстовые ║ 2 │ 3 │ 4 ║ 5 │ 6 │ 7 ║"
* ╠═══════════╬════════╪════════╪═══════╬════════╪════════╪═══════╣"
* 3 ║ ВСЕГО: ║ 2 │ 3 │ 4 ║ 5 │ 6 │ 7 ║"
* ╚═══════════╩════════╧════════╧═══════╩════════╧════════╧═══════╝"
SELECT ScaleALL
// Классификационные шкалы
DBGOTO(1);FIELDPUT( 2, K_N_KlSh ) // Кол-во числовых классификационных шкал
DBGOTO(2);FIELDPUT( 2, K_C_KlSh ) // Кол-во текстовых классификационных шкал
DBGOTO(3);FIELDPUT( 2, K_N_KlSh+K_C_KlSh ) // Суммарное кол-во классификационных шкал
DBGOTO(1);FIELDPUT( 3, K_N_GrKlSh ) // Суммарное кол-во градаций числовых клас.шкал
DBGOTO(2);FIELDPUT( 3, K_C_GrKlSh ) // Суммарное кол-во градаций текстовых клас.шкал
DBGOTO(3);FIELDPUT( 3, K_N_GrKlSh+K_C_GrKlSh ) // Суммарное кол-во градаций числ.и текст.клас.шкал
DBGOTO(1);FIELDPUT( 4, INT(K_N_GrKlSh/K_N_KlSh) ) // Среднее кол-во градаций в числовых классификационных шкалах
DBGOTO(2);FIELDPUT( 4, INT(K_C_GrKlSh/K_C_KlSh) ) // Среднее кол-во градаций в текстовых классификационных шкалах
Mv = INT((K_N_GrKlSh+K_C_GrKlSh)/(K_N_KlSh+K_C_KlSh))
DBGOTO(3);FIELDPUT( 4, Mv ) // Среднее кол-во градаций в числ.и текст.клас.шкалах
// Описательные шкалы
DBGOTO(1);FIELDPUT( 5, K_N_OpSh ) // Кол-во числовых описательных шкал
DBGOTO(2);FIELDPUT( 5, K_C_OpSh ) // Кол-во текстовых описательных шкал
DBGOTO(3);FIELDPUT( 5, K_N_OpSh+K_C_OpSh ) // Суммарное кол-во описательных шкал
DBGOTO(1);FIELDPUT( 6, K_N_GrOpSh ) // Суммарное кол-во градаций числовых клас.шкал
DBGOTO(2);FIELDPUT( 6, K_C_GrOpSh ) // Суммарное кол-во градаций текстовых клас.шкал
DBGOTO(3);FIELDPUT( 6, K_N_GrOpSh+K_C_GrOpSh ) // Суммарное кол-во градаций числ.и текст.опис.шкал
DBGOTO(1);FIELDPUT( 7, INT(K_N_GrOpSh/K_N_OpSh) ) // Среднее кол-во градаций в числовых описательных шкалах
DBGOTO(2);FIELDPUT( 7, INT(K_C_GrOpSh/K_C_OpSh) ) // Среднее кол-во градаций в текстовых описательных шкалах
Mv = INT((K_N_GrOpSh+K_C_GrOpSh)/(K_N_OpSh+K_C_OpSh))
DBGOTO(3);FIELDPUT( 7, Mv ) // Среднее кол-во градаций в числ.и текст.опис.шкалах
Flag_err = .F.
IF K_N_KlSh > 0 .AND. K_N_GrKlSh <= 0 .OR.;
K_C_KlSh > 0 .AND. K_C_GrKlSh <= 0
M_Exit = 1
Flag_err = .T.
* Mess3 = "Задайте больше классификационных шкал !!!"
* @24,40-LEN(Mess3)/2 DCSAY Mess3
* INKEY(0)
ENDIF
IF K_N_OpSh > 0 .AND. K_N_GrOpSh <= 0 .OR.;
K_C_OpSh > 0 .AND. K_C_GrOpSh <= 0
M_Exit = 1
Flag_err = .T.
* Mess3 = "Задайте больше описательных шкал !!!"
* @24,40-LEN(Mess3)/2 DCSAY Mess3 COLOR "w+/rb"
* INKEY(0)
ENDIF
** K_N_KlSh // Кол-во числовых классификационных шкал
** K_C_KlSh // Кол-во текстовых классификационных шкал
IF K_N_KlSh + K_C_KlSh <= 0
M_Exit = 1
Flag_err = .T.
Mess3 = "Нет классификационных шкал!!! Для продолжения нажмите какую-нибудь клавишу"
ENDIF
** K_N_OpSh // Кол-во числовых описательных шкал
** K_C_OpSh // Кол-во текстовых описательных шкал
IF K_N_OpSh + K_C_OpSh <= 0
M_Exit = 1
Flag_err = .T.
Mess3 = "Нет описательных шкал!!! Для продолжения нажмите какую-нибудь клавишу"
ENDIF
** K_N_GrKlSh // Суммарное кол-во градаций числовых классификационных шкал
** K_C_GrKlSh // Суммарное кол-во градаций текстовых классификационных шкал
IF K_N_GrKlSh + K_C_GrKlSh <= 0
M_Exit = 1
Flag_err = .T.
Mess3 = "Нет градаций классификационных шкал!!! Для продолжения нажмите клавишу"
ENDIF
** K_N_GrOpSh // Суммарное кол-во градаций числовых описательных шкал
** K_C_GrOpSh // Суммарное кол-во градаций текстовых описательных шкал
IF K_N_GrOpSh + K_C_GrOpSh <= 0
M_Exit = 1
Flag_err = .T.
Mess3 = "Нет градаций описательных шкал!!! Для продолжения нажмите какую-нибудь клавишу"
ENDIF
/* ----- Create browse ----- */
* СУММАРНОЕ КОЛИЧЕСТВО ШКАЛ И ГРАДАЦИЙ СИМ(кл/пр):####### x #######"
* ╔═══════════╦═════════════════════════╦═════════════════════════╗"
* ║ ║ Классификационные ║ Описательные ║"
* ║ ╟────────┬────────┬───────╫────────┬────────┬───────╢"
* ║ ║ Шкалы │Градации│ Гр/шк ║ Шкалы │Градации│ Гр/шк ║"
* ╠═══════════╬════════╪════════╪═══════╬════════╪════════╪═══════╣"
* 1 ║ Числовые ║ 2 │ 3 │ 4 ║ 5 │ 6 │ 7 ║"
* ╟───────────╫────────┼────────┼───────╫────────┼────────┼───────╢"
* 2 ║ Текстовые ║ 2 │ 3 │ 4 ║ 5 │ 6 │ 7 ║"
* ╠═══════════╬════════╪════════╪═══════╬════════╪════════╪═══════╣"
* 3 ║ ВСЕГО: ║ 2 │ 3 │ 4 ║ 5 │ 6 │ 7 ║"
* ╚═══════════╩════════╧════════╧═══════╩════════╧════════╧═══════╝"
aStructure := { { "Data_Type" , "C", 9, 0 }, ;
{ "Cl_Scale" , "N", 7, 0 }, ;
{ "GrCl_Scal" , "N", 7, 0 }, ;
{ "Gr_ClSc" , "N", 7, 2 }, ;
{ "Op_Scale" , "N", 7, 0 }, ;
{ "GrOp_Scal" , "N", 7, 0 }, ;
{ "Gr_OpSc" , "N", 7, 2 } }
SELECT ScaleALL
DBGOTOP()
@ 14, 0 DCPUSHBUTTON CAPTION 'Пересчитать шкалы и градации' SIZE 27, 1 ACTION {||M_Exit = .T.}
@ 14,30 DCPUSHBUTTON CAPTION 'Выход на начало ввода данных' SIZE 27, 1 ACTION {||M_Exit = .F.}
IF K_N_KlSh + K_N_OpSh > 0
@0,0 DCSAY "ЗАДАНИЕ В ДИАЛОГЕ РАЗМЕРНОСТИ МОДЕЛИ"
ELSE
@0,0 DCSAY "ИНФОРМАЦИЯ О РАЗМЕРНОСТИ МОДЕЛИ"
ENDIF
// Отобразить тип шкал: класс.или опис. и размерность модели
@2, 0 DCBROWSE oBrowse ALIAS 'ScaleALL' SIZE 70,7.1 ;
PRESENTATION DC_BrowPres() ; // Только просмотр БД
HEADLINES 4 ; // Кол-во строк в заголовке
NOHSCROLL NOVSCROLL // Убрать горизонтальную и вертикальную полосы прокрутки
DCBROWSECOL FIELD ScaleALL->Data_Type HEADER "Тип шкалы" PARENT oBrowse WIDTH 7
DCBROWSECOL FIELD ScaleALL->Cl_Scale HEADER "Кол-во;класс.;шкал" PARENT oBrowse WIDTH 5
DCBROWSECOL FIELD ScaleALL->GrCl_Scal HEADER "Кол-во;градаций;класс.;шкал" PARENT oBrowse WIDTH 5
DCBROWSECOL FIELD ScaleALL->Gr_ClSc HEADER "Средн.;кол-во;градаций;на шкалу" PARENT oBrowse WIDTH 5
DCBROWSECOL FIELD ScaleALL->Op_Scale HEADER "Кол-во;опис.;шкал" PARENT oBrowse WIDTH 5
DCBROWSECOL FIELD ScaleALL->GrOp_Scal HEADER "Кол-во;градаций;опис.;шкал" PARENT oBrowse WIDTH 5
DCBROWSECOL FIELD ScaleALL->Gr_OpSc HEADER "Средн.;кол-во;градаций;на шкалу" PARENT oBrowse WIDTH 5
DCGETOPTIONS TABSTOP
DCREAD GUI ;
OPTIONS GetOptions ;
MODAL ;
TITLE '2.3.2.2. Задание размерности модели системы "ЭЙДОС-X++"';
FIT ;
CLEAREVENTS
ENDDO
Code: Select all
#INCLUDE "dcdialog.CH"
FUNCTION Main()
LOCAL GetList[0], lProcessing := .f., oStatus
@ 0,0 DCPUSHBUTTON CAPTION 'Start Process' SIZE 20,1.5 ;
ACTION {||ProcessLoop(@lProcessing,GetList,oStatus)} ;
WHEN {||!lProcessing}
@ 2,0 DCPUSHBUTTON CAPTION 'End Process' SIZE 20,1.5 ;
ACTION {||lProcessing := .f.} ;
WHEN {||lProcessing}
@ 4,0 DCSAY '' SAYSIZE 20 COLOR GRA_CLR_BLUE FONT '10.Arial Bold' OBJECT oStatus
DCREAD GUI FIT TITLE 'Processing Test'
* ---------------
STATIC FUNCTION ProcessLoop( lProcessing, GetList, oStatus )
LOCAL nCount := 1
lProcessing := .t.
DC_GetRefresh(GetList)
oStatus:setColorFG(GRA_CLR_BLUE)
DO WHILE lProcessing
DC_CompleteEvents()
oStatus:setCaption('Work in progress ' + Alltrim(Str(nCount++)))
Sleep(10)
ENDDO
oStatus:setColorFG(GRA_CLR_RED)
oStatus:setCaption('Process stopped!')
DC_GetRefresh(GetList)
RETURN nil
Code: Select all
#INCLUDE "appevent.CH"
#define EDIT_RECORD xbeP_User+1
STATIC lContinut
FUNCTION Main()
LOCAL GetList[0], GetOptions, oDlg, lStatus := .t., nStatus
lcontinue := .T.
USE \exp\data\xtest
@ 0,0 DCSAY {||XTEST->city + ': ' + STR(XTEST->(recno()),4)} SIZE 30 SAYLEFTBOTTOM
@ 2,0 DCSAY 'Area Code' GET XTEST->areacode GETOBJECT oAreaCode ;
VALID {|o| iif(DC_ReadGuiLastKey(getlist) = xbeK_ENTER.OR.DC_ReadGuiLastKey(getlist)==xbeK_DOWN,PostAppEvent(xbeP_Keyboard,xbeK_PGDN,,o),nil) }
// KEYBLOCK {|c,b,o| iif((c==xbeK_ENTER.OR.c==xbeK_DOWN), PostAppEvent(xbeP_Keyboard,xbeK_PGDN,,o),nil) }
@ 3,0 DCSAY 'Exchange' GET XTEST->exchange
@ 5,0 DCSAY 'Number' GET XTEST->number GETOBJECT oNumber ACCELKEY {xbeK_PGDN}
@ 6,0 DCSAY 'Number2' GET XTEST->number
@ 7,0 DCSAY 'Number3' GET XTEST->number
@ 9,0 DCPUSHBUTTON CAPTION 'Done' SIZE 10,1.2 ;
ACTION {|| lContinue := .F., DC_ReadGuiEvent(DCGUI_EXIT_ABORT,GetList)}
@ 9,12 DCPUSHBUTTON CAPTION 'Next' SIZE 10,1.2 ;
ACTION {|| DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)}
@ 9,24 DCPUSHBUTTON CAPTION 'Post' SIZE 10,1.2 ;
ACTION {|| Processing(Getlist) }
DCGETOPTIONS SAYWIDTH 100 SAYRIGHTBOTTOM
DCREAD GUI FIT TITLE 'Editing Data' EXIT SAVE PARENT @oDlg OPTIONS GetOptions
SetAppFocus(oAreaCode)
lStatus := DC_ReadGuiEventLoop(Getlist)
wtf 'exit last time'
oDlg:destroy()
RETURN nil
* -----------
PROC appsys ; return
* -----------
STATIC FUNCTION Processing( GetList )
wtf 'start processing'
//USE \exp\data\xtest
DO WHILE !XTEST->(Eof())
wtf 'loop'
SetAppFocus(oAreaCode)
lStatus := DC_ReadGuiEventLoop(Getlist)
IF !lContinue
wtf '!lcontinue and exit'
EXIT
ENDIF
XTEST->(dbSkip())
dc_GetRefresh(Getlist)
ENDDO
wtf 'exit processing'
lStatus := DC_ReadGuiEventLoop(Getlist)
RETURN nil
Code: Select all
dc_debugqout('exit processing')
Code: Select all
wtf 'exit processing'