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
*------------
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)