Page 1 of 1

ON KEY ACTION problem

Posted: Tue Nov 22, 2016 6:54 pm
by mol
Hi!
My app uses F2 hotkey for saving data.
Everything work OK when operator works slow. But, I have one of clients who has very speedy worker.
She enters data so quickly that program crashes.

In my prepared sample, it happens when I want to release form_3 with error Window: Form_3 is not active. Program terminated(at the last lines of sample).
It's strange, because I'm testing if form_3 is defined...

On quick computer, you need to press and keep F2 key, on slower one it's easier to observe this error

Please, try this sample, I've tried all my ideas with semaphores, etc. without success.

Code: Select all

#include "hmg.ch"

Function Main

	local i

	private aHeaders, aWidths, aJust
	private aSalaries := {}
	private aValid := {}
	private aWhen := {}
	private aControls := {}

	SET NAVIGATION EXTENDED
	
	aHeaders := {"Name","Salary"}
	aWidths := {200, 100}
	aJust := { 0,1}
	
	aValid	:= { {|| DataValidation()},  {|| DataValidation()} }
	aWhen	:= { {|| .t.}, {||.t.} }
	aControls := { {"TEXTBOX","CHARACTER"}, {"TEXTBOX","NUMERIC","9999.99"} }
	
	
	aADD(aSalaries, {"Simpson", 65 } )
	aADD(aSalaries, {"Mulder",41 } )
	aADD(aSalaries, {"Smart Max", 25} )
	
	
	DEFINE WINDOW Form_1 ;
		AT 100,100 ;
		WIDTH 500 ;
		HEIGHT 550 ;
		TITLE 'Editable Virtual Grid Test' ;
		MAIN 
	

		@ 10,10 GRID Grid_1 ;
			WIDTH 320 ;
			HEIGHT 340 ;
			HEADERS aHeaders ;
			WIDTHS aWidths;
			VALUE {1,1} ;
			TOOLTIP 'Editable Grid Control' ;
			EDIT ;
			COLUMNCONTROLS aControls;
			COLUMNVALID aValid;
			COLUMNWHEN aWhen;
			VIRTUAL ;
            ITEMCOUNT len(aSalaries) ;
            ON QUERYDATA OnQuery(aSalaries) ;        
	        JUSTIFY aJust;
			CELLNAVIGATION 
		
		@ 400, 10 BUTTON B_1 ;
			CAPTION "F6 - Add records from list";
			ACTION AddRecordsFromList() ;
			WIDTH 200 ;
			HEIGHT 30
			
	END WINDOW
	
	ON KEY F6 OF FORM_1 ACTION AddRecordsFromList()
	
	ACTIVATE WINDOW Form_1

Return
*----------------
function OnQuery
	param aSource
	local nRow, nCol

	nRow := This.QueryRowIndex
	nCol := This.QueryColIndex
	if nRow>0 .and. nCol >0
		This.QueryData := aSource[nRow,nCol]
	endif
return .t.	
*-----------------------
function DataValidation
	nRow := this.Value[1]
	nCol := this.Value[2]
	
	if empty(This.CellValue)
		return .f.
	endif
	aSalaries[nRow,nCol] := This.CellValue
return .t.
*------------------------
function AddRecordsFromList

	private aHeaders := {"Name","Preferred salary"}
	private aWidths  := {300,200}
	private aJust := {0,1}
	
	private aRows := {}
	
	aAdd(aRows, {"Marek",100.20})
	aAdd(aRows, {"Iza",123.22})
	aAdd(aRows, {"Szymon",321.23})
	aAdd(aRows, {"Javier",143.24})
	aAdd(aRows, {"Nico",154.25})
	aAdd(aRows, {"Maxim",132.26})
	aAdd(aRows, {"Reno",199.77})
	
	DEFINE WINDOW Form_2 ;
		AT 300,300 ;
		WIDTH 580 ;
		HEIGHT 400 ;
		TITLE 'Salariers' ;
		MODAL
	

		@ 10,10 GRID Grid_2 ;
			WIDTH 520 ;
			HEIGHT 240 ;
			HEADERS aHeaders ;
			WIDTHS aWidths;
			VALUE {1,1} ;
			TOOLTIP 'Press F2 or double click to select name' ;
			COLUMNCONTROLS aControls;
			COLUMNVALID aValid;
			COLUMNWHEN aWhen;
			VIRTUAL ;
            ITEMCOUNT len(aRows) ;
            ON QUERYDATA OnQuery(aRows) ;        
	        JUSTIFY aJust;
			CELLNAVIGATION 
		
		@ 270, 10 BUTTON B_2 ;
			CAPTION "F2 -select";
			ACTION SelectRecordFromList() ;
			WIDTH 200 ;
			HEIGHT 30
			
	END WINDOW
	
	ON KEY F2 OF FORM_2 ACTION SelectRecordFromList()
	
	activate window Form_2
 return
 *---------------------
 
