Search  
Saturday, February 11, 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  Clase - VCX si PRG  Pierdere focus ...
 Pierdere focus la valid eronat
 
 10/24/2009 3:42:31 PM
User is offlineEugen Gliga
1038 posts
1st




Pierdere focus la valid eronat
 (N/A)
In mod normal, daca  evenimentul valid intoarce fals sau 0, focusul ar trebui sa ramana pe obiectul respectiv. Intr-un form, unde butonul de Salvare este activat de InteractiveChange, la modificarea unei valori, daca valoarea respectiva nu este valida, un click pe butonul de Salvare ar trebui sa nu aiba efect. Acest lucru este valabil pt TextBoxurile din form, insa pt campurile din Grid, un clik pe Salvare, duce la pierderea focusului si executarea codului de salvare. Care ar fi explicatie pt acest lucru ?



 10/26/2009 12:36:58 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Ce inseamna mai exact "butonul de Salvare este activat de InteractiveChange" ? Carui obiect ii apartine evenimenttul InteractiveChange si cum se activeaza butonul de salvare?

Daniel Buduru
 10/26/2009 1:51:08 AM
User is offlineEugen Gliga
1038 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Formul are TextBox-uri, un Grid si diverse butoane printre care Adaugare si Modificare. In momentul cand se intra in Adaugare sau Modificare, aceste butoane isi schimba Caption-ul in Salvare si Abandonare, initial cel cu Salvare fiind Disable. Fiecare obiect editabil din Form are in InteractiveChange o comanda care face ca la prima modificare, butonul Salvare sa devina Enabled.
Pt obiectele din grid, daca Valid-ul intoarce 0, si focusul ramane pe obiect, daca dau click pe butonul Salvare, se pierde focusul si se executa codul din buton. Pt TextBoxuri acest lucru nu se intampla. Am ocolit cumva problema folosind o proprietate care memoreaza eroarea si evita salvarea, dar fenomenul in sine nu mi-e prea clar.






 10/26/2009 9:06:55 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: Pierdere focus la valid eronat
 (N/A) Modified By Daniel Buduru  on 10/26/2009 9:16:44 AM)
Focusul ramane in textbox-ul din grid daca valid returneaza 0. Daca valid returneaza .F., focusul poate fi totusi mutat.
Mai corect, daca valid returneaza .F., focusul ramane pe textbox, dar se executa metoda click a butonului, fara ca textbox.lostfocus si commandbutton.getfocus sa se declanseze..
In cazul in care valid returneaza 0, focusul ramene pe textbox si nu se executa metoda click a butonului.

Daniel Buduru
 10/26/2009 11:03:11 AM
User is offlineEugen Gliga
1038 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Asa se intampla doar pt textbox-urile din form. Pt alea din din grid se executa metoda click a butonului indiferent daca validul returneaza 0 sau .f.. Am testat cu ambele valori. Odata ce se executa metoda click, adica se salveaza documentul cu date eronate, in final acesta este reincarcat iar intre cele doua faze RecordSource-ul gridului dispare, fapt ce explica pierderea definitiva a focusului. Pe moment am ocolit situatia, dar mai studiez fenomenul.



 10/26/2009 11:19:18 AM
User is offlineDaniel Buduru
2141 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Din pacate nu pot urca testul pe forum. O adresa de mail?


Daniel Buduru
 10/26/2009 12:06:51 PM
User is offlineandrei_veklinec
17 posts


Re: Pierdere focus la valid eronat
 (N/A)
Am avut si eu aceeasi problema si am rezolvat-o astfel : mi-am facut o clasa tip Textbox, am pus codul meu in Valid, am pus Texbox-ul in grid, am dat CurrentControl = Textbox si functioneaza foarte bine.
 10/26/2009 12:48:23 PM
User is offlineedyshor
1450 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Poti sa pui 'nodefault' in lostfocus()
 10/26/2009 1:57:52 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Inutil. TextBox.LostFocus nu se declanseaza daca textbox.valid returneaza 0 sau .f.
Deosebirea dintre cele doua este aceea ca, in cazul in care, la click pe buton, textbox.valid.returneaza .f., se declanseaza commandbutton.click, fara ca textbox.lostfocus si commandbutton.gotfocus sa se declanseze.
In cazul in care valid returneaza 0, commandbutton.click nu se declanseaza.


Daniel Buduru
 10/26/2009 2:45:38 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
