Subject Re: Closing an image on a form
From roy price <royprice@royprice.name>
Date Sun, 11 Apr 2021 16:41:37 -0400
Newsgroups dbase.getting-started

Mervyn Bick Wrote:

> On 2021/04/10 09:29, roy price wrote:
>
> > Hello Again Mervyn / Akshat,
> > After setting up a test area, with three records on the main table, each with a field "Photoyesfile" "01", "02", "03", and three image files (with one image each), and trying (very trying) the code below in various combinations, I get nowhere with selecting the second and third files images.
> > The If's or Cases statements work to get to the correct line, but the statements, "this.dataSource =", or "form.testimagedatamodule1.dataSource =" do not cause the first image  to be replaced with the second, or third.
>
>
> Have a look at the attached example.  If you open it in the form
> designer you will see the same image in each image control.  This is
> because I've used the same table three times and each image query opens
> with the first record selected.  If I had use three different image
> tables (I didn't because there aren't three suitable tables in the
> samples database) each image would display a different image.
>
> I've used the form's form_onOpen event handler to blank out two of the
> image controls when the form opens.
>
> The main table's onNavigate event handler only uses this.parent.parent.
> in place of form. as I'm not using a datamodule for the example.  With
> the tables in a datamodule you will need to use
> this.parent.parent.parent. instead.
>
> I've placed some comments in the fist section of the onNavigate event
> handler.  They apply equally to the rest of the code in the event handler.
>
> It is not usual to have three image controls even though one has three
> image files.  If you opt for one image control you won't need the
> form_onOpen event handler.  Simply assign the image file which holds the
> image for the first record in your main file to the image control in the
> image control constructor code.
>
> The onNavigate event handler only need to select the correct record in
> the correct image table and assign that table to the single image
> control's datasource property.  There are no other image controls to null.
>
>    function rowset_onNavigate()
>        if this.fields['photoyesfile'].value = '01'
>           this.parent.parent.fish1.rowset.applyLocate( "id = " +
> this.fields['id'].value  )
>           this.parent.parent.image1.datasource =
> this.parent.parent.fish1.rowset.fields["fish image"]
>        elseif this.fields['photoyesfile'].value = '02'
>            this.parent.parent.fish2.rowset.applyLocate( "id = " +
> this.fields['id'].value  )
>            this.parent.parent.image1.datasource =
> this.parent.parent.fish2.rowset.fields["fish image"]
>         elseif this.fields['photoyesfile'].value = '03'
>            this.parent.parent.fish3.rowset.applyLocate( "id = " +
> this.fields['id'].value  )
>            this.parent.parent.image1.datasource =
> this.parent.parent.fish3.rowset.fields["fish image"]
>          endif
>        return
>
>
> Mervyn.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> if not file('fish_demo.dbf')
>   copy table :dbasesamples:fish to fish_demo
>   alter table fish_demo add photoyesfile char(2)
>   use fish_demo
>   scan
>   replace photoyesfile with '0'+ltrim(str(mod(id,3)+1))
>   endscan
>   use
> endif  
>
>
> ** END HEADER -- do not remove this line
> //
> // Generated on 2021-04-10
> //
> parameter bModal
> local f
> f = new three_imagesForm()
> if (bModal)
>    f.mdi = false // ensure not MDI
>    f.readModal()
> else
>    f.open()
> endif
>
> class three_imagesForm of FORM
>    with (this)
>       onOpen = class::FORM_ONOPEN
>       height = 21.0909
>       left = -1.2857
>       top = 0.7273
>       width = 106.8571
>       text = ""
>    endwith
>
>    this.DBASESAMPLES1 = new DATABASE(this)
>    with (this.DBASESAMPLES1)
>       left = 13.0
>       width = 11.0
>       height = 1.0
>       databaseName = "DBASESAMPLES"
>       active = true
>    endwith
>
>    this.FISH1 = new QUERY(this)
>    with (this.FISH1)
>       left = 4.0
>       width = 3.0
>       height = 1.0
>       database = form.dbasesamples1
>       sql = "select * from FISH.DBF"
>       active = true
>    endwith
>
>    this.FISH2 = new QUERY(this)
>    with (this.FISH2)
>       left = 30.0
>       width = 3.0
>       height = 1.0
>       database = form.dbasesamples1
>       sql = "select * from FISH.DBF"
>       active = true
>    endwith
>
>    this.FISH_DEMO1 = new QUERY(this)
>    with (this.FISH_DEMO1)
>       left = 45.0
>       width = 8.0
>       height = 1.0
>       sql = 'select * from "fish_demo.DBF"'
>       active = true
>    endwith
>
>    with (this.FISH_DEMO1.rowset)
>       onNavigate = class::ROWSET_ONNAVIGATE
>    endwith
>
>    this.FISH3 = new QUERY(this)
>    with (this.FISH3)
>       left = 39.0
>       width = 3.0
>       height = 1.0
>       database = form.dbasesamples1
>       sql = "select * from FISH.DBF"
>       active = true
>    endwith
>
>    this.GRID1 = new GRID(this)
>    with (this.GRID1)
>       dataLink = form.fish_demo1.rowset
>       height = 12.4545
>       left = 2.0
>       top = 3.1364
>       width = 69.8571
>    endwith
>
>    this.IMAGE1 = new IMAGE(this)
>    with (this.IMAGE1)
>       height = 4.8182
>       left = 80.2857
>       top = 2.6364
>       width = 21.4286
>       dataSource = form.fish1.rowset.fields["fish image"]
>    endwith
>
>    this.IMAGE2 = new IMAGE(this)
>    with (this.IMAGE2)
>       height = 4.8182
>       left = 80.2857
>       top = 8.3636
>       width = 21.4286
>       dataSource = form.fish2.rowset.fields["fish image"]
>    endwith
>
>    this.IMAGE3 = new IMAGE(this)
>    with (this.IMAGE3)
>       height = 4.8182
>       left = 80.2857
>       top = 14.7273
>       width = 21.4286
>       dataSource = form.fish3.rowset.fields["fish image"]
>    endwith
>
>    this.rowset = this.fish1.rowset
>
>    function form_onOpen()
>      //Only one image table has the correct image so we need
>      //to null the datasource property for two of the image controls
>        mphoto = form.fish_demo1.rowset.fields["photoyesfile"].value
>       If mPhoto='01'
>       form.IMAGE2.dataSource = []
>       form.IMAGE3.datasource = []
>       elseif mPhoto='02'
>       form.IMAGE1.dataSource = []
>       form.IMAGE3.datasource = []
>       elseif mPhoto='03'
>       form.IMAGE1.dataSource = []
>       form.IMAGE2.datasource = []
>       endif
>       return
>
>    function rowset_onNavigate()
>       if this.fields['photoyesfile'].value = '01'
>          //Go to the correct record in the image file.
>          //You will need to use the correct field names.
>          // If the fields are character then
> //          this.parent.parent.fish1.rowset.applyLocate( "id = '" + this.fields['id'].value +"'" )
>           this.parent.parent.fish1.rowset.applyLocate( "id = " + this.fields['id'].value  )
>           //Set the datasource property of the image control to use
>           this.parent.parent.image1.datasource = this.parent.parent.fish1.rowset.fields["fish image"]
>           //Null the datasource property for each of the other image controls
>           this.parent.parent.image2.datasource = [] //note: no space between the square brackets
>           this.parent.parent.image3.datasource = []
>       elseif this.fields['photoyesfile'].value = '02'
>           this.parent.parent.fish2.rowset.applyLocate( "id = " + this.fields['id'].value  )
>           this.parent.parent.image2.datasource = this.parent.parent.fish2.rowset.fields["fish image"]
>           this.parent.parent.image1.datasource = []
>           this.parent.parent.image3.datasource = []    
>        elseif this.fields['photoyesfile'].value = '03'
>           this.parent.parent.fish3.rowset.applyLocate( "id = " + this.fields['id'].value  )
>           this.parent.parent.image3.datasource = this.parent.parent.fish3.rowset.fields["fish image"]
>           this.parent.parent.image1.datasource = []
>           this.parent.parent.image2.datasource = []      
>         endif
>       return
>
> endclass
>
Hello Mervyn,
Well at last I have a (mostly) working example of using three image controls on my tables. As I've added an ID field to my tables so as not to disturb the OnNavigate example ((I've never come across ApplyLocate before, at least long ago when I could remember the commands)
I have a couple of problem areas to work through....
the opening photo is not correct if the main table and the photo01 file do not start with the same record.... I guess thats an indexing solution.
and the ID  autoincrement fields on each file will soon be out of sequence as more photos are added (currently changing the photo file to character produces an error, even if the line is changed as suggested).
More for me to do to keep occupied.
Regards
Roy Price