A multiselect Grid

Published on by Yousfi Benameur

   
this code builds a grid with multiSelect Functionalities as windows explorer does(click to select an object and reclick maintaining shift key to make a selection).
to achieve this goal we need to a logic field (added automatically to the recordSource cursor at the first grid column.
a checkbox is created to retrieve this logical field (.t. or .f. values) and made as column1.currentcontrol.
-in grid init we made grid dynamicBakcolor to evaluate the value of this checkbox(.t. or .f.) and highlights all relative row.
bindevent() functions binds any mousedown event on any grid.column.text1 to  the method "my".bindevent can determine the object clicked(method my).
-Mousedown on any record to select it.
-click with shift key to select a row.click next another row to make selection.
-CTRL+click on any row to deselect one row (even in selected area)

can preview the selected records on a simple browse view
can make a quick report from 4 columns of the cursor used here(limitation for portait report).
(can build a solid report for that purpose instead a quick report)
of course can open any vfp valid table and with select statement extract fields to a cursor as made in form.load.(its the better way to work with any table and view it on vfp grid).

[post 257]


Click on code to select [then copy] -click outside to deselect

*1* created on Monday 22 of january 2018
*!*	this code builds a grid with multiSelect Functionalities.
*!*	to achieve this goal we need to a logic field (added automatically to the recordSource cursor at the first column.
*!*	a checkbox is created to retrieve this logical field (.t. or .f. values) and made as column1.currentcontrol.
*!*	-in grid init we made grid dynamicBakcolor to evaluate the value of this checkbox(.t. or .f.) and highlights all relative row.
*!*	bindevent() functions binds any mousedown event on any column.text1 to  the method "my".
*!*	Mousedown on any record to select it.
*!*	click with shift key to select a row.click next another row to make selection.
*!*	CTRL+click on any row to deselect one row (even in selected area)
*!*	can preview the selected records on a simple browse view
*!*	can make a quick report from 4 columns of the cursor used here(limitation for portait report).(can build a solid report for that purpose instead a quick report)

Set Safe Off
Close Data All

_Screen.AddProperty("ocolor",Rgb(123,216,255))

Public oform
oform=Newobject("ygridMultiSelect")
oform.Show
Return

Define Class ygridMultiSelect As Form
  Top = 0
  Left = 0
  Height = 700
  Width = 900
  ShowWindow=0  
  ShowTips=.t.
  AutoCenter=.T.
  Caption = "A vfp9 grid MultiSelect"
  rec0 = 0
  Name = "Form1"

  Add Object grid1 As Grid With ;
    Anchor=15,;
    Width=900,;
    height=600,;
    deletemark=.F. ,;
    AllowHeaderSizing = .F.,;
    AllowRowSizing = .F.,;
    GridLines = 0,;
    MousePointer = 15,;
    ScrollBars = 3,;
    HighlightBackColor = Rgb(255,255,255),;
    HighlightForeColor = Rgb(0,0,0),;
    HighlightStyle = 2,;       && Enable highlighting for current row and persist when grid is not the current active control.
  AllowCellSelection = .T.,;   &&  &&important for bindevent
    MousePointer=15,;
    ReadOnly=.T.,;
    Name = "Grid1"

  Add Object command1 As CommandButton With ;
    Caption="Preview selected", ;
    anchor=768,;
    left=200+120,;
    top=600+15,;
    height=25,;
    fontbold=.T.,;
    mousepointer=15,;
    fontsize=12,;
    forecolor=Rgb(128,0,64),;
    autosize=.T.,;
    specialEffect=2,;
    name="command1"

  Add Object command2 As CommandButton With ;
    Caption="Report", ;
    anchor=768,;
    left=400+100,;
    top=600+20,;
    height=25,;
    fontbold=.T.,;
    fontsize=12,;
    forecolor=Rgb(128,0,64),;
    specialEffect=2,;
    mousepointer=15,;
    name="command2"

  Add Object ylab As Label With ;
    anchor=768,;
    backstyle=1,;
    backcolor=Rgb(255,253,117),;
    forecolor=Rgb(128,0,64),;
    fontbold=.T.,;
    fontsize=8,;
    wordwrap=.T. ,;
    left=5,;
    top=615,;
    width=300,;
    height=60,;
    name="ylab"

 Add Object ycol As CommandButton With ;
    caption="...",;
    mousepointer=15,;
    backcolor=Rgb(123,216,255),;
    autosize=.T.,;
    left=770,;
    top=620,;
    tooltiptext="Selection color", ;
    name="ycol"

  Procedure Load
    Close Data All
    Sele * From Home(1)+"samples\data\customer" Into Cursor ycurs0 Readwrite
    Alter Table ycurs0  Add Column chk  L  && add a logiczal field (0-1)
    Sele ycurs0
    Repl All chk With .F.
    *  Brow
    Locate
    Local m.x
    m.x=""
    For i=1 To Fcount()-1
      If !i=Fcount()-1
        m.x=m.x+Field(i)+","
      Else
        m.x=m.x+Field(i)
      Endi
    Endfor

    Local m.myf
    TEXT to m.myf textmerge noshow
    sele chk,<<m.x>> from ycurs0 into cursor ycurs Readwrite
    ENDTEXT
    Execscript(m.myf)

    Use In Select("ycurs0")
    Sele ycurs
  Endproc

  Procedure KeyPress
    Lparameters nKeyCode, nShiftAltCtrl
    If nKeyCode=27
      Thisform.Release
      endi
    Endproc

  Procedure Init
    With Thisform.grid1
      . RecordSource=""
      . RecordSource="ycurs"
      . RecordSourceType=0
      . AutoFit
      . SetAll('DynamicBackColor','iif(Chk=.t.,  _screen.ocolor,rgb(255,255,255))','column')
      . Visible=.T.
      With .column1
        .AddObject("check1","checkbox")
        With .check1
          .Caption=""
          .AutoSize=.T.
          .Value=.F.
          .Visible=.T.
          .Name="check1"
        Endwith
        .CurrentControl="check1"
        .Sparse=.F.
      Endwith
      .SetAll("fontbold",.T.,"header")
      .SetAll("fontsize",11,"header")
      For i=1 To .ColumnCount
        Bindevent(.Columns(i).text1,"mousedown",Thisform,"my")
      Endfor
      .column1.Width=35
    Endwith
    TEXT to thisform.ylab.caption pretext 7 noshow
    Mousedown on any record to select it.
    click with shift key to select a row.click next another row to make selection
    CTRL+click to deselect one row (even in selected area)
    ENDTEXT
  Endproc

  Procedure Destroy
    Sele ycurs
    Replace All chk With .F.
    Use In Select("ycurs")
    Erase yreport.frx
    Erase yreport.frt
    Close Data All
    Clea Events
  Endproc

  Procedure grid1.BeforeRowColChange
    Lparameters nColIndex
    Thisform.LockScreen = .T.
    Thisform.rec0 = Recno()
  Endproc

  Procedure grid1.Init
    Thisform.rec0 = Recno()
  Endproc

  Procedure ycol.Click
    Local m.xcolor
    m.xcolor=Getcolor()
    If m.xcolor=-1
      Return .F.
    Endi
    _Screen.ocolor=m.xcolor
    Thisform.grid1.Refresh
  Endproc

  Procedure my
    Lparameters nButton, nShift, nXCoord, nYCoord
    *--- aevent create an array laEvents
    Aevents( myArray, 0)
    *--- reference the calling object
    loObject = myArray[1]

    If nButton = 1
      Sele ycurs
      Do Case
        Case nShift = 2 && Ctrl
          Replace chk With !chk
        Case nShift = 1 && Shift
          rec = Recno()
          For i=Min(Thisform.rec0, rec) To Max(Thisform.rec0, rec)
            Go i
            Replace chk With .T.
          Next
          Go rec
        Otherwise
          rec = Recno()
          Replace All chk With .F.
          Go rec
      Endcase
       loObject.Parent.Parent.HighlightBackColor=Iif(chk=.T., _Screen.ocolor,Rgb(255,255,255))
      Thisform.LockScreen=.F.
    Endif
  Endproc

  Procedure command1.Click
    Sele * From ycurs Where chk=.T. Into Cursor zcurs
   Browse  Name ybrow   Title "Selected records: "+Trans(Reccount())  Nowait    && window as oop object
With ybrow
    .DeleteMark=.F.
    .GridLines=0
    .RecordMark=.F.
    .Width=sysmetric(1)
    .Left=2
    .SetAll("DynamicBackColor", "IIF(MOD(RECNO( ), 2)=0, RGB(255,255,255)  , RGB(190,235,200))", "Column")
    .FontBold=.T.
Endwith
wait window
    Use In Select("zcurs")
    Sele ycurs
  Endproc

  Procedure command2.Click
    *CREATE REPORT FileName | ? FROM Source [FORM | COLUMN]
    *[FIELDS FieldList] [ALIAS] [NOOVERWRITE] [WIDTH nColumns]

    *extract 4 columns only here (report as portait)
    Local m.myvar
    TEXT to m.myvar textmerge noshow
    Sele <<field(2)>>,<<field(3)>>,<<field(4)>>,<<field(5)>> From ycurs Where chk=.T. Into Cursor zcurs
    sele zcurs
    ENDTEXT
    = Execscript(m.myvar)
    if reccount()=0
    return .f.
    endi
    Set reportbehavior 90  &&for toolbar
    Create Report yreport From Dbf("zcurs") Column
    Repo Form yreport Preview && window (thisform.name)
    Use In Select("zcurs")

    Sele ycurs
    With Thisform.grid1
      .SetFocus
      .Refresh
      Inke(0.3)
      .Parent.Refresh  && must click manually on grid to make it visible !
    Endwith
  Endproc

Enddefine
*
*-- EndDefine: ygridMultiSelect




can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)
can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)
can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)
can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)
can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)
can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)
can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)