La testele facute cu formul in scx, o vreme nu s-a declansat commandbutton.click cand valid returna 0. Apoi a inceput sa se comporte la fel si la 0 si la .f.
In prg s-a comportat de la inceput la fel.
In cazul in care valid returneaza 0 sau .f., commandbutton.gotfocus nu se declanseaza, form.activecontrol ramane gridul.
Mai jos este un cod care reproduce comportamentul.

PUBLIC oform
oForm = CREATEOBJECT("TestForm")
oform.visible = .t.


DEFINE CLASS TestForm as Form
    Top = 1
    Left = 500
    Height = 330
    Width = 425
    DoCreate = .T.
    Caption = "Test Valid Event"
    AllowOutput = .F.
    Name = "TestForm"

    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 48, ;
        Left = 324, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "Command1", ;
        Name = "Command1"

    ADD OBJECT grid1 AS grid WITH ;
        ColumnCount = 3, ;
        Height = 264, ;
        Left = 4, ;
        Top = 48, ;
        Width = 300, ;
        Name = "Grid1"


    PROCEDURE Load
        CREATE CURSOR crstest (f1 int, f2 int, f3 int)
        FOR iii=5 TO 10
        INSERT INTO crstest VALUES (iii, iii-2, iii*10)
        NEXT
        GO top
        CLEAR
    ENDPROC

    PROCEDURE command1.init
        this.AddProperty('GotFocusFired',.f.)
    ENDPROC

    PROCEDURE command1.Click
        ? PROGRAM()
           ?? ' Controlul activ: '+TRANSFORM(thisform.activecontrol.name)
        IF !this.gotfocusfired
           ?? '   GotFocus Nu s-a declansat! '
        ELSE
            ?? '  GotFocus s-a declansat, se poate executa codul!'
        endif   
    ENDPROC

    PROCEDURE command1.GotFocus
        this.GotFocusfired=.t.
        ? PROGRAM()
    ENDPROC

    PROCEDURE command1.LostFocus
        this.gotfocusfired=.f.
        ? PROGRAM()
    ENDPROC

    PROCEDURE init()

      WITH THIS.grid1
          .Recordsource='crstest'
          .recordSourceType=6
          .columnCount=3
          .Scrollbars=0
          .Column1.controlSource='crstest.f1'
          .Column1.header1.caption='F1'
          .Column2.Addobject('TextV0','Txtvalid0')
          .Column2.currentcontrol='TextV0'
          .Column2.controlsource='crstest.f2'
          .Column2.Header1.Caption='Valoare valida: f1-2'
          .Column3.Addobject('TextVL','TxtvalidL')
          .Column3.currentcontrol='TextVL'
          .Column3.controlsource='crstest.f3'
          .Column3.Header1.Caption='Valoare valida: f1*10'
          .Autofit()
          .visible=.t.
            
      ENDWITH

    ENDPROC
   
ENDDEFINE

DEFINE CLASS TxtValid0 AS textbox
    PROCEDURE gotfocus
        ? PROGRAM()
    endproc
    PROCEDURE lostfocus
        ? PROGRAM()
    ENDPROC
    PROCEDURE valid
        ? PROGRAM(), ' -- Valid return '+TRANSFORM(IIF(this.Value<>(f1-2),0,.T.))
        IF this.Value<>(f1-2)
            RETURN 0
        ENDIF
    ENDPROC
ENDDEFINE    
       
DEFINE CLASS TxtValidL AS textbox
    PROCEDURE gotfocus
        ? PROGRAM()
    endproc
    PROCEDURE lostfocus
        ? PROGRAM()
    ENDPROC
    PROCEDURE valid
        ? PROGRAM(), ' -- Valid return '+TRANSFORM(IIF(this.Value<>(f1*10),.F.,.T.))
        IF this.Value<>(f1*10)
            RETURN .f.
        ENDIF
    ENDPROC
ENDDEFINE
       


    ENDPROC
   
ENDDEFINE

DEFINE CLASS TxtValid0 AS textbox
    PROCEDURE gotfocus
        ? PROGRAM()
    endproc
    PROCEDURE lostfocus
        ? PROGRAM()
    ENDPROC
    PROCEDURE valid
        ? PROGRAM(), ' -- Valid return '+TRANSFORM(IIF(this.Value<>(f1-2),0,.T.))
        IF this.Value<>(f1-2)
            RETURN 0
        ENDIF
    ENDPROC
ENDDEFINE    
       
