Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  Inserare poziti...
 Inserare pozitie in grid
 
 11/17/2009 1:30:39 PM
User is offlineEugen Gliga
1052 posts
1st




Inserare pozitie in grid
 (N/A)
In Thread-ul "Pack in Cursor" s-a discutat o solutie de inserare inregistrari goale intr-un cursor deschis Buffered. Pe scurt, intr-un cursor afisat in grid, trebuie inserata o linie goala pe o anumita pozitie. Solutia functioneaza, dar problema este ca dupa inserarea pozitiei goale, continutul celulei din care dau comanda de inserare apare copiat si in prima inregistrare a cursorului. Am testat problema intr-un exemplu separat si se comporta la fel. Pun mai jos codul, pt cine vrea sa verifice problema. Dupa lansare, inserarea de linii se face cu Ctrl+W

Public oform
oform = Createobject("TestForm")
oform.Visible = .T.

Define Class TestForm As Form
    Top = 1
    Left = 500
    Height = 300
    Width = 210
    Name = "TestForm"
    Add Object grid1 As Grid With ColumnCount = 3, Height = 290,;
        Left = 5, Top = 5,    Width = 200, Name = "Grid1"

    Procedure Load
    Set Multilocks On
    Set SQLBUFFERING On
    Create Cursor crtest (Poz N(3),cod N(9),Denumire c(20))
    CursorSetProp("Buffering" ,5)
    For iX=1 To 10
        Insert Into crtest Values (iX,iX+1000,"Linia "+Transform(iX))
    Next
    Go Top
    Endproc

    Procedure Init()
    With This.grid1
        .RecordSource='crtest'
        .RecordSourceType=6
        .ColumnCount=3
        .Column1.ControlSource='crtest.Poz'
        .Column1.Header1.Caption="Poz."
        .Column2.ControlSource='crtest.Cod'
        .Column2.Header1.Caption="Cod"
        .Column3.ControlSource='crtest.Denumire'
        .Column3.Header1.Caption="Denumire"
        .AutoFit()
        .Visible=.T.
        .Column1.Enabled=.F.
        Go 7
    Endwith
    Endproc

    Procedure KeyPress
    Lparameters nCar,xcar
    Do Case
        Case nCar=27  &&  Esc - Iesire
            Use In crtest
            Thisform.Release
        Case nCar=23 && Ctrl+W - Inserare linie
            nPoz=Poz
            Select * From crtest Into Cursor CursTemp Order By 1
            Tablerevert(.T.,"CrTest")
            Insert Into crtest Select * From CursTemp Where Poz<nPoz
            Insert Into crtest Values (nPoz,0,"Pozitie noua")
            Insert Into crtest Select * From CursTemp Where Poz>=nPoz
            Update crtest Set Poz=Poz+1 Where Poz#Abs(Recno())
            Use In CursTemp
            Select crtest
            Locate For Poz=nPoz
            This.grid1.Refresh
    Endcase
    Endproc
Enddefine






 11/17/2009 2:08:39 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Inserare pozitie in grid
 (N/A)
Textboxurile din linia curenta au in value valorile liniei. La tablerevert, linia curenta se muta sus. La pozitionarea in cursor, textbox.value se transfera in textbox.controlsource. Solutie este decuplarea controalelor din grid de la cursor inainte de golire si recuplarea dupa pozitionare pe inregistrare.
Codul urmator functioneaza corect:

Public oform
oform = Createobject("TestForm")
oform.Visible = .T.

Define Class TestForm As Form
    Top = 1
    Left = 500
    Height = 300
    Width = 210
    Name = "TestForm"
    Add Object grid1 As Grid With ColumnCount = 3, Height = 290,;
        Left = 5, Top = 5,    Width = 200, Name = "Grid1"

    Procedure Load
    Set Multilocks On
    Set SQLBUFFERING On
    Create Cursor crtest (Poz N(3),cod N(9),Denumire c(20))
    CursorSetProp("Buffering" ,5)
    For iX=1 To 10
        Insert Into crtest Values (iX,iX+1000,"Linia "+Transform(iX))
    Next
    Go Top
    Endproc

    Procedure Init()
    With This.grid1
        .RecordSource='crtest'
        .RecordSourceType=6
        .ColumnCount=3
        .Column1.ControlSource='crtest.Poz'
        .Column1.Header1.Caption="Poz."
        .Column2.ControlSource='crtest.Cod'
        .Column2.Header1.Caption="Cod"
        .Column3.ControlSource='crtest.Denumire'
        .Column3.Header1.Caption="Denumire"
        .AutoFit()
        .Visible=.T.
        .Column1.Enabled=.F.
        Go 7
    Endwith
    Endproc

    Procedure KeyPress
    Lparameters nCar,xcar
    Do Case
        Case nCar=27  &&  Esc - Iesire
            Use In crtest
            Thisform.Release
        Case nCar=23 && Ctrl+W - Inserare linie
            nPoz=Poz
            LOCAL lcRecordsource, loGrid
             FOR EACH oCol IN this.grid1.columns foxobject
                 oCol.tag=ocol.controlsource
                 oCol.controlsource=''
             NEXT
                 
            Select * From crtest Into Cursor CursTemp Order By 1
            Tablerevert(.T.,"CrTest")
            Insert Into crtest Select * From CursTemp Where Poz<nPoz
            Insert Into crtest Values (nPoz,0,"Pozitie noua")
            Insert Into crtest Select * From CursTemp Where Poz>=nPoz
            Update crtest Set Poz=Poz+1 Where Poz#Abs(Recno())
            Use In CursTemp
            Select crtest
            Locate For Poz=nPoz
             FOR EACH oCol IN this.grid1.columns foxobject
                 oCol.controlsource=oCol.tag
             NEXT
            This.grid1.Refresh
    Endcase
    Endproc
