Basic Univers
; Author : Hardy


; Mode opératoire :
; Tu lance le code, tu prend un cliché du registre, que tu sauve avec le nom de "test"
; tu vas activer (ou désactiver l'ecran de veille) , cela va modifier le registre Very Happy
; tu reprend un deuxième cliché en donnant un autre nom "test2" par ex
; tu les sélectionnent, puis tu fait compare, ça va te sortir les différence entre les deux prise de vue Very Happy


Global Path.s, nbimage, comparaison.b, aa, bb, *memoire1, *memoire2, titre.s
Path = Space(255)
GetModuleFileName_(0, @Path, 255)

While Right(Path, 1)<>"\"
    Path = Left(Path, Len(Path)- 1)
Wend

CreateDirectory(Path +"clichés")

; path = "c:\surveillance\"

;-A MODIFIER--------------- ainsi que le la fin (label Berlioz)

; LoadImage(0,Path+"berlioz.ico")

Global amem, amem2, count2, lim, zero.b


;----------------déclarations ---------------------
Structure m
    adresse1.l
    adresse2.l
   
    type.b
EndStructure
Global Dim modif.m(5000)
Global nmodif
Global Dim charge.b(5000)

Declare cliche()
Declare suppression()
Declare sauver()
Declare refresh()
Declare modifications()
Declare details(i)


 
;--------------- Lecture config---------------------
Global Dim image.s(200)
Global Dim temps.s(200)
nbimage = 0
If ReadFile(0, Path +"breg.cfg")
    Repeat
        nbimage + 1
        image(nbimage)= ReadString(0)
        temps(nbimage)= ReadString(0)
        If image(nbimage)="": nbimage - 1: EndIf
    Until Eof(0) Or nbimage = 199
    CloseFile(0)
EndIf


;--------------Main------------------------
start = 1 : run = 1

Global win
h = OpenProcess_($1F0FFF, 0, GetCurrentProcessId_())
SetPriorityClass_(h, #HIGH_PRIORITY_CLASS)
CloseHandle_(h)

titre.s = "Suivi du registre"
win.l = OpenWindow(0, 0, 0, 530, 380, titre, #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
If win = 0: End: EndIf
Couleur = GetSysColor_(#COLOR_3DFACE)

CreateGadgetList(win)
CreateImage(2, 167, 60)
LoadFont(0, "Times New Roman", 12, #PB_Font_Italic|#PB_Font_HighQuality)
StartDrawing(ImageOutput(2))
Box(0, 0, 167, 60, Couleur)
FrontColor(RGB($D6, $B5, $29))
DrawingMode(1)

DrawingFont(FontID(0))
DrawText(0, 0, "Suivi registre v 1.0")
DrawText(0, 18, "Pascal Tonnelier")
DrawText(0, 36, "12/2004")
StopDrawing()
FreeFont(0)
ImageGadget(99, 355, 290, 167, 60, ImageID(2))
; Image = CatchImage(1, ?Berlioz)
; StartDrawing(ImageOutput(1))
; DrawingMode(4)
; FrontColor(RGB($D6,$B5,$29))
; Box(0,0,167,251)
; Box(1,1,165,249)
; Box(2,2,163,247)
; StopDrawing()
ImageGadget(100, 355, 30, 167, 250, Image)

ListIconGadget(1, 0, 10, 343, 330, "Clichés registre", 400, #PB_ListIcon_FullRowSelect|#PB_ListIcon_CheckBoxes|#PB_ListIcon_AlwaysShowSelection)
ButtonGadget(2, 10, 350, 100, 20, "Prendre un cliché")
ButtonGadget(3, 120, 350, 120, 20, "Comparer deux clichés")
ButtonGadget(4, 260, 350, 60, 20, "Effacer")

refresh()

run = 1
SetWindowText_(win, @titre)
HideWindow(0, 1)
; AddSysTrayIcon(0,win,ImageID(0))
; SysTrayIconToolTip(0,titre)
HideWindow(0, 0)
debut:
Repeat
    Event = WaitWindowEvent()
   
    If IsIconic_(win)<>0 And hide = 0
        HideWindow(0, 1): hide = 1
    EndIf
    Select Event
       
        Case #PB_Event_SysTray
            HideWindow(0, 0): hide = 0
            SetForegroundWindow_(win)
        Case #PB_Event_CloseWindow
            Select EventWindow()
                Case 0
                    run = 0
                Case 10
                    CloseWindow(10)
                    FreeMemory(*memoire1)
                    FreeMemory(*memoire2)
                    DisableGadget(3, 0)
                   
                Default
                    CloseWindow(EventWindow())
            EndSelect
           
        Case #PB_Event_Gadget
            Select EventGadget()
                Case 11
                    For i = 1 To nmodif
                        If GetGadgetItemState(11, i - 1)&#PB_ListIcon_Selected
                            details(i)
                            Break
                        EndIf
                    Next i
                Case 2
                    For i = 2 To 4: DisableGadget(i, 1): Next i
                    cliche()
                    For i = 2 To 4: DisableGadget(i, 0): Next i
                Case 4
                    suppression()
                   
                Case 3
                   
                    n = 0
                    For i = 1 To nbimage
                        If GetGadgetItemState(1, i - 1)=#PB_ListIcon_Checked Or GetGadgetItemState(1, i - 1)=#PB_ListIcon_Checked|#PB_ListIcon_Selected
                            n + 1
                            If n = 1 : aa = i : Else: bb = i: EndIf
                        EndIf
                    Next i
                    If n<>2
                        MessageRequester("Comparaison de clichés", "Sélectionner exactement deux clichés")
                        Goto debut
                    EndIf
                    DisableGadget(3, 1)
                   
                    nmodif = 0
                   
                    If OpenWindow(10, 0, 0, 1000, 415, "Modifications entre le cliché " + Chr(34)+ image(aa)+ Chr(34)+" et le cliché " + Chr(34)+ image(bb)+ Chr(34), #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
                        CreateGadgetList(WindowID(10))
                        ListIconGadget(11, 5, 5, 500, 400, "modifications", 1500)
                        ListIconGadget(12, 510, 5, 490, 400, "détails (sélectionner une modification)", 1500)
                        modifications()
                    EndIf
            EndSelect
           
    EndSelect
Until run = 0
End

Procedure cliche()
    debutcliche:
    nom.s = InputRequester("Cliché de registre", "Choisissez un nom (uniquement des lettres et des chiffres)", "")
    If nom = ""
        MessageRequester("Cliché registre", "Nom vide = cliché annulé")
        ProcedureReturn
    EndIf
    For i = 1 To nbimage
        If nom = image(i)
            MessageRequester("cliché de registre", "Nom déjà utilisé")
            Goto debutcliche
        EndIf
    Next i
   
    SetWindowTitle(0, titre +"     Cliché en cours...")
    UpdateWindow_(WindowID(0))
    time.s = Space(255)
    date.s = Space(255)
    GetTimeFormat_(0, 8, 0, 0, @time, 255)
    getdateformat_(0, 1, 0, 0, @date, 255)
    date = date +"  " + time
    DeleteFile("c:\bregistre.reg")
    Delay(100)
    RunProgram("regedit.exe", "/e c:\bregistre.reg", "", 1)
    Delay(50)
    If ReadFile(0, "c:\bregistre.reg")
        l = Lof(0)
        *mem = AllocateMemory(l)
        *memo =*mem
        If *mem
            ReadData(0, *mem, l)
            CloseFile(0)
            DeleteFile("c:\bregistre.reg")
        Else
            CloseFile(0)
            ProcedureReturn
        EndIf
       
        *mem2 = AllocateMemory(l)
        *memo2 =*mem2
        If *mem And *mem2
           
            ;      Goto regulier
           
            ;-nouveau code asm
            lim =*memo + l - 1
            amem =*mem
            amem2 =*mem2
           
            !XOR Ecx, Ecx
            !MOV Eax, [v_amem]
            !MOV Ebx, [v_amem2]
           
            !boucle:
            !MOV dl, byte[Eax]
            !CMP dl, 0
            !JLE cas2
            !CMP dl, 13
            !JE cas3
            !CMP dl, 10
            !JE cas3
           
            !INC Ecx
            !MOV byte[Ebx], dl
            !INC Eax
            !INC Ebx
            !JMP fin
           
            !cas3:
            !MOV byte[Ebx], 0
            !INC Ebx
            !INC Ecx
            !repete:
            !INC Eax
            !MOV dl, byte[Eax]
            !CMP Eax, [v_lim]
            !JE fin
            !CMP dl, 13
            !JE repete
            !CMP dl, 10
            !JE repete
            !CMP dl, 0
            !JLE repete
            !JMP fin
           
            !cas2:
            !INC Eax
           
            !fin:
           
            !CMP Eax, [v_lim]
            !JLE boucle
            !MOV [v_amem2], Ebx
            !MOV [v_count2], Ecx
           
            *mem = amem
            *mem2 = amem2
            count = count2
           
            Goto suite
           
            regulier:
            ;-ancien code
            While *mem<*memo + l
                a.b = PeekB(*mem)
               
                If a>0
                    If a<>13 And a<>10
                        count + 1
                        PokeB(*mem2, a)
                        *mem2 + 1
                        *mem + 1
                    Else
                        PokeB(*mem2, 0)
                        *mem2 + 1
                        count + 1
                        Repeat
                            *mem + 1
                        Until(PeekB(*mem)<>13 And PeekB(*mem)<>10 And PeekB(*mem)>0) Or *mem =*memo + l - 1
                    EndIf
                Else
                    *mem + 1
                EndIf
               
            Wend
           
            suite:
           
            PokeS(*mem2, "[berliozo]")
            If OpenFile(1, Path +"clichés/" + nom +".breg")
                *mem2 - count
                WriteData(1, *mem2, count + 11)
                CloseFile(1)
                sauver()
                MessageRequester("Cliché de registre", "Cliché effectué")
                nbimage + 1
                image(nbimage)= nom
                temps(nbimage)= date
            EndIf
        EndIf
    EndIf
    FreeMemory(*memo)
    FreeMemory(*memo2)
    sauver()
    refresh()
    SetWindowTitle(0, titre)
EndProcedure

Procedure suppression()
    nbimage2 = 0
    Global Dim image2.s(200)
    For i = 1 To nbimage
        If GetGadgetItemState(1, i - 1)=#PB_ListIcon_Checked Or GetGadgetItemState(1, i - 1)=#PB_ListIcon_Checked|#PB_ListIcon_Selected
            DeleteFile(Path +"clichés/" + image(i)+".breg")
        Else
            nbimage2 + 1
            image2(nbimage2)= image(i)
        EndIf
    Next i
    nbimage = nbimage2
    For i = 1 To nbimage
        image(i)= image2(i)
    Next i
    refresh()
    sauver()
EndProcedure

Procedure sauver()
    DeleteFile(Path +"breg.cfg")
    If OpenFile(0, Path +"breg.cfg")
        For i = 1 To nbimage
            ;      Debug image(i)
            ;      Debug temps(i)
            WriteStringN(0, image(i))
            WriteStringN(0, temps(i))
        Next i
        CloseFile(0)
    EndIf
EndProcedure

Procedure refresh()
    ClearGadgetItemList(1)
    For i = 1 To nbimage
        AddGadgetItem(1, - 1, image(i)+" : le " + temps(i))
    Next i
EndProcedure

Procedure modifications()
   
    If OpenFile(0, Path +"clichés\" + image(aa)+".breg") And OpenFile(1, Path +"clichés\" + image(bb)+".breg")
        l = Lof(0)
       
        *mem = AllocateMemory(l)
        *memoire1 =*mem
       
        If *mem = 0
            CloseFile(0)
            CloseFile(1)
            Goto debut
        EndIf
       
        ReadData(0, *mem, l)
        CloseFile(0)
       
        l2 = Lof(1)
        *mem2 = AllocateMemory(l2)
        *memoire2 =*mem2
        If *mem2 = 0
            CloseFile(1)
            FreeMemory(*mem)
            Goto debut
        EndIf
        ReadData(1, *mem2, l2)
       
        CloseFile(1)
       
        While PeekS(*mem)<>"[berliozo]" And PeekS(*mem2)<>"[berliozo]"
           
            Select CompareMemoryString(*mem, *mem2, 1)
                Case - 1
                    a.s = PeekS(*mem)
                    AddGadgetItem(11, - 1, "clé effacée = " + a)
                    nmodif + 1
                    modif(nmodif)\adresse1 =*mem
                    modif(nmodif)\type = 1
                    ;       details(nmodif)
                    Repeat
                        *mem + Len(a)+ 1
                        a.s = PeekS(*mem)
                    Until Left(a, 1)="["
                Case 1
                    a.s = PeekS(*mem2)
                    AddGadgetItem(11, - 1, "clé créée = " + a)
                    nmodif + 1
                    modif(nmodif)\adresse2 =*mem2
                    modif(nmodif)\type = 2
                    ;        details(nmodif)
                    Repeat
                        *mem2 + Len(a)+ 1
                        a.s = PeekS(*mem2)
                    Until Left(a, 1)="["
                Case 0
                    debut1 =*mem
                    debut2 =*mem2
                    a.s = PeekS(*mem)
                    Repeat
                        *mem + Len(a)+ 1
                        a.s = PeekS(*mem)
                    Until Left(a, 1)="["
                    a.s = PeekS(*mem2)
                    Repeat
                        *mem2 + Len(a)+ 1
                        a.s = PeekS(*mem2)
                    Until Left(a, 1)="["
                    l1 =*mem - debut1: l2 =*mem2 - debut2
                    If l1<>l2
                        AddGadgetItem(11, - 1, "clé modifiéé = " + PeekS(debut1))
                        nmodif + 1
                        modif(nmodif)\adresse1 = debut1
                        modif(nmodif)\adresse2 = debut2
                        modif(nmodif)\type = 3
                       
                    Else
                        If CompareMemory(debut1, debut2, l1)= 0
                            AddGadgetItem(11, - 1, "clé modifiée = " + PeekS(debut1))
                            nmodif + 1
                            modif(nmodif)\adresse1 = debut1
                            modif(nmodif)\adresse2 = debut2
                            modif(nmodif)\type = 3
                        EndIf
                    EndIf
                   
            EndSelect
        Wend
       
    EndIf
   
EndProcedure
 
Procedure details(i)
    ClearGadgetItemList(12)
    Select modif(i)\type
        Case 1
            *mem = modif(i)\adresse1
            a.s = PeekS(*mem)
            AddGadgetItem(12, - 1, "anciennes valeurs de " + a)
            AddGadgetItem(12, - 1, "******************************************************************************************************************")
            *mem + Len(PeekS(*mem))+ 1
            a = PeekS(*mem)
            While Left(a, 1)<>"["
                ;        count2+1
                AddGadgetItem(12, - 1, ReplaceString(a, "@=", "(par défaut)="))
                *mem + Len(a)+ 1
                a = PeekS(*mem)
            Wend
           
        Case 2
            *mem2 = modif(i)\adresse2
            a.s = PeekS(*mem2)
            AddGadgetItem(12, - 1, "nouvelles valeurs de " + a)
            AddGadgetItem(12, - 1, "******************************************************************************************************************")
            *mem2 + Len(PeekS(*mem2))+ 1
            a = PeekS(*mem2)
            While Left(a, 1)<>"["
                ;       count2+1
                AddGadgetItem(12, - 1, ReplaceString(a, "@=", "(par défaut)="))
                *mem2 + Len(a)+ 1
                a = PeekS(*mem2)
            Wend
        Case 3
            *mem = modif(i)\adresse1
            a.s = PeekS(*mem)
            AddGadgetItem(12, - 1, "anciennes valeurs de " + a)
            AddGadgetItem(12, - 1, "******************************************************************************************************************")
            *mem + Len(PeekS(*mem))+ 1
            a = PeekS(*mem)
            While Left(a, 1)<>"["
                ;        count2+1
                AddGadgetItem(12, - 1, ReplaceString(a, "@=", "(par défaut)="))
                *mem + Len(a)+ 1
                a = PeekS(*mem)
            Wend
            *mem2 = modif(i)\adresse2
            a.s = PeekS(*mem2)
            AddGadgetItem(12, - 1, "******************************************************************************************************************")
            AddGadgetItem(12, - 1, "nouvelles valeurs de " + a)
            AddGadgetItem(12, - 1, "******************************************************************************************************************")
            *mem2 + Len(PeekS(*mem2))+ 1
            a = PeekS(*mem2)
            While Left(a, 1)<>"["
                count2 + 1
                AddGadgetItem(12, - 1, ReplaceString(a, "@=", "(par défaut)="))
                *mem2 + Len(a)+ 1
                a = PeekS(*mem2)
            Wend
            AddGadgetItem(12, - 1, "******************************************************************************************************************")
           
    EndSelect
EndProcedure




; Berlioz:IncludeBinary "d:\imageberliozo.bmp"