Subject Re: Display Images on the form from a local imagefolder
From Mervyn Bick <invalid@invalid.invalid>
Date Sun, 1 Oct 2023 12:09:12 +0200
Newsgroups dbase.getting-started

On 2023/10/01 07:51, AGOSTINHO wrote:
> 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

It doesn't work (and should be giving an error) because "this" in the
code refers to the pushbutton and the pushbutton doesn't have any
fields.  A very common error in OODML programming.

You can change the folder that the dialogue looks at initially as well
as the type of file by changing the file skeleton passed to getfile()

    cFile = getfile("d:\folder1\folder2\*.jpg","Import mugshot image")

The user can still change the folder and the type of file displayed if
necessary.

I assume (my favourite exercise - jumping to conclusions :-) ) that,
before the user left-clicks on the pushbutton, the rowset's onNavigate
event handler has ensured that the image object is displaying the image
saved in the table or is blank because no value has been saved yet.  In
other words, the table's rowpointer is already on the record where the
image details are to be saved when the pushbutton is clicked.

The code below will save the selected image details to the table for
future display and will replace the existing (if any) image in the image
object immediately.

If the user selects an image from the dialogue, cFile will contain
something like  C:\folder1\folder2\whatever.jpg   As you are saving the
path and the filename in separate fields in the table you will need to
split the string at the last backslash.  RAT() to the rescue. :-)


  function PUSHBUTTON7_onClick()
     local cFile,cPath,cImage
     cFile = getfile( "*.jpg", "Import mugshot image" )
       //Change the skeleton to include the path if necessary.
     if "" # cFile
        //Save image details to table for future display.
        //This will replace an exiting image's details without warning.
      cPath = substr(cfile,1,rat('\',cFile)-1) //Remove last \
      cImage = substr(cFile,rat('\',cFile)+1)  //Remove last \
      form.rowset.fields['jpg_path'].value = cPath
      form.rowset.fields['jpg_name'].value = cImage
      form.rowset.save() //Not really necessary but an explicit save is
                         //preferable to relying on an implicit save.
        //Display selected image
      form.imagepotret1.dataSource = 'FILENAME '+ cPath+'\'+cImage
    endif
    return

Note that if the rowset you want to write the details to is not the
rowset that has been assigned to the form's rowset property you will
need to include the query name in the commands.

Mervyn.