function SelectRecordFromList

	local i
	
	i := Form_2.Grid_2.Value[1]
	
	if i == 0
		return
	endif
	
	DEFINE WINDOW Form_3 ;
		AT 350,200 ;
		WIDTH 220 ;
		HEIGHT 160 ;
		TITLE 'Change salary' ;
		MODAL
		
		@ 10,10 LABEL L_1 ;
			WIDTH 60 ;
			HEIGHT 18;
			VALUE "Name";
			RIGHTALIGN
		
		@ 10,80 TEXTBOX T_1 ;
			HEIGHT 24;
			WIDTH 120 ;
			VALUE aRows[i,1];
			READONLY;
			NOTABSTOP

		@ 40,10 LABEL L_2 ;
			WIDTH 60 ;
			HEIGHT 18;
			VALUE "Salary";
			RIGHTALIGN
		
		@ 40,80 TEXTBOX T_2 ;
			HEIGHT 24;
			WIDTH 120 ;
			VALUE aRows[i,2];
			NUMERIC ;
			INPUTMASK "9999.99";
			RIGHTALIGN

		@ 80, 10 BUTTON B_Save ;
			CAPTION "F2 -Save";
			ACTION SaveRecord() ;
			WIDTH 120 ;
			HEIGHT 30
		
	END WINDOW
	
	ON KEY F2 OF FORM_3 ACTION SaveRecord()
	
	activate window Form_3
	
*-----------
function SaveRecord
	
	Release Key F2 of Form_3
	
	if .not. IsWindowDefined("Form_3") 
		MsgStop("You are too speedy!")
		return
	endif
	
	aAdd(aSalaries, {Form_3.T_1.Value, Form_3.T_2.Value})

	// THIS IS THE LINE WHICH CAUSES CRASH SYSTEM
	
	Form_3.Release
	
	// refresh grid in main windows
	Form_1.Grid_1.ItemCount := 0
	Form_1.Grid_1.ItemCount := len(aSalaries)
	
return
*------------
Here is error message
Date:11/22/16 Time: 19:35:57
Error: HMG 3.4.3 Stable (32 bits)
Window: Form_3 is not active. Program terminated
Called from _RELEASEWINDOW(3841)
Called from DOMETHOD(9007)
Called from SAVERECORD(211)
Called from (b)SELECTRECORDFROMLIST(195)
Called from _DOCONTROLEVENTPROCEDURE(6006)
Called from EVENTS(823)
Called from DOEVENTS(0)
Called from _SHOWWINDOW(3964)
Called from _ACTIVATEWINDOW(5640)
Called from SELECTRECORDFROMLIST(197)
Called from (b)ADDRECORDSFROMLIST(137)
Called from _DOCONTROLEVENTPROCEDURE(6006)
Called from EVENTS(823)
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(5669)
Called from ADDRECORDSFROMLIST(139)
Called from (b)MAIN(62)
Called from _DOCONTROLEVENTPROCEDURE(6006)
Called from EVENTS(823)
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(5669)
Called from MAIN(64)

Re: ON KEY ACTION problem

Posted: Tue Nov 22, 2016 10:03 pm
by srvet_claudio
Test with IsWindowActive (<WindowName>)
PD: in IsWindowActive and IsWindowDefined the WindowName it is without quote.

ON KEY ACTION problem

Posted: Tue Nov 22, 2016 10:10 pm
by Pablo César
srvet_claudio wrote:Test with IsWindowActive (<WindowName>)
PD: in IsWindowActive and IsWindowDefined the WindowName it is without quote.
Remember Claudio, this was enhanced putting or not quotes are accepting.

See this: viewtopic.php?p=42098#p42098

This problem was corrected for:
_IsControlDefined()
_IsWindowDefined()
_IsWindowActive()

Just for keeping informed.

Re: ON KEY ACTION problem

Posted: Wed Nov 23, 2016 8:57 am
by mol
Thanks for help!
I've tried IsWindowActive function, but with quoted form name...
Now, it looks it works OK, but, my client must approve this :-D to announce full victory :D

Thanks again!