sync SVN r18236

This commit is contained in:
2026-09-30 20:05:27 +03:00
parent 7010acf850
commit b7dd1ac0a5
4 changed files with 573 additions and 7 deletions

View File

@@ -120,6 +120,18 @@ DEFINE CLASS gripper AS container
ENDPROC
PROCEDURE MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
*!* 30.09.2026 marius.mutu - clickul pe gripper (punctele din mijlocul benzii) porneste si el tragerea splitterului
this.parent.MouseDown(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE MouseLeave
LPARAMETERS nButton, nShift, nXCoord, nYCoord
*!* 30.09.2026 marius.mutu - iesirea de pe gripper direct in afara benzii readuce culoarea splitterului
this.parent.MouseLeave(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE MouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
@@ -297,24 +309,48 @@ DEFINE CLASS gripperdot AS container
this.SetAll('MousePointer', this.MousePointer, 'Shape')
ENDPROC
PROCEDURE MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
*!* 30.09.2026 marius.mutu - clickul pe gripper (punctele din mijlocul benzii) porneste si el tragerea splitterului
this.parent.MouseDown(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE MouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
this.parent.MouseMove(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE ShapeDark.MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
this.parent.MouseDown(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE ShapeDark.MouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
this.parent.MouseMove(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE ShapeLight.MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
this.parent.MouseDown(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE ShapeLight.MouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
this.parent.MouseMove(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE ShapeMiddle.MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
this.parent.MouseDown(nButton, nShift, nXCoord, nYCoord)
ENDPROC
PROCEDURE ShapeMiddle.MouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
@@ -481,6 +517,30 @@ DEFINE CLASS sfsplitter AS control
ENDPROC
PROCEDURE MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
*!* 30.09.2026 marius.mutu - tragerea urmareste cursorul cat timp e apasat butonul: splitterul (control fara fereastra) nu mai primeste MouseMove cand cursorul iese din banda
Local lcPt, lnPozVeche, lnPoz
If m.nButton = 1 And This.Enabled
Declare Integer GetCursorPos In user32 String @
Declare Integer ScreenToClient In user32 Integer, String @
Declare Short GetAsyncKeyState In user32 Integer
Declare Integer GetSystemMetrics In user32 Integer
lnPozVeche = -1
Do While GetAsyncKeyState(Iif(GetSystemMetrics(23) = 0, 1, 2)) < 0
lcPt = Replicate(Chr(0), 8)
GetCursorPos(@lcPt)
ScreenToClient(Thisform.HWnd, @lcPt)
lnPoz = This.GetPosition(Ctobin(Left(m.lcPt, 4), "4RS"), Ctobin(Substr(m.lcPt, 5, 4), "4RS"))
If m.lnPoz # m.lnPozVeche
lnPozVeche = m.lnPoz
This.MoveSplitterToPosition(m.lnPoz)
Endif
DoEvents
Enddo
Endif
ENDPROC
PROCEDURE MouseMove
@@ -693,7 +753,7 @@ DEFINE CLASS sfsplitterh_panou AS sfsplitterh OF "sfsplitter.vcx"
*</DefinedPropArrayMethod>
*<PropValue>
BackColor = 200,215,230
BackColor = 160,185,210
BackStyle = 1
cinicheie =
cinisectiune =
@@ -764,11 +824,11 @@ DEFINE CLASS sfsplitterh_panou AS sfsplitterh OF "sfsplitter.vcx"
LPARAMETERS nButton, nShift, nXCoord, nYCoord
Local loObj
DoDefault(m.nButton, m.nShift, m.nXCoord, m.nYCoord)
* mouse-ul a intrat pe gripper (copil al splitterului): ramane colorat
*!* 30.09.2026 marius.mutu - mouse-ul e inca pe splitter sau pe gripper (si la apelul din gripper.MouseLeave): ramane colorat
loObj = Sys(1270)
Try
Do While Vartype(m.loObj) = 'O'
If Compobj(m.loObj.Parent, This)
If Compobj(m.loObj, This)
Return
Endif
loObj = m.loObj.Parent
@@ -935,7 +995,7 @@ DEFINE CLASS sfsplitterv_panou AS sfsplitterv OF "sfsplitter.vcx"
*</DefinedPropArrayMethod>
*<PropValue>
BackColor = 200,215,230
BackColor = 160,185,210
BackStyle = 1
cinicheie =
cinisectiune =
@@ -1006,11 +1066,11 @@ DEFINE CLASS sfsplitterv_panou AS sfsplitterv OF "sfsplitter.vcx"
LPARAMETERS nButton, nShift, nXCoord, nYCoord
Local loObj
DoDefault(m.nButton, m.nShift, m.nXCoord, m.nYCoord)
* mouse-ul a intrat pe gripper (copil al splitterului): ramane colorat
*!* 30.09.2026 marius.mutu - mouse-ul e inca pe splitter sau pe gripper (si la apelul din gripper.MouseLeave): ramane colorat
loObj = Sys(1270)
Try
Do While Vartype(m.loObj) = 'O'
If Compobj(m.loObj.Parent, This)
If Compobj(m.loObj, This)
Return
Endif
loObj = m.loObj.Parent

View File

@@ -0,0 +1,58 @@
# drv_splitter_mouse.ps1 [-Poz <n>|-] [-Desch <k>] - tragere REALA cu mouse-ul pe splitterul din frm_import_efactura (modal, ca in aplicatie).
# Porneste test_splitter_mouse.prg in mod E; VFP scrie coordN.txt, driverul misca mouse-ul (SetCursorPos + mouse_event).
# -Desch k: formularul se deschide de k ori in aceeasi sesiune VFP (semnalele fiecarei deschideri in sync_mouse\d<i>).
param([string]$Poz = '0', [int]$Desch = 1, [int]$Dx = 0)
$dir = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import'
$syncBaza = Join-Path $dir 'sync_mouse'
$prg = Join-Path $dir 'test_splitter_mouse.prg'
$log = Join-Path $dir 'test_splitter_mouse_log.txt'
New-Item -ItemType Directory -Force $syncBaza | Out-Null
Get-ChildItem $syncBaza -Recurse -File | Remove-Item -Force
foreach ($f in @('test_splitter_mouse.FXP','test_splitter_mouse.ERR','test_splitter_mouse_temp.ini')) { $p = Join-Path $dir $f; if (Test-Path $p) { Remove-Item $p -Force } }
Start-Process powershell -ArgumentList @('-ExecutionPolicy','Bypass','-File','D:\ROA\ROACONT\COMUN\utile\Teste\_precompile.ps1','-Prg',$prg) -Wait -WindowStyle Hidden
if (Test-Path (Join-Path $dir 'test_splitter_mouse.ERR')) { Get-Content (Join-Path $dir 'test_splitter_mouse.ERR'); exit 2 }
Add-Type @"
using System; using System.Runtime.InteropServices;
public class MDrv {
[DllImport("user32.dll")] public static extern bool SetCursorPos(int x,int y);
[DllImport("user32.dll")] public static extern void mouse_event(int f,int x,int y,int d,int e);
[DllImport("user32.dll")] public static extern short GetAsyncKeyState(int v);
[DllImport("user32.dll")] public static extern IntPtr WindowFromPoint(POINT p);
[DllImport("user32.dll")] public static extern IntPtr GetAncestor(IntPtr h,int f);
[StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; }
}
"@
function Asteapta([string]$f, [int]$ms = 20000) { $t = 0; while (-not (Test-Path (Join-Path $sync $f))) { Start-Sleep -Milliseconds 100; $t += 100; if ($t -ge $ms) { return $false } }; return $true }
function Semnal([string]$f) { Set-Content -Path (Join-Path $sync $f) -Value 'ok' }
function Trage([int]$x, [int]$y, [int]$dy) {
[MDrv]::SetCursorPos($x, $y) | Out-Null; [MDrv]::mouse_event(2,0,0,0,0); Start-Sleep -Milliseconds 150
for ($i = 1; $i -le 12; $i++) { [MDrv]::SetCursorPos($x, $y + [int]($dy * $i / 12)) | Out-Null; Start-Sleep -Milliseconds 40 }
Start-Sleep -Milliseconds 100; [MDrv]::mouse_event(4,0,0,0,0); Start-Sleep -Milliseconds 300
}
$p = Start-Process 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -ArgumentList @('-A','-T',"`"$prg`"",$Poz,'E',"$Desch") -WorkingDirectory 'D:\ROA\ROACONT' -PassThru
try {
:deschideri foreach ($d in 1..$Desch) {
$sync = Join-Path $syncBaza "d$d"
New-Item -ItemType Directory -Force $sync | Out-Null
foreach ($n in 1..3) {
if (-not (Asteapta "coord$n.txt" 90000)) { "d$d fara coord$n"; break deschideri }
$c = (Get-Content (Join-Path $sync "coord$n.txt")).Split(','); $x = [int]$c[0] + $Dx; $y = [int]$c[1]; $root = [int64]$c[2]
$pt = New-Object MDrv+POINT; $pt.X = $x; $pt.Y = $y
$sub = [MDrv]::GetAncestor([MDrv]::WindowFromPoint($pt), 2).ToInt64()
if ($sub -ne $root) { "ABANDON: sub punctul $x/$y e fereastra $sub, nu forma $root"; break deschideri }
[MDrv]::SetCursorPos($x, $y + 200) | Out-Null; Start-Sleep -Milliseconds 500
if ($n -eq 1) { Add-Type -AssemblyName System.Drawing; $bmp = New-Object System.Drawing.Bitmap 920, 60; $g = [System.Drawing.Graphics]::FromImage($bmp); $g.CopyFromScreen($x - 35, $y - 30, 0, 0, $bmp.Size); $bmp.Save((Join-Path $dir "splitter_repaus_Poz${Poz}_d$d.png")); $g.Dispose(); $bmp.Dispose() }
Semnal "repaus$n.txt"; if (-not (Asteapta "repausok$n.txt")) { "d$d fara repausok$n"; break deschideri }
if ($n -eq 3) { break }
[MDrv]::SetCursorPos($x, $y) | Out-Null; Start-Sleep -Milliseconds 500
Semnal "hover$n.txt"; if (-not (Asteapta "hoverok$n.txt")) { "d$d fara hoverok$n"; break deschideri }
Trage $x $y $(if ($n -eq 1) { -60 } else { 60 })
Semnal "done$n.txt"
}
}
if (-not $p.WaitForExit(60000)) { $p.Kill(); 'TIMEOUT - proces omorat' }
} finally {
if ([MDrv]::GetAsyncKeyState(1) -lt 0) { [MDrv]::mouse_event(4,0,0,0,0); 'buton stang eliberat' }
if (-not $p.HasExited) { $p.Kill(); 'proces omorat' }
}
Get-Content $log

View File

@@ -225,7 +225,7 @@ distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) nul
loFH.NewObject('splH', 'sfsplitterv_panou', 'D:\ROA\ROACONT\COMUN\clase\sfsplitter.vcx')
lnCol0 = loFH.splH.BackColor
lnSty0 = loFH.splH.BackStyle
DO PrTest WITH 'T9 stare initiala 200,215,230 si BackStyle 1', lnCol0 = RGB(200,215,230) AND lnSty0 = 1
DO PrTest WITH 'T9 stare initiala 160,185,210 si BackStyle 1', lnCol0 = RGB(160,185,210) AND lnSty0 = 1
loFH.splH.MouseEnter()
DO PrTest WITH 'T9 MouseEnter: BackColor albastru, BackStyle 1', loFH.splH.BackColor = RGB(0,120,215) AND loFH.splH.BackStyle = 1
loFH.splH.MouseLeave()

View File

@@ -0,0 +1,448 @@
* test_splitter_mouse.prg - tragere REALA cu mouse-ul (SetCursorPos/mouse_event) pe Sfsplitterv1 din frm_import_efactura
* param tcPoz: pozitia pusa in ini-ul temporar inainte de deschidere (gol = fara cheie)
* param tcDesch (mod E): de cate ori se deschide formularul in aceeasi sesiune (implicit 1)
PARAMETERS tcPoz, tcMod, tcDesch
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail, gcTempIni, gnRepaus, gnDesch
gnRepaus = RGB(160,185,210)
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_splitter_mouse_log.txt"
gcTempIni = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_splitter_mouse_temp.ini"
gnPass = 0
gnFail = 0
IF FILE(gcTempIni)
DELETE FILE (gcTempIni)
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
gcGeneralIniFile = m.gcTempIni
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle) + ' gcGeneralIniFile=' + m.gcGeneralIniFile
*-- crsFacturi/crsDetaliiFacturi si cursoarele ajutatoare cerute de Init, copie din test_pozitie_lista_ef.prg
TEXT TO lcSchemaFacturi NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, explicatia4ROA V(100) null, explicatia5ROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(80), gest c(1), part_inactiv N(1)
ENDTEXT
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
CREATE CURSOR crsFacturi (&lcSchemaFacturi)
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot, de_completat, gest) ;
VALUES (0, 1, 0, DATE(), 'TEST-SPL-1', 'FIXTURA SPLITTER 1', 'FIXTURA SPLITTER 1', 'RO99970001', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0, '1 cont', '')
TEXT TO lcSchemaDetalii NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6), explicatia V(100), explicatia4 V(100), explicatia5 V(100)
ENDTEXT
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
CREATE CURSOR crsDetaliiFacturi (&lcSchemaDetalii)
* rand mut pe id_efactura=1, ca actualizeaza_grid2 sa gaseasca detaliile deja in cursor (fara poFacturiDetalii/Oracle)
INSERT INTO crsDetaliiFacturi (id, id_efactura, nr, articol) VALUES (100, 1, 1, 'FIXTURA')
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX ON ordine TAG ordine
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX ON ordine TAG ordine
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX ON id TAG id
goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX ON id_gestiune TAG id_gest
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX ON cod_um_iso TAG cod_um_iso
goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX ON id TAG id
IF VARTYPE(m.tcPoz) = "C" AND !EMPTY(m.tcPoz) AND m.tcPoz # "-" AND m.tcPoz # "0"
setini(m.gcTempIni, 'efactura', 'import_splitter_top', m.tcPoz)
DO PrLogLocal WITH 'ini temporar: import_splitter_top=' + m.tcPoz
ENDIF
DECLARE INTEGER SetCursorPos IN user32 INTEGER, INTEGER
DECLARE mouse_event IN user32 INTEGER, INTEGER, INTEGER, INTEGER, INTEGER
DECLARE INTEGER ClientToScreen IN user32 INTEGER, STRING @
DECLARE INTEGER WindowFromPoint IN user32 INTEGER, INTEGER
DECLARE INTEGER GetAncestor IN user32 INTEGER, INTEGER
DECLARE INTEGER GetDC IN user32 INTEGER
DECLARE INTEGER ReleaseDC IN user32 INTEGER, INTEGER
DECLARE INTEGER GetPixel IN gdi32 INTEGER, INTEGER, INTEGER
DECLARE INTEGER SetWindowPos IN user32 INTEGER, INTEGER, INTEGER, INTEGER, INTEGER, INTEGER, INTEGER
DECLARE INTEGER SetForegroundWindow IN user32 INTEGER
DECLARE Sleep IN kernel32 INTEGER
DECLARE INTEGER GetSystemMetrics IN user32 INTEGER
DECLARE INTEGER GetCursorPos IN user32 STRING @
DECLARE INTEGER GetForegroundWindow IN user32
PUBLIC goSpy, goFrmT
LOCAL loForm, loS, lnX, lnY, lnTop0, lnTop1, lnI, lnStep, lcPt, lnPix, lnRoot, lnGrdH0, lnY0
_SCREEN.Visible = .T.
_SCREEN.WindowState = 2
SetWindowPos(_SCREEN.HWnd, -1, 0, 0, 0, 0, 3)
SetForegroundWindow(_SCREEN.HWnd)
PUBLIC gcSyncDir
LOCAL lnNrDesch
lnNrDesch = IIF(VARTYPE(m.tcDesch) = "C" AND VAL(m.tcDesch) > 1, VAL(m.tcDesch), 1)
FOR gnDesch = 1 TO m.lnNrDesch
DO PrLogLocal WITH '=== deschiderea ' + TRANSFORM(gnDesch) + ' ini: import_splitter_top=' + TRANSFORM(getini(m.gcTempIni, 'efactura', 'import_splitter_top'))
SELECT crsFacturi
GO TOP
loForm = CREATEOBJECT('frm_import_efactura', .T.)
goFrmT = loForm
IF VARTYPE(m.tcMod) # "C" OR m.tcMod # "M"
loForm.WindowType = 0
ENDIF
loS = loForm.Sfsplitterv1
DO PrLogLocal WITH 'ClassLibrary=' + loS.ClassLibrary + ' Class=' + loS.Class
DO PrLogLocal WITH 'dupa Init: BackColor=' + RgbTxt(loS.BackColor) + ' BackStyle=' + TRANSFORM(loS.BackStyle) + ' Enabled=' + TRANSFORM(loS.Enabled) + ' Visible=' + TRANSFORM(loS.Visible) + ' H=' + TRANSFORM(loS.Height)
goSpy = CREATEOBJECT('spionMouse')
BINDEVENT(loS, 'MouseDown', goSpy, 'splDown')
BINDEVENT(loS, 'MouseMove', goSpy, 'splMove')
BINDEVENT(loS, 'MouseUp', goSpy, 'splUp')
DO PrLogLocal WITH 'ControlCount=' + TRANSFORM(loS.ControlCount) + ' PEM gripper=' + TRANSFORM(PEMSTATUS(loS, 'gripper', 5))
BINDEVENT(loForm, 'MouseDown', goSpy, 'frmDown')
BINDEVENT(loForm, 'MouseMove', goSpy, 'frmMove')
BINDEVENT(loForm.grdFacturi, 'MouseDown', goSpy, 'grdDown')
PUBLIC gnTopFinal, goTmr
gnTopFinal = -1
IF VARTYPE(m.tcMod) = "C" AND m.tcMod = "E"
gcSyncDir = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\sync_mouse\d" + TRANSFORM(gnDesch) + "\"
IF !DIRECTORY(m.gcSyncDir)
MD (m.gcSyncDir)
ENDIF
goTmr = CREATEOBJECT("tmrExtern")
goTmr.Enabled = .T.
loS = .NULL.
loForm.Show(1)
ELSE
IF VARTYPE(m.tcMod) = "C" AND m.tcMod = "M"
goTmr = CREATEOBJECT("tmrSecventa")
goTmr.Enabled = .T.
loS = .NULL.
loForm.Show(1)
ELSE
loForm.Show()
DO SecventaMouse
loS = .NULL.
goFrmT = .NULL.
loForm.Release()
ENDIF
ENDIF
lnTop1 = gnTopFinal
goFrmT = .NULL.
loForm = .NULL.
goTmr = .NULL.
DO PrLogLocal WITH 'ini dupa inchidere: import_splitter_top=' + TRANSFORM(getini(m.gcTempIni, 'efactura', 'import_splitter_top')) + ' (Top la inchidere=' + TRANSFORM(lnTop1) + ')'
ENDFOR
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE ' + TRANSFORM(loEx.ErrorNo) + ' ' + loEx.Message + ' linia ' + TRANSFORM(loEx.LineNo) + ' ' + TRANSFORM(loEx.LineContents)
ENDTRY
DO PrLogLocal WITH 'PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO PrLogLocal WITH 'END'
ON SHUTDOWN
QUIT
PROCEDURE SecventaMouse
LOCAL loForm, loS, lnX, lnY, lnTop0, lnTop1, lnI, lnStep, lcPt, lnPix, lnRoot, lnGrdH0, lnY0
loForm = goFrmT
loS = loForm.Sfsplitterv1
DO PrLogLocal WITH 'WindowState=' + TRANSFORM(loForm.WindowState) + ' WindowType=' + TRANSFORM(loForm.WindowType) + ' lRestaurat=' + TRANSFORM(loS.lRestaurat)
Pump(25)
DO PrLogLocal WITH 'dupa Show: BackColor=' + RgbTxt(loS.BackColor) + ' BackStyle=' + TRANSFORM(loS.BackStyle) + ' Top=' + TRANSFORM(loS.Top) + ' grdF.H=' + TRANSFORM(loForm.grdFacturi.Height)
lcPt = BINTOC(loS.Left + 30, '4RS') + BINTOC(loS.Top + 2, '4RS')
ClientToScreen(loForm.HWnd, @lcPt)
lnX = CTOBIN(LEFT(lcPt, 4), '4RS')
lnY = CTOBIN(SUBSTR(lcPt, 5, 4), '4RS')
lnY0 = lnY
lnRoot = GetAncestor(WindowFromPoint(lnX, lnY), 2)
DO PrLogLocal WITH 'ecran X/Y=' + TRANSFORM(lnX) + '/' + TRANSFORM(lnY) + ' root sub punct=' + TRANSFORM(lnRoot) + ' _screen=' + TRANSFORM(_SCREEN.HWnd) + ' form=' + TRANSFORM(loForm.HWnd) + ' rootform=' + TRANSFORM(GetAncestor(loForm.HWnd, 2))
IF lnRoot # _SCREEN.HWnd AND lnRoot # GetAncestor(loForm.HWnd, 2)
DO PrTest WITH 'fereastra VFP sub punctul de tragere', .F., 'abandon, nu trimit click pe alta fereastra'
ELSE
SetCursorPos(lnX, lnY + 150)
Pump(10)
lnPix = PixelEcran(lnX, lnY)
DO PrLogLocal WITH 'repaus: pixel ecran=' + RgbTxt(lnPix) + ' BackColor=' + RgbTxt(loS.BackColor) + ' BackStyle=' + TRANSFORM(loS.BackStyle) + ' lHover=' + TRANSFORM(loS.lHover)
DO PrTest WITH 'repaus: pixel = 160,185,210', lnPix = gnRepaus, RgbTxt(lnPix)
lnI = SetCursorPos(lnX, lnY)
lcPt = REPLICATE(CHR(0), 8)
GetCursorPos(@lcPt)
DO PrLogLocal WITH 'SetCursorPos=' + TRANSFORM(lnI) + ' imediat=' + TRANSFORM(CTOBIN(LEFT(lcPt, 4), '4RS')) + '/' + TRANSFORM(CTOBIN(SUBSTR(lcPt, 5, 4), '4RS'))
Pump(10)
lcPt = REPLICATE(CHR(0), 8)
GetCursorPos(@lcPt)
DO PrLogLocal WITH 'cursor real=' + TRANSFORM(CTOBIN(LEFT(lcPt, 4), '4RS')) + '/' + TRANSFORM(CTOBIN(SUBSTR(lcPt, 5, 4), '4RS')) + ' foreground=' + TRANSFORM(GetForegroundWindow())
lnPix = PixelEcran(lnX, lnY - 1)
DO PrLogLocal WITH 'hover: pixel ecran=' + RgbTxt(lnPix) + ' BackColor=' + RgbTxt(loS.BackColor) + ' lHover=' + TRANSFORM(loS.lHover)
DO PrTest WITH 'hover: BackColor = 0,120,215', loS.BackColor = RGB(0,120,215), RgbTxt(loS.BackColor)
lnTop0 = loS.Top
lnGrdH0 = loForm.grdFacturi.Height
SetCursorPos(lnX, lnY)
mouse_event(2, 0, 0, 0, 0)
Pump(5)
FOR lnStep = 1 TO 12
SetCursorPos(lnX, lnY - 5 * lnStep)
Pump(3)
ENDFOR
SetCursorPos(lnX, lnY - 60)
mouse_event(4, 0, 0, 0, 0)
Pump(10)
lnTop1 = loS.Top
DO PrLogLocal WITH 'tragere sus 60: Top ' + TRANSFORM(lnTop0) + ' -> ' + TRANSFORM(lnTop1) + ' grdF.H ' + TRANSFORM(lnGrdH0) + ' -> ' + TRANSFORM(loForm.grdFacturi.Height) + ' | ' + goSpy.cRez
DO PrTest WITH 'tragere sus 60 muta splitterul (+-5, pozitia = cursorul)', lnTop1 = lnTop0 - 60, 'Top ' + TRANSFORM(lnTop0) + '->' + TRANSFORM(lnTop1)
DO PrTest WITH 'tragere sus: grila urmeaza splitterul', loForm.grdFacturi.Height = lnGrdH0 - 60, 'grdF.H ' + TRANSFORM(lnGrdH0) + '->' + TRANSFORM(loForm.grdFacturi.Height)
goSpy.cRez = ''
lcPt = BINTOC(loS.Left + 30, '4RS') + BINTOC(loS.Top + 2, '4RS')
ClientToScreen(loForm.HWnd, @lcPt)
lnY = CTOBIN(SUBSTR(lcPt, 5, 4), '4RS')
SetCursorPos(lnX, lnY)
Pump(5)
lnTop0 = loS.Top
SetCursorPos(lnX, lnY)
mouse_event(2, 0, 0, 0, 0)
Pump(5)
FOR lnStep = 1 TO 12
SetCursorPos(lnX, lnY + 5 * lnStep)
Pump(3)
ENDFOR
SetCursorPos(lnX, lnY + 60)
mouse_event(4, 0, 0, 0, 0)
Pump(10)
DO PrLogLocal WITH 'tragere jos 60: Top ' + TRANSFORM(lnTop0) + ' -> ' + TRANSFORM(loS.Top) + ' | ' + goSpy.cRez
DO PrTest WITH 'tragere jos 60 muta splitterul (+-5, pozitia = cursorul)', loS.Top = lnTop0 + 60, 'Top ' + TRANSFORM(lnTop0) + '->' + TRANSFORM(loS.Top)
SetCursorPos(lnX, lnY + 250)
Pump(10)
lnPix = PixelEcran(lnX, lnY + 60)
DO PrLogLocal WITH 'repaus dupa tragere: pixel=' + RgbTxt(lnPix) + ' BackColor=' + RgbTxt(loS.BackColor) + ' lHover=' + TRANSFORM(loS.lHover)
DO PrTest WITH 'repaus dupa tragere: BackColor = 160,185,210', loS.BackColor = gnRepaus, RgbTxt(loS.BackColor)
ENDIF
gnTopFinal = loS.Top
ENDPROC
DEFINE CLASS tmrSecventa AS Timer
Interval = 1500
Enabled = .F.
PROCEDURE Timer
This.Enabled = .F.
DO SecventaMouse
goFrmT.Release()
ENDPROC
ENDDEFINE
**********************************************************
PROCEDURE Pump
LPARAMETERS tnN
LOCAL lnK
FOR lnK = 1 TO tnN
DOEVENTS FORCE
Sleep(20)
ENDFOR
ENDPROC
PROCEDURE PixelEcran
LPARAMETERS tnX, tnY
LOCAL lnDC, lnP
lnDC = GetDC(0)
lnP = GetPixel(lnDC, tnX, tnY)
ReleaseDC(0, lnDC)
RETURN lnP
ENDPROC
PROCEDURE RgbTxt
LPARAMETERS tnC
RETURN TRANSFORM(BITAND(tnC, 255)) + ',' + TRANSFORM(BITAND(BITRSHIFT(tnC, 8), 255)) + ',' + TRANSFORM(BITAND(BITRSHIFT(tnC, 16), 255))
ENDPROC
DEFINE CLASS spionMouse AS Custom
cRez = ''
PROCEDURE Adauga
LPARAMETERS tcS
IF LEN(This.cRez) < 1500
This.cRez = This.cRez + tcS + '; '
ENDIF
ENDPROC
PROCEDURE splDown
LPARAMETERS nB, nS, nX, nY
This.Adauga('splDown b=' + TRANSFORM(nB) + ' y=' + TRANSFORM(nY))
ENDPROC
PROCEDURE splMove
LPARAMETERS nB, nS, nX, nY
IF nB # 0
This.Adauga('splMove b=' + TRANSFORM(nB) + ' y=' + TRANSFORM(nY) + ' top=' + TRANSFORM(goFrmT.Sfsplitterv1.Top))
ENDIF
ENDPROC
PROCEDURE splUp
LPARAMETERS nB, nS, nX, nY
This.Adauga('splUp y=' + TRANSFORM(nY))
ENDPROC
PROCEDURE gripDown
LPARAMETERS nB, nS, nX, nY
This.Adauga('gripDown')
ENDPROC
PROCEDURE frmDown
LPARAMETERS nB, nS, nX, nY
This.Adauga('frmDown y=' + TRANSFORM(nY))
ENDPROC
PROCEDURE frmMove
LPARAMETERS nB, nS, nX, nY
IF nB = 1
This.Adauga('frmMove b=1 y=' + TRANSFORM(nY))
ENDIF
ENDPROC
PROCEDURE grdDown
LPARAMETERS nB, nS, nX, nY
This.Adauga('grdDown y=' + TRANSFORM(nY))
ENDPROC
ENDDEFINE
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
* mock_amessagebox.prg cere HarnessLog (definit normal in ui_harness.prg, neincarcat aici)
PROCEDURE HarnessLog
LPARAMETERS tcMsg
DO PrLogLocal WITH tcMsg
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + tcEticheta + ': ' + IIF(tlOk, 'OK', 'FAIL') + IIF(EMPTY(NVL(m.tcDetalii,'')), '', ' (' + m.tcDetalii + ')')
ENDPROC
PROCEDURE MouseReal
LPARAMETERS tnFlags, tnX, tnY
* eveniment mouse real, cu pozitia absoluta in eveniment (nu depinde de cursorul curent)
mouse_event(tnFlags, INT(tnX * 65535 / (GetSystemMetrics(0) - 1)), INT(tnY * 65535 / (GetSystemMetrics(1) - 1)), 0, 0)
ENDPROC
**********************************************************
* mod E: forma modala Show(1) ca in import_efactura.prg; mouse-ul real il trimite driverul PowerShell
* (drv_splitter_mouse.ps1). Schimb de semnale prin fisiere in gcSyncDir: coordN.txt (VFP->PS), doneN.txt (PS->VFP).
DEFINE CLASS tmrExtern AS Timer
Interval = 300
Enabled = .F.
nPas = 0
nTop0 = 0
nGrdH0 = 0
nTic = 0
PROCEDURE Timer
LOCAL loF, loS, lcPt, lnX, lnY, lnPix
This.nTic = This.nTic + 1
loF = goFrmT
loS = loF.Sfsplitterv1
DO CASE
CASE This.nPas = 0 AND This.nTic >= 5
DO PrLogLocal WITH 'Enabled=' + TRANSFORM(loS.Enabled) + ' Tag=' + TRANSFORM(loS.Tag) + ' HWnd=' + TRANSFORM(loF.HWnd) + ' lHover=' + TRANSFORM(loS.lHover)
DO PrLogLocal WITH 'WindowState=' + TRANSFORM(loF.WindowState) + ' lRestaurat=' + TRANSFORM(loS.lRestaurat) + ' Top=' + TRANSFORM(loS.Top) + ' grdF.H=' + TRANSFORM(loF.grdFacturi.Height) + ' det.Top/H=' + TRANSFORM(loF.grdDetaliiFacturi.Top) + '/' + TRANSFORM(loF.grdDetaliiFacturi.Height) + ' SM=' + TRANSFORM(GetSystemMetrics(0)) + 'x' + TRANSFORM(GetSystemMetrics(1))
This.ScrieCoord(1)
This.nPas = 1
CASE INLIST(This.nPas, 1, 2, 3) AND FILE(gcSyncDir + 'repaus' + TRANSFORM(This.nPas) + '.txt')
* PS a mutat cursorul departe: culoarea de repaus
DELETE FILE (gcSyncDir + 'repaus' + TRANSFORM(This.nPas) + '.txt')
lnPix = PixelEcran(This.Tag_X(), This.Tag_Y())
DO PrLogLocal WITH 'repaus' + TRANSFORM(This.nPas) + ': pixel=' + RgbTxt(lnPix) + ' BackColor=' + RgbTxt(loS.BackColor) + ' BackStyle=' + TRANSFORM(loS.BackStyle) + ' lHover=' + TRANSFORM(loS.lHover)
DO PrTest WITH 'repaus' + TRANSFORM(This.nPas) + ': pixel pe banda = 160,185,210', lnPix = gnRepaus, RgbTxt(lnPix)
STRTOFILE('ok', gcSyncDir + 'repausok' + TRANSFORM(This.nPas) + '.txt')
CASE INLIST(This.nPas, 1, 2) AND FILE(gcSyncDir + 'hover' + TRANSFORM(This.nPas) + '.txt')
DELETE FILE (gcSyncDir + 'hover' + TRANSFORM(This.nPas) + '.txt')
DO PrLogLocal WITH 'hover' + TRANSFORM(This.nPas) + ': pixel=' + RgbTxt(PixelEcran(This.Tag_X(), This.Tag_Y())) + ' BackColor=' + RgbTxt(loS.BackColor) + ' lHover=' + TRANSFORM(loS.lHover)
IF This.nPas = 1
DO PrTest WITH 'hover: BackColor = 0,120,215', loS.BackColor = RGB(0,120,215), RgbTxt(loS.BackColor)
ENDIF
This.nTop0 = loS.Top
This.nGrdH0 = loF.grdFacturi.Height
goSpy.cRez = ''
STRTOFILE('ok', gcSyncDir + 'hoverok' + TRANSFORM(This.nPas) + '.txt')
CASE This.nPas = 1 AND FILE(gcSyncDir + 'done1.txt')
DO PrLogLocal WITH 'tragere sus 60: Top ' + TRANSFORM(This.nTop0) + ' -> ' + TRANSFORM(loS.Top) + ' grdF.H ' + TRANSFORM(This.nGrdH0) + ' -> ' + TRANSFORM(loF.grdFacturi.Height) + ' | ' + goSpy.cRez
DO PrTest WITH 'tragere sus 60 muta splitterul (+-5, pozitia = cursorul)', ABS(loS.Top - (This.nTop0 - 60)) <= 5, 'Top ' + TRANSFORM(This.nTop0) + '->' + TRANSFORM(loS.Top)
DO PrTest WITH 'tragere sus: grila urmeaza splitterul', loF.grdFacturi.Height - This.nGrdH0 = loS.Top - This.nTop0, 'grdF.H ' + TRANSFORM(This.nGrdH0) + '->' + TRANSFORM(loF.grdFacturi.Height)
This.ScrieCoord(2)
This.nPas = 2
CASE This.nPas = 2 AND FILE(gcSyncDir + 'done2.txt')
DO PrLogLocal WITH 'tragere jos 60: Top ' + TRANSFORM(This.nTop0) + ' -> ' + TRANSFORM(loS.Top) + ' | ' + goSpy.cRez
DO PrTest WITH 'tragere jos 60 muta splitterul (+-5, pozitia = cursorul)', ABS(loS.Top - (This.nTop0 + 60)) <= 5, 'Top ' + TRANSFORM(This.nTop0) + '->' + TRANSFORM(loS.Top)
This.ScrieCoord(3)
This.nPas = 3
CASE This.nPas = 3 AND FILE(gcSyncDir + 'repausok3.txt')
gnTopFinal = loS.Top
This.Enabled = .F.
loS = .NULL.
loF = .NULL.
goFrmT.Release()
ENDCASE
ENDPROC
PROCEDURE ScrieCoord
LPARAMETERS tnN
LOCAL lcPt, loS
loS = goFrmT.Sfsplitterv1
lcPt = BINTOC(loS.Left + 30, '4RS') + BINTOC(loS.Top + 2, '4RS')
ClientToScreen(goFrmT.HWnd, @lcPt)
This.Tag = TRANSFORM(CTOBIN(LEFT(lcPt, 4), '4RS')) + ',' + TRANSFORM(CTOBIN(SUBSTR(lcPt, 5, 4), '4RS'))
DO PrLogLocal WITH 'coord' + TRANSFORM(tnN) + '=' + This.Tag + ' root sub punct=' + TRANSFORM(GetAncestor(WindowFromPoint(VAL(GETWORDNUM(This.Tag, 1, ',')), VAL(GETWORDNUM(This.Tag, 2, ','))), 2)) + ' rootform=' + TRANSFORM(GetAncestor(goFrmT.HWnd, 2))
STRTOFILE(This.Tag + ',' + TRANSFORM(GetAncestor(goFrmT.HWnd, 2)), gcSyncDir + 'coord' + TRANSFORM(tnN) + '.txt')
ENDPROC
PROCEDURE Tag_X
RETURN VAL(GETWORDNUM(This.Tag, 1, ','))
ENDPROC
PROCEDURE Tag_Y
RETURN VAL(GETWORDNUM(This.Tag, 2, ','))
ENDPROC
ENDDEFINE