* test_splitter_h.prg * sfsplitterh_panou (sfsplitter.vcx), splitter orizontal (vertical ca linie) intre Object1 (stanga) si Object2 (dreapta). * Forma sintetica fara DB: edtStanga (Left < splitter, neatins), edt1 = Object1, spl, edt2 = Object2, edtDreapta (Left >= marginea dreapta a splitterului). * T1 MoveSplitterToPosition(+delta): splitter, Object1.Width, Object2.Left cu marginea dreapta neschimbata, control din dreapta mutat, cel din stanga neatins. * T2 clamp la nObject1MinSize / nObject2MinSize. T3 Save/RestorePosition prin .ini temporar (gcGeneralIniFile). * * Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_splitter_h.prg" * Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_splitter_h_log.txt SET SAFETY OFF SET TALK OFF SET DELETED ON SET EXACT ON CLOSE DATABASES PUBLIC gcUILog, gnPass, gnFail, gcTempIni, gcGeneralIniFile gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_splitter_h_log.txt" gcTempIni = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_splitter_h_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\programe\ini.prg' ADDITIVE SET CLASSLIB TO 'D:\ROA\ROACONT\COMUN\clase\sfsplitter.vcx' ADDITIVE gcGeneralIniFile = m.gcTempIni LOCAL loF, loF2, lnLeft0, lnDreaptaMargine0, lnRight0, lnStang0, lnW10, lnPoz *=== T1: MoveSplitterToPosition(+40) === loF = PrMkForm() DO PrTest WITH 'formular instantiat, clasa sfsplitterh_panou', TYPE('loF') == 'O' AND LOWER(loF.spl.Class) == 'sfsplitterh_panou' lnLeft0 = loF.spl.Left lnW10 = loF.edt1.Width lnDreaptaMargine0 = loF.edt2.Left + loF.edt2.Width lnRight0 = loF.edtDreapta.Left lnStang0 = loF.edtStanga.Left loF.spl.MoveSplitterToPosition(lnLeft0 + 40) DO PrTest WITH 'T1 splitter.Left +40', loF.spl.Left = lnLeft0 + 40, 'obtinut=' + TRANSFORM(loF.spl.Left) DO PrTest WITH 'T1 Object1.Width +40', loF.edt1.Width = lnW10 + 40, 'obtinut=' + TRANSFORM(loF.edt1.Width) DO PrTest WITH 'T1 Object1.Left neschimbat', loF.edt1.Left = 100, 'obtinut=' + TRANSFORM(loF.edt1.Left) DO PrTest WITH 'T1 Object2.Left +40', loF.edt2.Left = 405 + 40, 'obtinut=' + TRANSFORM(loF.edt2.Left) DO PrTest WITH 'T1 marginea dreapta Object2 neschimbata', loF.edt2.Left + loF.edt2.Width = lnDreaptaMargine0, 'obtinut=' + TRANSFORM(loF.edt2.Left + loF.edt2.Width) DO PrTest WITH 'T1 control din dreapta mutat +40', loF.edtDreapta.Left = lnRight0 + 40, 'obtinut=' + TRANSFORM(loF.edtDreapta.Left) DO PrTest WITH 'T1 control din stanga neatins', loF.edtStanga.Left = lnStang0, 'obtinut=' + TRANSFORM(loF.edtStanga.Left) DO PrTest WITH 'T1 Anchor-urile restaurate', loF.edt2.Anchor = 13 AND loF.edtDreapta.Anchor = 13 AND loF.spl.Anchor = 13, ; 'edt2=' + TRANSFORM(loF.edt2.Anchor) + ' dreapta=' + TRANSFORM(loF.edtDreapta.Anchor) + ' spl=' + TRANSFORM(loF.spl.Anchor) *=== T1b: mutare inapoi (-40) readuce layout-ul === loF.spl.MoveSplitterToPosition(lnLeft0) DO PrTest WITH 'T1b revenire: splitter, Object1.Width, Object2.Left', loF.spl.Left = lnLeft0 AND loF.edt1.Width = lnW10 AND loF.edt2.Left = 405 *=== T2: clamp === loF.spl.MoveSplitterToPosition(9999) DO PrTest WITH 'T2 clamp dreapta: Object2.Width = nObject2MinSize', loF.edt2.Width = loF.spl.nObject2MinSize, 'obtinut=' + TRANSFORM(loF.edt2.Width) DO PrTest WITH 'T2 clamp dreapta: marginea Object2 neschimbata', loF.edt2.Left + loF.edt2.Width = lnDreaptaMargine0 loF.spl.MoveSplitterToPosition(0) DO PrTest WITH 'T2 clamp stanga: Object1.Width = nObject1MinSize', loF.edt1.Width = loF.spl.nObject1MinSize, 'obtinut=' + TRANSFORM(loF.edt1.Width) *=== T4: Resize pe Object1 il realiniaza la splitter loF.spl.RestorePosition() loF.edt1.Width = 30 DO PrTest WITH 'T4 Resize Object1 -> lipit de splitter', loF.edt1.Left + loF.edt1.Width = loF.spl.Left, 'obtinut=' + TRANSFORM(loF.edt1.Left + loF.edt1.Width) + ' spl=' + TRANSFORM(loF.spl.Left) loF.Release() *=== T3: persistenta === loF = PrMkForm() loF.spl.cIniSectiune = 'test' loF.spl.cIniCheie = 'poz' loF.spl.SavePosition() DO PrTest WITH 'T3 SavePosition inainte de RestorePosition nu scrie', !FILE(gcTempIni) loF.spl.RestorePosition() DO PrTest WITH 'T3 fara cheie in ini: pozitia de design neschimbata', loF.spl.Left = 400 AND loF.spl.lRestaurat, 'obtinut=' + TRANSFORM(loF.spl.Left) loF.spl.SavePosition() DO PrTest WITH 'T3 forma nemutata nu scrie in ini', !FILE(gcTempIni) loF.spl.MoveSplitterToPosition(loF.spl.Left + 40) loF.spl.SavePosition() lnPoz = VAL(NVL(getini(gcTempIni, 'test', 'poz'), '')) DO PrTest WITH 'T3 dupa mutare SavePosition scrie 440', lnPoz = 440, 'obtinut=' + TRANSFORM(lnPoz) loF.Release() loF2 = PrMkForm() loF2.spl.cIniSectiune = 'test' loF2.spl.cIniCheie = 'poz' loF2.spl.RestorePosition() DO PrTest WITH 'T3 forma noua restaureaza 440', loF2.spl.Left = 440, 'obtinut=' + TRANSFORM(loF2.spl.Left) DO PrTest WITH 'T3 Object1.Width si Object2.Left urmeaza', loF2.edt1.Width = 340 AND loF2.edt2.Left = 445 DELETE FILE (gcTempIni) loF2.spl.SavePosition() DO PrTest WITH 'T3 forma restaurata si nemutata nu rescrie ini', !FILE(gcTempIni) loF2.Release() IF FILE(gcTempIni) DELETE FILE (gcTempIni) ENDIF LOCAL loFH, lnCol0, lnSty0 loFH = CREATEOBJECT('Form') loFH.AddObject('splH', 'sfsplitterh_panou') 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 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() DO PrTest WITH 'T9 MouseLeave: valorile initiale', loFH.splH.BackColor = lnCol0 AND loFH.splH.BackStyle = lnSty0 loFH.Release() DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie' CATCH TO loEx DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure TRY IF FILE(gcTempIni) DELETE FILE (gcTempIni) ENDIF CATCH ENDTRY ENDTRY QUIT ********************************************************** * Object1 = edt1 (100..400), splitter 400..405, Object2 = edt2 (405..705), edtDreapta la 720, edtStanga la 10 FUNCTION PrMkForm LOCAL loF loF = CREATEOBJECT('Form') loF.WindowType = 0 loF.Width = 800 loF.Height = 300 loF.AddObject('edtStanga', 'EditBox') loF.AddObject('edt1', 'Container') loF.AddObject('spl', 'sfsplitterh_panou') loF.AddObject('edt2', 'EditBox') loF.AddObject('edtDreapta', 'EditBox') loF.edtStanga.Move(10, 10, 60, 100) loF.edt1.Move(100, 10, 300, 100) loF.spl.Move(400, 10, 5, 100) loF.edt2.Move(405, 10, 300, 100) loF.edtDreapta.Move(720, 10, 50, 100) loF.edtStanga.Visible = .T. loF.edt1.Visible = .T. loF.spl.Visible = .T. loF.edt2.Visible = .T. loF.edtDreapta.Visible = .T. loF.edtStanga.Anchor = 13 loF.edt1.Anchor = 13 loF.edt2.Anchor = 13 loF.edtDreapta.Anchor = 13 loF.spl.Anchor = 13 loF.spl.cObject1Name = 'edt1' loF.spl.cObject2Name = 'edt2' loF.spl.nObject1MinSize = 100 loF.spl.nObject2MinSize = 80 RETURN loF ENDFUNC ********************************************************** 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 PrLogLocal LPARAMETERS tcMsg LOCAL lcL SET SAFETY OFF lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog) ENDPROC ********************************************************** PROCEDURE PrErrLocal LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo) ENDPROC