ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Grille et leurs controlsources   



L'auteur

eddymaue
Canada Canada
Membre Simple
# 0000000075
enregistré le 26/10/2004
Maue Eddy
j8j 8j8 Gatineau
de la société Formatek
Fiche personnelle


Note des membres
14/20
1 vote


Contributions > 01 - PRG : Programmation

Grille et leurs controlsources
# 0000000379
ajouté le 25/11/2006 20:00:43 et modifié le 01/09/2007
consulté 8957 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0
VFP 5.0

Description

Partant du fait que lorsque le recorsource d'une grille est vide, on peut en faire ce qu'on veut.


Ce que l'on se doit de tenir compte

Avant d'altérer un curseur pour notre exemple il faut vider le recordsource de la grille

this.grid1.recorsource = ""

là on peut faire ce que l'on veut avec le curseur
modifier , altérer, fermer et ou en créer un autre

réaffecter l'alias au recordsource de la grille avant d'affecter un champ au controlsource des colonne.

this.grid1.recorsource = "MonAlias"
* a supposer que les champs soit dans l'ordre c1,c2,c3,c4,c5,c6,c7
* donc lorsque MonAlias est réaffecté au recordsource de la grille, ce sont les trois premiers champs du curseur

 

* qui sont réaffectés à la grille soit c1,c2 et c3

et là on peut réordonner les colonnes de la grille

with this.grid1
.c1.controlsource = "MonAlias.c4"
.c2.controlsource = "MonAlias.c3"
.c3.controlsource = "MonAlias.c7"
endwith

* l'exemple ici-bas fait çà et regardez l'astuce utilisé avec cSouce_assign

Code source :
#Define cr Chr(13)
#Define cr2 cr+cr
Public o
o = Createobject("MaForm")
o.Show()


Define Class Maform As Form
  ShowTips = .T.
  Add Object g1 As grid1
  Add Object test1 As MesBoutons With Left = 10  ,;
    ToolTipText="lordre du cursor est "+cr2+" ii1 , ii2 , ii3 "+cr2+;
    " et celle de la grille versus ses controlsoures demeurera "+cr2+;
    " ii1,ii2,113 "


  Add Object test2 As MesBoutons With Left = 100 ,;
    ToolTipText="lordre du cursor est "+cr2+" ii3 , ii1 , ii2 "+cr2+;
    " et celle de la grille versus "+cr+"ses controlsoures demeurera "+cr2+;
    " ii1,ii2,113 "
  Add Object test3 As MesBoutons With Left = 197 ,;
    ToolTipText="lordre du cursor est "+cr2+" ii3 , ii2 , ii1 "+cr2+;
    " et celle de la grille versus ses"+cr+" controlsoures demeurera "+cr2+;
    " ii1,ii2,113 "

  Procedure Init()
    *

    This.g1.RecordSource = ""
    This.CursorSwitchColum(1)
    This.g1.RecordSource = "t1"

  Procedure CursorSwitchColum(iOrd)
    Do Case
      Case iOrd = 1
        Create Cursor t1 (ii1 i,ii2 i,ii3 i)
      Case iOrd= 2
        Create Cursor t1 (ii3 i,ii1 i,ii2 i)
      Otherwise
        Create Cursor t1 (ii3 i,ii2 i,ii1 i)

    Endcase

    For i = 1 To 10
      Insert Into t1 (ii1,ii2,ii3) Values (i,  10*i,  i*100)
    Endfor
    * comme le sugere Mike Gagnon
    Locate

  Endproc


  Procedure TraiteCtrlSource()
    With This.g1
      If Empty(.RecordSource)
        .RecordSource = "t1"
        .SetAll("csource","")
        .Refresh()
        Thisform.LockScreen = .F.
      Else
        Thisform.LockScreen = .T.
        .SetAll("csource","")
        .RecordSource""

      Endif


    Endwith
  Endproc

  Procedure test1.Click
    With This.Parent
      .TraiteCtrlSource()
      * L'ordre des colonnes reste la même
      = .CursorSwitchColum(1)
      .TraiteCtrlSource()

    Endwith
  Endproc



  Procedure test2.Click
    With This.Parent
      .TraiteCtrlSource()
      * L'ordre des colonnes sont interchanées
      = .CursorSwitchColum(2)
      .TraiteCtrlSource()
    Endwith

  Endproc
  Procedure test3.Click
    With This.Parent
      .TraiteCtrlSource()
      * L'ordre des colonnes sont interchanées
      = .CursorSwitchColum(3)
      .TraiteCtrlSource()
    Endwith
  Endproc

Enddefine



Define Class MesBoutons As CommandButton
  Procedure Init
    With Thisform
      This.Top= .g1.Top+.g1.Height+10
    Endwith
Enddefine




Define Class grid1 As Grid
  csource = ""
  RecordSource="t1"
  RecordSourceType = 1

  Add Object c1 As MesCol ;
    WITH ControlSource="t1.ii1"
  Add Object c2 As MesCol ;
    WITH ControlSource="t1.ii2"
  Add Object c3 As MesCol ;
    WITH ControlSource="t1.ii3"

Enddefine


Define Class MesCol As Column
  csource = ""


  Procedure Init
    This.header1.Caption = Getwordnum(This.ControlSource,2,".")

  Procedure csource_assign
    Lparameters csource

    * column
    If Empty(csource) .AndEmpty(This.csource)
      This.csource = This.ControlSource
      This.ControlSource""
    Else
      This.ControlSourceThis.csource
      This.csource = ""
    Endif

  Endproc


Enddefine

Commentaires
le 26/11/2006, Mike Gagnon a écrit :
Eddy,
Suggestion
Ajoute un LOCATE apres tes insert. La grille montre seleument le dernier record, il faut scroller, pour remonter

le 26/11/2006, EmanuelL a écrit :
Mike,
Curiosité, quelle est l' influence de LOCATE après les insertions?

FOR i = 1 TO 10
INSERT INTO t1 (ii1,ii2,ii3) VALUES (i, 10*i, i*100)
LOCATE
ENDFOR

le 27/11/2006, eddymaue a écrit :
elle te ramène sur le premier record indexé
le 27/11/2006, Mike Gagnon a écrit :
Emanuel

Ma suggestion était de mettre un LOCATE après tous les insert, et non après chaque insert. Sans locate lorsque tu as fini les insert, tu te trouve au bas de la table. LOCATE est similaire à GO TOP, mais a un mellieur perfomrmance que GO TOP.

le 28/11/2006, EmanuelL a écrit :
Merci Mike pour l'info.

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3