Subject Re: Display Images on the form from a local imagefolder
From AGOSTINHO <AGOSTINHOTEIXEIRA@YAHOO.COM>
Date Sun, 01 Oct 2023 01:51:30 -0400
Newsgroups dbase.getting-started

I've been working around with the method of displaying images on a separate
image-folder and it works much better than placing the images direct on the DBF files.
Thanks for that.

Now I'm trying to change/replace the images on each record but can't get it to work.
I've tried with the following routine but it don't works.
Thanks

function PUSHBUTTON7_onClick()
     local cFile
       cFile = getfile( "*.*", "Import mugshot image" )
     if "" # cFile
       form.imagepotret1.dataSource = 'FILENAME  "'+trim(this.fields['jpg_path'].value)+'\'+this.fields['jpg_name'].value+'"'
     endif
   return



Mervyn Bick Wrote:

> On 2023/09/22 06:13, AGOSTINHO wrote:
> > Following Mervin Bick adive that's not recommended  to  save images to tables.
> >
> ....
>
> > I added a character field named "imagefolder" to my fish4.dbf file and wrote the image files name to this particular record "C:\Users\HOME_PC\Desktop\blueangelfish.png"
> >
> > Dropped an image controle  from the componed pallete  to the form
> > and have programmed an onNavigate function into the form.
> >
> > this.IMAGE1 = new IMAGE(this)
> >     with (this.IMAGE1)
> >        height = 4.84
> >        left = 73.1111
> >        top = 3.96
> >        width = 17.8889
> >     endwith
> >
> > function form_onNavigate(nWorkArea)
> >               local cImageFileName
> >               // Assuming I have a field in my table that contains image file paths
> >              cImageFileName = form.fish41.rowset.fields["imagefolder"]
> >              // Image control's ImageFile property to display the image
> >            this.image1 = cImageFileName
> >    return
> >
>
>
> Firstly, workareas are created when a table is USE'd with XDML.
> Workareas don't exist when OODML query objects are used.  One can mix
> XDML and OODML table access in a form if one is very careful but it is
> NOT a good idea as it can lead to major problems.  Stick with OODML.
>
> You need to use the onNavigate event handler of the rowset created by
> the query object to tell the image control which image to display.
>
> The syntax for displaying an image file in an image object is
>
>        dataSource = 'FILENAME "whatever.jpg"'
>
> No event handler executed by a query or a rowset understands the concept
> "form".  One needs to use this.parent.parent in event handlers executed
> by the rowset.
>
> 'this' refers to the rowset
> 'this.parent' refers to the query
> 'this.parent.parent' refers to the form.
>
>   function rowset_onNavigate(type, nRows)
>     cImageFileName = this.fields["imagefolder"].value
>     this.parent.parent.image1.dataSource = 'FILENAME  "'+cImagefile+["]
>     return
>
> This has not been tested but it should work.  It will, however, only
> work if the image files are in the same folder as your program.  If you
> haven't set the image control's datasource in the constructor code to
> access the first image in the table you will need to use the form's
> onOpen event handler to do this.
>
>   function form_onOpen
>     cImageFileName = form.fish41.rowset.fields["imagefolder"].value
>     form.image1.dataSource = 'FILENAME  "'+cImagefile+["]
>     return
>
> It is better programming practice to keep the image files in a separate
> folder with the path in one field of the table and the file name in
> another.  To display a file means combining the path and the filename.
> Having trailing blanks for the file name is not a problem but they must
> be removed from the path.  One can provide the path as a variable and
> only save the file name to the table but I prefer to include the path in
> a separate field.
>
> A revised version of your test form is attached.
>
> Mervyn.
>
>
>
>
>
>
>
>
>
> if file ('fish_mb.dbf')
>   drop table fish_mb
> endif  
> if not file('fish_mb.dbf')
>    copy table :dbasesamples:fish to fish_mb
> endif
> cDir = set('dire')
> nDir_len = len(cDir)+10
> cPath = cDir+'\jpg_path'
> cmd = 'alter table fish_mb add jpg_path char('+nDir_len+') , add jpg_name char(10)'
> &cmd
> try  
>    cmd = 'md '+cDir+'\jpg_path'
>    &cmd
> catch(exception e)
> endtry
> cSafety = set('safety')
> set safety off
> q = new query()
> q.sql = 'select * from fish_mb'
> q.active = true
> n = 1
> do while not q.rowset.endofset
>    cFish = 'fish'+n+'.jpg'
>    cmd = 'q.rowset.fields["fish image"].copyToFile("'+cPath+'\'+cFish+'")'
>    &cmd
>    q.rowset.fields['jpg_path'] .value = cPath
>    q.rowset.fields['jpg_name'].value = cFish
>    n++
>    q.rowset.next()
> enddo
> q.active= false
> set safety  &cSafety
>
> ** END HEADER -- do not remove this line
> //
> // Generated on 2023-09-22
> //
> parameter bModal
> local f
> f = new SEEK_FISH1Form()
> if (bModal)
>    f.mdi = false // ensure not MDI
>    f.readModal()
> else
>    f.open()
> endif
>
> class SEEK_FISH1Form of FORM
>    with (this)
>       onOpen = class::FORM_ONOPEN
>       height = 16.0
>       left = 50.1429
>       top = -0.2273
>       width = 55.2857
>       text = ""
>    endwith
>
>    this.FISH_MB1 = new QUERY(this)
>    with (this.FISH_MB1)
>       left = 25.0
>       top = 4.0
>       width = 6.0
>       height = 1.0
>       sql = 'select * from "FISH_MB.dbf" where lower(name)  like lower(:ag)'
>       params["ag"] = "%"
>       active = true
>    endwith
>
>    with (this.FISH_MB1.rowset)
>       onNavigate = class::ROWSET_ONNAVIGATE
>    endwith
>
>    this.GRID1 = new GRID(this)
>    with (this.GRID1)
>       dataLink = form.fish_mb1.rowset
>       height = 6.16
>       left = 2.3333
>       top = 5.72
>       width = 50.5556
>    endwith
>
>    this.ENTRYFIELD1 = new ENTRYFIELD(this)
>    with (this.ENTRYFIELD1)
>       onKey = class::ENTRYFIELD1_ONKEY
>       height = 1.76
>       left = 24.1111
>       top = 12.76
>       width = 24.1111
>       value = ""
>    endwith
>
>    this.IMAGE1 = new IMAGE(this)
>    with (this.IMAGE1)
>       height = 4.0
>       left = 4.7143
>       top = 0.4545
>       width = 17.1429
>       dataSource = form.fish_mb1.rowset.fields["fish image"]
>    endwith
>
>    this.TEXTLABEL1 = new TEXTLABEL(this)
>    with (this.TEXTLABEL1)
>       height = 1.76
>       left = 0.7778
>       top = 12.76
>       width = 18.6667
>       text = "Search Fish By Name"
>    endwith
>
>    this.IMAGE2 = new IMAGE(this)
>    with (this.IMAGE2)
>       height = 4.0
>       left = 32.8571
>       top = 0.4545
>       width = 17.1429
>    endwith
>
>    this.rowset = this.fish_mb1.rowset
>
>    function ENTRYFIELD1_onKey(nChar, nPosition,bShift,bControl)
>       form.FISH_MB1.params['ag'] = '%'+this.value+'%'
>       try
>          form.FISH_MB1.requery()
>       catch(exception e)
>          form.FISH_MB1.requery()
>       endtry
>       form.image1.dataSource = form.FISH_MB1.rowset.fields["fish image"]
>       form.image2.dataSource = 'FILENAME  "'+trim(form.FISH_MB1.rowset.fields['jpg_path'].value)+'\'+form.FISH_MB1.rowset.fields['jpg_name'].value+'"'
>       return
>
>    function form_onOpen()
>       //Display image for first record when form opens
>       form.image2.dataSource = 'FILENAME  "'+trim(form.FISH_MB1.rowset.fields['jpg_path'].value)+'\'+form.FISH_MB1.rowset.fields['jpg_name'].value+'"'
>       return
>
>    function rowset_onNavigate(type, nRows)
>       this.parent.parent.image2.dataSource = 'FILENAME  "'+trim(this.fields['jpg_path'].value)+'\'+this.fields['jpg_name'].value+'"'
>       return
>
> endclass
>