can select with the mouse down (shift+click,ctrl+click) any record wanted (select-unselect)

Click on code to select [then copy] -click outside to deselect


*2* created on Tuesday 23 of january 2018
*!*	this code builds a grid with multiSelect Functionalities.its globally the same code as *1* but with a new column as image(checkbox)
*!*	to achieve this goal we need to a logic field (added automatically to the recordSource cursor at the first column.
*!*	a checkbox is created to retrieve this logical field (.t. or .f. values) and made as column1.currentcontrol.
*!*	-in grid init we made grid dynamicBakcolor to evaluate the value of this checkbox(.t. or .f.) and highlights all relative row.
*!*	bindevent() functions binds any mousedown event on any column.text1 to  the method "my".
*!*	Mousedown on any record to select it.
*!*	click with shift key to select a row.click next another row to make selection.
*!*	CTRL+click on any row to deselect one row (even in selected area)
*!*	can preview the selected records on a simple browse view
*!*	can make a quick report from 4 columns of the cursor used here(limitation for portait report).(can build a solid report for that purpose instead a quick report)
*!* i added a code to modify on the fly the report as landscape one.
*:* i added a column with currencontrol as picture (enabled/disabled gif).it plays exactly the same role as the checkBox.(can choose one or other or two)


Set Safe Off
Close Data All
set defa to addbs(justpath(sys(16,1)))
*Rebuild *2 gif images  as checkbox (ok.gif+ok1.gif)
local m.myvar
text to m.myvar noshow
R0lGODlhGAAYAHcAACH5BAEAAAAALAAAAAAYABgApwEAAP///6XhXkvOHkrOHgCMACyRKDGuEAqRAP/9/wh8AnTbMDOxEU/NHkvMHqThXLjiqwCJAKbhXgiRAAGPAEzAKzy7FLHjbafiX03QIABoAP/3/1/VF0zRHdjupFHNHc3rmVXRGD67Ez27EwORANHslxh9EFDRH9HwoqjiYMLqfSFuIQBmAETDGKrqd5DOW1HSH0zPH0/OHmDYHKbobCqjDiGAIRF4CErOH9PumLLjbaTgXP7+/pjYVtTvl1DOHiKZDVjPHABkACyiD8HngbThdafdbXS8RlSlMU7SH7rpf57fYUjHGQBQAGrUMSWfD/78/k7RIKPgW2GzRMTqhtDsmqbiXwJoAkXJHS6mDgBgAFrRFhd4D6nobA9zC1DNHhuODT67FaboaJveYwJdAs/slnjCUjCqEf/y/6HhYE3RIMztnq7ieVnRHNXump7cccDmtc3tnajlZwCKAPLz8gCHAEzRH13SHVbQEe/s7/L08qHkXaDeXqbhX9bxqeLf6G/VMrzohfHx76vlYVrSHFjQHBKXCMvsm1LPHtLvnajiX5nZVlHQILniq6PeaO7t7qLhZgaQAFvSFv/2/zuqKla5N1nXF9vzrVnUH5rZV1rVIFHPHUi/KlPNHVPOHcnrlrrirvj390nOHrrkrbLjbp3hWPHm8cjwkvn4+Z/ga53gVGvULaXkYiu1AJnbVJjYVcvrmf/7///4/1fPHPr4+tXxpuHj4lbSGFjTHrbqaBKHCsjpu1vSHrvoc5HXUFLQHBGTAK/mY07RH1LQH53hXP78/8vrv9PvnrHldNLsnl2/I7LoZPj3+FPNF//t/7bqZ6HfWNHvogaUAROZA1TUIQWPANDunZzfVfn3+6XhXf/1//v6+w+TALnjqwl5A53hTA+ACpvgSv/+/1PRHl3UHkK7FUK/Ftbuolm8KcLtjfz6/FvUHFPTIPHx8SynD/r7+1DPH7DjbVPQH/X09aLhYqLgWsrrl03LE0/ME/b09v37/arkYaDhXunp6uro6gAAAAj/AAEIHDhwRRMhQpqsIMiwIRkvSF4UoUKlyAskXsg0ZKjlCBEfbkqUKVPCjQ8iR7RsFMjFSI4qIJKd87DGQxwQVXIY4bLRhJJEh+ypiHfhgg4dF1TAWnNMiQmGLNhE+0QqnJQdD7I+2CHlWy9rtdiwGHjFjJ9Aqur1EcC2rQAMuQooo3TJzBWBN1Agu8YvTRq3bBUFixBgUoJKKG4AMDAlXSlWEgRIkJCtLYZBhPPRCWDo1BQDNt4Qo+dqXwoMfBxZsZLiWZ0AqEIlGBVpzxsbGsQskbMMna9MPV71WASN8LZ3AbpVW7BEjAZvXcZAKvCnwL1bIUJYmhMACo8AjSZw/1owposGXTRSSXNmSluBGeRmFAhQTFwACAgsrFuwgAY4BS4AMg0atvizQQGtzAdFAPflx8EWeKziggIKONFMOSSg0U8esmyQgD7f4WcBB5JswQs+TihgQBiFtHEACRs80s48zKgTACgIjHBHEEEQMksbYRgAwBOYeIKLOxTEIogetAQABwIiqEHAlKJ0oskTAoHBBCJfjGMOBQlgE8AuE4ggzAADEPDBB/IwAcZAQJzwQwPDjEBBAMZMUIEdaKbZwA8wAMHQGezI0MAvFXADTAUd9DmlDNScsdEBJ8DTwCZJJNEomgR8wQgMB6wEQA1YZBDDAA6k6sAAMaiBRQ2iCh80BAMt4BBFBhlEgUMLDAwRK0EGMJDFAQdkwYCQGwUEADs=
endtext
=strtofile(strconv(m.myvar,14),"ok.gif")

text to m.myvar noshow
R0lGODlhGAAYAHAAACH5BAEAAAAALAAAAAAYABgAhwAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBVZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/wCqAACqMwCqZgCqmQCqzACq/wDVAADVMwDVZgDVmQDVzADV/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMrADMrMzMrZjMrmTMrzDMr/zNVADNVMzNVZjNVmTNVzDNV/zOAADOAMzOAZjOAmTOAzDOA/zOqADOqMzOqZjOqmTOqzDOq/zPVADPVMzPVZjPVmTPVzDPV/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YrAGYrM2YrZmYrmWYrzGYr/2ZVAGZVM2ZVZmZVmWZVzGZV/2aAAGaAM2aAZmaAmWaAzGaA/2aqAGaqM2aqZmaqmWaqzGaq/2bVAGbVM2bVZmbVmWbVzGbV/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5krAJkrM5krZpkrmZkrzJkr/5lVAJlVM5lVZplVmZlVzJlV/5mAAJmAM5mAZpmAmZmAzJmA/5mqAJmqM5mqZpmqmZmqzJmq/5nVAJnVM5nVZpnVmZnVzJnV/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wrAMwrM8wrZswrmcwrzMwr/8xVAMxVM8xVZsxVmcxVzMxV/8yAAMyAM8yAZsyAmcyAzMyA/8yqAMyqM8yqZsyqmcyqzMyq/8zVAMzVM8zVZszVmczVzMzV/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8rAP8rM/8rZv8rmf8rzP8r//9VAP9VM/9VZv9Vmf9VzP9V//+AAP+AM/+AZv+Amf+AzP+A//+qAP+qM/+qZv+qmf+qzP+q///VAP/VM//VZv/Vmf/VzP/V////AP//M///Zv//mf//zP///wAAAAAAAAAAAAAAAAj/APcJHDjQ17uD74gRXMjwXTpHXbqwaNHikKN07xgufOeIhQwWHkN6RJRR475fVwR8lCHA44qVArr80phupccWXWbkbDFDZLqNIGVc8RLxShejRXvGaFFy37tDMnAmPaoTZ4uHuFgcKplOANIrOrHkFNvlKoCzHX/i6ki1i9gZSOGmO3s2HQtHuHxF7OIF7NGILsrOpStjXESDf1s4Iso44uCzVtIhgutQajoV6RIhmoUo0WMAMtLJ6tvFodFxAAwAkKwZNd0Y43Ihmn21JiLUMerm+hxadiLNkVk/mpubLuFxsjQnkvUIUTpcsmXtNn7cd/LOuHDty3V9egAYZ2HLWp4la3P5XAIlc5b+mEW66IgeXZ/1U+AvRPPnrhC92XwiXIigR9B4+DkyzkPrydefgAvJhstymq233IImbceZhA8mJ4sjDJoEnXT9JQddhxXu40suuYyYnUkBAQA7
endtext
=strtofile(strconv(m.myvar,14),"ok1.gif")

_screen.addproperty("ocolor",rgb(123,216,255))
Public oform
oform=Newobject("ygridMultiSelect")
oform.Show
Return

Define Class ygridMultiSelect As Form
  Top = 0
  Left = 0
  Height = 700
  Width = 900
  ShowWindow=0  
  AutoCenter=.T.
  Caption = "A vfp9 grid MultiSelect"
  showTips=.t.
  rec0 = 0
  Name = "Form1"

  Add Object grid1 As Grid With ;
    Anchor=15,;
    Width=900,;
    height=600,;
    deletemark=.F. ,;
    AllowHeaderSizing = .F.,;
    AllowRowSizing = .F.,;
    GridLines = 0,;
    MousePointer = 15,;
    ScrollBars = 3,;
    HighlightBackColor = Rgb(255,255,255),;
    HighlightForeColor = Rgb(0,0,0),;
    HighlightStyle = 2,;       &&Enable highlighting for current row and persist when grid is not the current active control.
    AllowCellSelection = .T.,;   &&important for bindevent
    MousePointer=15,;
    ReadOnly=.t.,;
    Name = "Grid1"

  Add Object command1 As CommandButton With ;
    Caption="Preview selected", ;
    anchor=768,;
    left=200+120,;
    top=600+15,;
    height=25,;
    fontbold=.T.,;
    mousepointer=15,;
    fontsize=12,;
    forecolor=Rgb(128,0,64),;
    autosize=.T.,;
    specialEffect=2,;
    name="command1"

  Add Object command2 As CommandButton With ;
    Caption="Report", ;
    anchor=768,;
    left=400+100,;
    top=600+20,;
    height=25,;
    fontbold=.T.,;
    fontsize=12,;
    forecolor=Rgb(128,0,64),;
    specialEffect=2,;
    mousepointer=15,;
    name="command2"

  Add Object ylab As Label With ;
    anchor=768,;
    backstyle=1,;
    backcolor=Rgb(255,253,117),;
    forecolor=Rgb(128,0,64),;
    fontbold=.T.,;
    fontsize=8,;
    wordwrap=.T. ,;
    left=5,;
    top=615,;
    width=300,;
    height=60,;
    name="ylab"
	
	Add Object ycol as Commandbutton with ;
	caption="...",;
	mousepointer=15,;
	backcolor=rgb(123,216,255),;
	autosize=.t.,;
	left=770,;
	top=620,;
	tooltiptext="selection color",;
	name="ycol"
	
	procedure ycol.click
	local m.xcolor
	m.xcolor=getcolor()
	if m.xcolor=-1
	return .f.
	endi
	_screen.ocolor=m.xcolor
	thisform.grid1.refresh
	endproc

  Procedure Load
    Close Data All
    Sele * From Home(1)+"samples\data\customer" Into Cursor ycurs0 Readwrite
    *brow

    Alter Table ycurs0  Add Column chk L       && add a logical field (0-1) for checkbox
    Alter Table ycurs0  Add Column yimg  c(20)  && &Add Column yimg  c(20) for picture
    Sele ycurs0

    Local m.x
    m.x=""
    For i=1 To Fcount()-2
      If !i=Fcount()-2
        m.x=m.x+Field(i)+","
      Else
        m.x=m.x+Field(i)
      Endi
    Endfor

    Local m.myf  &&make check1 and yimg as 1th and 2th column of grid
    TEXT to m.myf textmerge noshow
    sele chk,yimg,<<m.x>> from ycurs0 into cursor ycurs Readwrite
    ENDTEXT
    Execscript(m.myf)

    Use In Select("ycurs0")
    Sele ycurs
     Repl All chk With .F.
     * Brow
    Locate
  Endproc

  Procedure KeyPress
    Lparameters nKeyCode, nShiftAltCtrl
    If nKeyCode=27
      Thisform.Release
   endi
   Endproc

  Procedure Init
    With Thisform.grid1
      . RecordSource=""
      . RecordSource="ycurs"
      . RecordSourceType=0
      . AutoFit

      With .column1
        .AddObject("check1","checkbox")
        With .check1
          .Caption=""
          .AutoSize=.T.
          .Value=.F.
          .Visible=.T.
          .Name="check1"
        Endwith
        .CurrentControl="check1"
        .Sparse=.F.
      Endwith

      with .column2
      .Addobject("img","image")
        With .img
        .stretch=2
        .width=16
        .height=16
        .picture="ok1.gif"
        .visible=.f.
        .name="img"
        endwith
       .CurrentControl="img"
        .Sparse=.F.
     .refresh
        endwith
         .Visible=.T.
      .SetAll("fontbold",.T.,"header")
      .SetAll("fontsize",11 ,"header")
      For i=3 To .ColumnCount
     Bindevent(.Columns(i).text1,"mousedown",Thisform,"my")
      Endfor
      .column1.Width=35
      .column2.width=16
      .SetAll('DynamicBackColor','iif(Chk=.t.,  _screen.ocolor,rgb(255,255,255))','column')
    Endwith

    TEXT to thisform.ylab.caption pretext 7 noshow
    Mousedown on any record to select it.
    click with shift key to select a row.click next another row to make selection
    CTRL+click to deselect one row (even in selected area)
    ENDTEXT
  Endproc

  Procedure Destroy
    Sele ycurs
    Replace All chk With .F.
    Use In Select("ycurs")
    Erase yreport.frx
    Erase yreport.frt
    Close Data All
    Clea Events
  Endproc

  Procedure grid1.BeforeRowColChange
    Lparameters nColIndex
    Thisform.LockScreen = .T.
    Thisform.rec0 = Recno()
  Endproc

  Procedure grid1.Init
    Thisform.rec0 = Recno()
  Endproc

  Procedure my
    Lparameters nButton, nShift, nXCoord, nYCoord
    *--- aevent create an array laEvents
    Aevents( myArray, 0)
    *--- reference the calling object
    loObject = myArray[1]

    If nButton = 1
      Sele ycurs
      Do Case
        Case nShift = 2 && Ctrl key
          Replace chk With !chk
        Case nShift = 1 && Shift  key
          rec = Recno()
          For i=Min(Thisform.rec0, rec) To Max(Thisform.rec0, rec)
            Go i
            Replace chk With .T.
          Next
          Go rec
        Otherwise
          rec = Recno()
          Replace All chk With .F.
          Go rec
      Endcase
      loObject.Parent.Parent.HighlightBackColor=Iif(chk=.T., _screen.ocolor,Rgb(255,255,255))
      thisform.grid1.column2.dynamicfontbold='iif(Chk=.t., thisform.showPict( thisform.grid1.column2.img,"ok.gif"),thisform.showpict( thisform.grid1.column2.img,"ok1.gif"))'
       Thisform.LockScreen=.F.
    Endif
  Endproc

procedure shoWpict
lparameters oControl,topict
dodefault()
oControl.picture=topict
endproc

  Procedure command1.Click
    Sele * From ycurs Where chk=.T. Into Cursor zcurs
   Browse  Name ybrow   Title "Selected records: "+Trans(Reccount())  Nowait    &&window as oop object
With ybrow
    .DeleteMark=.F.
    .GridLines=0
    .RecordMark=.F.
    .Width=900
    .Left=2
    .SetAll("DynamicBackColor", "IIF(MOD(RECNO( ), 2)=0, RGB(255,255,255)  , RGB(190,235,200))", "Column")
    .FontBold=.T.
Endwith
wait window

    Use In Select("zcurs")
    Sele ycurs
  Endproc

  Procedure command2.Click
    *CREATE REPORT FileName | ? FROM Source [FORM | COLUMN]
    *[FIELDS FieldList] [ALIAS] [NOOVERWRITE] [WIDTH nColumns]

    *extract 4 columns only here (report as portait)
    Local m.myvar
    TEXT to m.myvar textmerge noshow
    Sele <<field(3)>>,<<field(4)>>,<<field(5)>>,<<field(6)>> From ycurs Where chk=.T. Into Cursor zcurs
    sele zcurs
    ENDTEXT
    = Execscript(m.myvar)

     if reccount()=0
    return .f.
    endi
    Set reportbehavior 90  &&for toolbar
    Create Report yreport From Dbf("zcurs") Column
    *!* set programmatly the report as Landscape (report as table to update)
    USE in select("yreport.frx")
    UPDATE yReport.frx set expr = STRTRAN(expr,"ORIENTATION=0","ORIENTATION=1") WHERE objtype = 1
    USE in "yreport.frx"      &&close report table
    *!*
    sele zcurs
    Repo Form yreport Preview   && window (thisform.name)
    Use In Select("zcurs")

    Sele ycurs
    With Thisform.grid1
      .SetFocus
      .Refresh
      thisform.refresh
      Inke(0.3)
      .Parent.Refresh  && must click manually on grid to make it visible !
    Endwith
  Endproc
Enddefine
*
*-- EndDefine: ygridMultiSelect


of course can choose checkbox or/and checked gif Image.i made the general case in the code above.
of course can choose checkbox or/and checked gif Image.i made the general case in the code above.
of course can choose checkbox or/and checked gif Image.i made the general case in the code above.

of course can choose checkbox or/and checked gif Image.i made the general case in the code above.


                     

Yousfi Benameur


Important:All Codes above are tested on VFP9SP2 & windows 10 pro 64 bits version 1709(fall creator) & IE11 emulation.

To be informed of the latest articles, subscribe:
Comment on this post
M
Awesome!!
Reply