Enddefine
 

Daniel Buduru
 11/17/2009 3:56:09 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Inserare pozitie in grid
 (N/A)
Eu ma asteptam ca TextBox.ControlSource sa se transfere la TextBox.Value, dar se pare ca este exact pe dos.
Multumesc pt solutie.


 11/17/2009 4:59:06 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Inserare pozitie in grid
 (N/A)
 Eugen Gliga wrote
Eu ma asteptam ca TextBox.ControlSource sa se transfere la TextBox.Value, dar se pare ca este exact pe dos.


Textboxul este "agatat" in keypress, si nu se declanseaza evenimentul valid, care transfera valoare din Value in ControlSource. Valid se declanseaza abia dupa ce se executa codul din keypress, si este fortat de parasirea liniei, ceea ce se produce la pozitionarea pe inregistrarea adaugata.

Prima solutie, gasita in viteza, a fost decuplarea textboxului de la controlsource (era suficient sa se decupleze numai coloana in care s-a tastat).

A doua solutie este fortarea executarii valid si comiterea modificarii inainte de a goli cursorul:

......
nPoz=Poz
GO BOTTOM in (this.grid1.recordsource)
.....





Daniel Buduru
 11/17/2009 10:02:56 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Inserare pozitie in grid
 (N/A)
Prima solutie rezolva total problema. Referitor la decuplarea doar a coloanei in care s-a tastat, ar fi o solutie mai la obiect, dar trebuie aflata coloana curenta, eventual cu This.Grid1.Activecolumn. O sa incerc si aceasta solutie.
A doua solutie functioneaza cu conditia sa nu fii chiar pe ultima pozitie. Am incercat si cu Go top, dar functioneaza cu conditia sa nu fii pe prima pozitie. Pana la urma a functionat cu un If in care dupa caz fac Go Top sau Go Bott

Mai am o curiozitate referitor la acest exemplu. Daca dau comanda de inserare pe ultima pozitie, gridul face scrool cu doua pozitii, respectiv prima pozitie afisata este 3. Daca dau comanda pe penultima pozitie, gridul face scrool cu o pozitie, respectiv prima pozitie afisata este 2. Pe restul pozitiilor in afara de prima nu se face niciun scrool. Pentru prima pozitie, totul dispare si in grid nu se mai afiseaza nimic. De fapt asta este situatia care ma deranjeaza si pe care am rezolvat-o cu o comanda Keyboard '{UpArrow}', dar nu sunt prea incantat.






 11/17/2009 11:10:25 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Inserare pozitie in grid
 (N/A) Modified By Daniel Buduru  on 11/18/2009 12:16:02 AM)
Prima solutie este cea mai fiabila.
Disparitia continutului gridului dupa tablerevert, insert, apoi pozitionare pe prima linie poate fi evitata printr-un grid.refresh inainte de pozitionare pe prima linie din cursor.
Codul acesta rezolva problema :

    Procedure KeyPress
    Lparameters nCar,xcar
    Do Case
        Case nCar=27  &&  Esc - Iesire
            Use In crtest
            Thisform.Release
        Case nCar=23 && Ctrl+W - Inserare linie
            nPoz=Poz
            LOCAL lcRecordsource, loGrid, lnCol, loCol
            lnCol=this.grid1.leftcolumn-1+this.Grid1.ActiveColumn
             FOR EACH oCol IN this.grid1.columns foxobject
                 IF oCol.Columnorder=lnCol
                     loCol=ocol
                       EXIT
                 endif
             NEXT
          loCol.tag=loCol.ControlSource
          loCol.ControlSource=''
          Select * From crtest Into Cursor CursTemp Order By 1
            Tablerevert(.T.,"CrTest")
            Insert Into crtest Select * From CursTemp Where Poz<nPoz
            Insert Into crtest Values (nPoz,0,"Pozitie noua")
            Insert Into crtest Select * From CursTemp Where Poz>=nPoz
            Update crtest Set Poz=Poz+1 Where Poz#Abs(Recno())
            Use In CursTemp
            Select crtest
            thisform.LockScreen=.t.
            this.grid1.refresh
            Locate For Poz=nPoz
             loCol.ControlSource=loCol.Tag
            This.grid1.Refresh
            thisform.LockScreen=.f.
    Endcase
    Endproc


Daca pointerul este pozitionat pe ultimele inregistrari din cursor si se face o adaugare, gridul se pozitioneaza astfel ca linia curenta sa vina undeva in jumatatea gridului, chiar daca toate inregistrarile pot fi afisate in grid fara scroll. In afara de scroll, nu stiu alta modalitate de a pozitiona linia curenta in grid.

Daniel Buduru
 11/18/2009 12:56:38 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Inserare pozitie in grid
 (N/A)
Acum totul e in regula. Multumesc inca odata.


  Visual FoxPro  Baze de date, tabele, view-uri si indecsi  Inserare poziti...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement