Code: Select all | Expand
#include "FiveWin.ch"
#include "XBrowse.ch"
static oWndMain, oWndOsc, oWndDataInfo
//----------------------------------------------------------------//
function Main()
local oFont
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
DEFINE WINDOW oWndMain TITLE "Fivewin MDI Test - Double XBrowse Timer" MDI MENU BuildMenu()
oWndMain:SetFont( oFont )
ACTIVATE WINDOW oWndMain MAXIMIZED
return nil
//----------------------------------------------------------------//
static function BuildMenu()
local oMenu
MENU oMenu
MENUITEM "Tasks"
MENU
MENUITEM "New" ACTION New()
ENDMENU
oMenu:AddMDI()
ENDMENU
return oMenu
//----------------------------------------------------------------//
static function New()
local oBar, oMsgBar, oBrwOsc
local oOsc := "OGGETTO_FALSO_OSC"
local aTimer := { NIL } // Array locale che blinda il timer del primo Child
local nMode := 1
local nT := 0.15
local aGraphData := {} // Array che conterrà i punti dell'onda dell'oscilloscopio
local aContatore := { 0.0 } // Array per l'avanzamento del tempo nel timer
// Popoliamo l'array iniziale dell'oscilloscopio con 12 righe
local i
for i := 1 to 12
AAdd( aGraphData, { i, "------------------------" } )
next
if oWndOsc == nil
DEFINE WINDOW oWndOsc MDICHILD OF oWndMain TITLE "New (Oscilloscope Simulation)"
// L'XBrowse nel primo Child che simulerà graficamente l'onda che cammina
@ 0, 0 XBROWSE oBrwOsc OF oWndOsc LINES NOBORDER ;
DATASOURCE aGraphData ;
COLUMNS 1, 2 ;
HEADERS "CH", "OSCILLOSCOPE SIGNAL DISPLAY (90ms)" ;
COLSIZES 50, 500
oBrwOsc:CreateFromCode()
oWndOsc:oClient := oBrwOsc
// Passiamo gli elementi alla barra dei pulsanti
oBar := NewBtnBar( @oOsc, oWndOsc, aTimer, nMode, oBrwOsc, aGraphData, aContatore )
DEFINE BUTTON OF oBar NOBORDER PROMPT "INFO DATA" ACTION Infodata( oOsc, nMode, nT )
DEFINE BUTTON OF oBar PROMPT "Close" ACTION oWndOsc:End()
DEFINE MSGBAR oMsgBar OF oWndOsc 2007
ACTIVATE WINDOW oWndOsc MAXIMIZED ;
VALID ( If( aTimer[1] != NIL, ( aTimer[1]:End(), aTimer[1] := NIL ), NIL ), oWndOsc := nil, .T. )
else
oWndOsc:SetFocus()
endif
return nil
//----------------------------------------------------------------//
static function NewBtnBar( oOsc, oWnd, aTimer, nMode, oBrwOsc, aGraphData, aContatore )
local oBar
DEFINE BUTTONBAR oBar OF oWnd 2015 SIZE 80, 80
// START - Fa camminare l'onda nell'XBrowse dell'oscilloscopio
DEFINE BUTTON OF oBar NOBORDER;
PROMPT "START" ;
ACTION testTime( oOsc, nMode, oWnd, aTimer, oBrwOsc, aGraphData, aContatore )
// STOP - Lo ferma istantaneamente senza risentire del focus di Infodata
DEFINE BUTTON OF oBar NOBORDER;
PROMPT "STOP" ;
ACTION ( ;
If( aTimer[1] != NIL, ;
( aTimer[1]:Deactivate(), aTimer[1]:End(), aTimer[1] := NIL, MsgInfo("Timer Oscilloscopio FERMATO!") ), ;
MsgInfo( "Il timer era già NIL o spento!" ) ;
) ;
)
return oBar
//----------------------------------------------------------------//
FUNCTION testTime( oOsc, nMode, oWnd, aTimer, oBrwOsc, aGraphData, aContatore )
LOCAL nInterval := 90
LOCAL oTmpTimer
if aTimer[1] != nil
aTimer[1]:End()
aTimer[1] := nil
endif
// Questo timer fa camminare l'oscilloscopio aggiornando l'XBrowse ogni 90ms
DEFINE TIMER oTmpTimer ;
INTERVAL nInterval ;
OF oWnd ;
ACTION ( ;
aContatore[1] += 0.25, ;
AggiornaGraficoSimulato( oBrwOsc, aGraphData, aContatore[1] ) ;
)
ACTIVATE TIMER oTmpTimer
aTimer[1] := oTmpTimer
RETURN NIL
//----------------------------------------------------------------//
// Muove l'onda sinusoidale e forza il riallineamento dell'XBrowse
static function AggiornaGraficoSimulato( oBrwOsc, aGraphData, nVal )
local i, nPos
local cBase := "------------------------"
for i := 1 to Len( aGraphData )
// Sfasamento matematico per generare un'onda sinusoide fluida che si muove nel tempo
nPos := Int( ( Sin( nVal + (i * 0.5) ) + 1 ) * 11 ) + 1
aGraphData[i][2] := SubStr( cBase, 1, nPos - 1 ) + "X" + SubStr( cBase, nPos + 1 )
next
// ADESSO SI MUOVE: Diciamo all'XBrowse che l'array è cambiato internamente
oBrwOsc:SetArray( aGraphData )
oBrwOsc:Refresh()
return nil
//----------------------------------------------------------------//
static function Infodata( oOsc, nChannel, nStepTime )
local oBrw, oBar, oMsgBar
local aData
local oTimerInfo
if oWndDataInfo == nil
aData := { {1, 0.15, 50.00}, {2, 0.30, 52.10}, {3, 0.45, 48.50} }
DEFINE WINDOW oWndDataInfo MDICHILD OF oWndMain TITLE "Info data (XBROWSE Window)"
@ 0, 0 XBROWSE oBrw OF oWndDataInfo LINES NOBORDER ;
DATASOURCE aData ;
COLUMNS 1, 2, 3 ;
HEADERS "IDX", "TIME", "VALUE"
oBrw:CreateFromCode()
DEFINE BUTTONBAR oBar OF oWndDataInfo 2007 SIZE 70, 60
DEFINE BUTTON OF oBar PROMPT "Close" ACTION oWndDataInfo:End()
oWndDataInfo:oClient = oBrw
DEFINE MSGBAR oMsgBar OF oWndDataInfo 2007
// Secondo Timer a 300ms che aggiorna i dati numerici nell'altro Child
DEFINE TIMER oTimerInfo ;
INTERVAL 300 ;
OF oWndDataInfo ;
ACTION UpdateSamples( oBrw, oOsc, nChannel, nStepTime )
ACTIVATE TIMER oTimerInfo
ACTIVATE WINDOW oWndDataInfo MAXIMIZED ;
VALID ( oTimerInfo:End(), oWndDataInfo := nil, .T. )
else
oWndDataInfo:SetFocus()
endif
return nil
//----------------------------------------------------------------//
FUNCTION UpdateSamples( oBrw, oOsc, nMode, nT )
local aNewData := { {1, hb_Random(1,10), hb_Random(10,100)},;
{2, hb_Random(1,10), hb_Random(10,100)},;
{3, hb_Random(1,10), hb_Random(10,100)} }
oBrw:SetArray( aNewData )
oBrw:Refresh()
RETURN NIL