DEFINE CLASS TxtValidL AS textbox
    PROCEDURE gotfocus
        ? PROGRAM()
    endproc
    PROCEDURE lostfocus
        ? PROGRAM()
    ENDPROC
    PROCEDURE valid
        ? PROGRAM(), ' -- Valid return '+TRANSFORM(IIF(this.Value<>(f1*10),.F.,.T.))
        IF this.Value<>(f1*10)
            RETURN .f.
        ENDIF
    ENDPROC
ENDDEFINE
       

Daniel Buduru
 10/26/2009 11:07:56 PM
User is offlineEugen Gliga
1038 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Am testat codul si se comporta la fel ca la mine in program. Intradevar solutia cu proprietatea GotFocusfired pusa in GotFocus-ul  din Command este foarte buna, pt a evita executarea codului dintr-un buton, daca acesta nu primeste focusul. Multumesc mult  pentru solutie.
Totusi raman in continuare cu aceeasi nedumerire. De ce daca TextBoxul nu este in Grid ci direct in Form, codul din Click-ul butonului nu se executa?
Am adaugat la sfarsitul codului respectiv inca o clasa TextBox si am adaugat un obiect de acest tip direct in form si am verificat comportamentul.
Mai am o curiozitate personala. Incercati sa puneti in procedura Command1.Click, dupa instructiunea    ?? '   GotFocus Nu s-a declansat! ' 
urmatoarea instructiune:    ThisForm.Grid1.RecordSource="". Sunt foarte curios daca se intampla acelasi lucru ca si la mine.











 10/26/2009 11:43:26 PM
User is offlineDaniel Buduru
2141 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Cred ca e mai eficienta verificarea controluli activ:
IF Thisform.ActiveControl=this
*!* Butonul a primit focusul, nu e nici un valid agatat
Endif

Am facut si testul cu Thisform.grid1.recordsource='', a iesit din grid.

Comportamentul observat este un bug. E adevarat ca butonul nu primeste focusul, dar se declanseaza evenimentul click, ceea ce ar fi trebuit sa nu se intample.

Din ce motiv se intampla asta, pot doar sa fac o presupunere: din modul de lucru al gridului, acela de a muta controlul (in acest caz textboxul) pe linia activa si de a pune doar o imagine a controlului pe liniile inactive, ajunge la un moment dat, cand mouse se muta pe buton, cand gridul nu mai este activ, si nu mai are un textbox activ. Acesta se vede si din  controlul activa afisat in command.click: controlul activ este grid1, si nu grid1.column2.text1. Presupun, in continuare, ca mecanismul de blocare a focusului si al eveniumentului click se bazeaza pe existenta altui control activ care retine focusul, ceea ce, in cazul controlui din coloana gridului, nu se mai intampla.
Si nici o sansa ca asta sa se mai remedieze vreodata.

Eu am retinut ca solutie de ocolire verificarea controlului activ in butonul de salvare. Nu necesita cod si proprietati setate in alte evenimente, e doar o linie de cod in click.



Daniel Buduru
 10/27/2009 12:05:53 AM
User is offlineEugen Gliga
1038 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Asa e. Verificarea controlului activ este o metoda mai simpla.
Referitor la testul cu Thisform.grid1.recordsource='', la mine VFP-ul crapa si imi apare mesajul ala cu "Send Error Report", dar cum ai zis, degeaba as da Send ca tot nu se va rezolva nimic.




 10/27/2009 6:11:30 PM
User is offlineedyshor
1450 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Relativ la intrebarea lui Eugen, poate face testul in LostFocus() unde poate alege sa activeze/dezactiveze butonul 'Salvare'
In cazuri mai drastice poate alege sa impiedice plecarea din textbox-uri prin includerea instructiunii 'Nodefault'

Personal, am gasit ca sunt rare cazurile in care a trebuit sa ma leg de Valid(), paremi-se o singura data, sa impiedic mesajul "Invalid Date" pentru textbox-urile binduite.
 10/27/2009 8:28:47 PM
User is offlineEugen Gliga
1038 posts
1st




Re: Pierdere focus la valid eronat
 (N/A)
Nu asta a fost fondul problemei. Focusul TextBoxului nu se pierde. Problema era ca desi focusul ramane pe TextBox si butonul nu primeste focusul, totusi codul din Click se executa. In rest  evenimentul Valid este consacrat pentru validari si ofera mai multe posibilitati la Return.


  Visual FoxPro  Clase - VCX si PRG  Pierdere focus ...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement