Page 1 of 1
change or put an image
Posted: Tue Oct 18, 2016 9:19 pm
by plantenkennis
I have a window with several tabs. On one tab I can put up to 15 small images. With a button I can select a new image to put on this tab. But how do I show this image? I have tried using setimage(), but that gives an error. Here is my code:
Code: Select all
*tab 3, in array aFotoNaam are the names of the images
nRowPaint := 450
nColumn := 10
nfotoToon := 1
FOR r = 1 TO 3
FOR k = 1 TO 5
cImage := aFotoNaam[nFotoToon]
oImgName := 'oImg' + ALLTRIM(STR(nFoto))
@ nRowPaint, nColumn IMAGE &oImgName FILENAME cImage OF oFld:aControls[ 3 ] SIZE 110, 110
nColumn := nColumn + 120
nFotoToon++
NEXT
nColumn := 10
nRowPaint := nRowPaint - 120
NEXT
@ 40, 650 BUTTON "New photo" OF oFld:aDialogs[ 3 ] ACTION RK_SelectFoto(nPlantnum) SIZE 120, 30
FUNCTION RK_SelectFoto(nPlantnum)
*to select a picture, resize it and place it in the right folder
*28-09-2016
LOCAL oWndFoto, oBtnOK
LOCAL oFoto
LOCAL cFoto := ''
LOCAL cKopie := ''
LOCAL nMaxWidth := 1000
LOCAL nMaxHeight := 800
LOCAL nFotoWidth
LOCAL nFotoHeight
LOCAL nFactor := 0
*choose photo
cFoto := ChooseFile( "Selecteer een foto", "jpg" )
IF LEN(ALLTRIM(cFoto)) > 0
nFoto++
cKopie := cPath + '/temp/' + ALLTRIM(STR(nPlantnum+nFoto)) + '.jpg'
*define a window to check the size of the photo
DEFINE DIALOG oWndFoto TITLE "grote foto" ;
FROM 0, 0 TO 800, 800
@ 40, 10 IMAGE oFoto FILENAME cFoto OF oWndFoto SIZE 640, 480
*check the size of the photo
nFotoWidth := oFoto:GetWidth()
nFotoHeight := oFoto:GetHeight()
*if the photo is too wide, set the right width
IF nFotoWidth > 1000
nFactor := 1000 / nFotoWidth
nFotoWidth := 1000
nFotoHeight := ROUND(nFotoHeight * nFactor, 0)
ENDIF
*if the photo is still to high, set the right height
IF nFotoHeight > 800
nFactor := 800 / nFotoHeight
nFotoHeight := 800
nFotoWidth := ROUND(nFotoWidth * nFactor, 0)
ENDIF
*now rescale the IMAGE
oFoto:SetSize( nFotoWidth, nFotoHeight )
oFoto:SetScaling( 1 )
oWndFoto:SetSize( nFotoWidth + 20, nFotoHeight + 40 )
@ 10, nFotoWidth BUTTON oBtnOK PROMPT "Ok" OF oWndFoto ACTION oWndFoto:End()
ACTIVATE DIALOG oWndFoto
*and save the rescaled image in the temp folder
SaveImageFromImage( cFoto, cKopie, nFotoWidth, nFotoHeight )
*add the name to the foto array
aFotoNaam[nFoto] := cKopie
*show the new image
oImgName := 'oImg' + ALLTRIM(STR(nFoto))
* &oImgName:setImage( cKopie )
ImgSetNSImage(::oDlgChange,cKopie)
ENDIF
RETURN
René
Re: change or put an image
Posted: Tue Oct 18, 2016 10:42 pm
by Antonio Linares
René,
Please update the repository and I will pull it and check it
Re: change or put an image
Posted: Wed Oct 19, 2016 6:06 pm
by Antonio Linares
Please use the message SetFile() instead of SetImage()
Re: change or put an image
Posted: Wed Oct 19, 2016 6:14 pm
by plantenkennis
Hello Antonio,
I have updated the repository.
The problem is the use of the &oImg. The program awnsers with Not Defined?
René
Re: change or put an image
Posted: Wed Oct 19, 2016 6:46 pm
by Antonio Linares
René,
Please try it this way:
Code: Select all
@ 40, 650 BUTTON "New photo" OF oFld:aDialogs[ 3 ] ACTION RK_SelectFoto(nPlantnum, &oImgName ) SIZE 120, 30
...
FUNCTION RK_SelectFoto( nPlantnum, oImgName )
...
oImgName:setImage( cKopie )
RETURN
Re: change or put an image
Posted: Fri Oct 21, 2016 9:26 am
by plantenkennis
Hello Antonio,
This code does not work. I get an error: Code block contains both macro and declared symbol references 'NPLANTNUM'
I will try some other things next days
Regards,
René
Re: change or put an image
Posted: Fri Oct 21, 2016 9:38 am
by Antonio Linares
In which of the 15 images the new image should be placed at ?
Re: change or put an image
Posted: Fri Oct 21, 2016 10:46 am
by plantenkennis
Hello Antonio,
In which image it should be placed is depending on the number of photo's I have from that plant. So if a plant has 3 photo's, the new image should be placed on number 4.
I will try another approach be defining several buttons where I can add a new image. By hiding most of them and using the function to work with macro substitution it will work, I hope.
Regards,
René
Re: change or put an image
Posted: Fri Oct 21, 2016 7:49 pm
by Antonio Linares
René,
> the number of photo's I have from that plant
if you know such number in advance then you can do:
{ oImage1, ..., oImage15 }[ nNewPhoto ]:SetFile( cFileName )
Re: change or put an image
Posted: Tue Oct 25, 2016 8:52 pm
by plantenkennis
Hello Antonio,
The action with arrays did not work, but I have another solution:
I create buttons under the picture and with these buttons I can move an image and add or delete one. But how can I disable or enable a BTNBMP. This works with BUTTON, but not with BTNBMP. But the bAction works with BTNBMP but not with BUTTON?
Here is my code:
Code: Select all
FOR r = 1 TO 3
FOR k = 1 TO 5
cImage := cPath + "/temp/" + ALLTRIM(STR(nPlantnum + r*k)) + ".jpg"
oImgName := 'oImg' + ALLTRIM(STR(r*k))
oBtnLeftName := 'oBtnLeft' + ALLTRIM(STR(r*k))
oBtnRightName := 'oBtnRight' + ALLTRIM(STR(r*k))
oBtnNewName := 'oBtnNew' + ALLTRIM(STR(r*k))
oBtnDelName := 'oBtnDel' + ALLTRIM(STR(r*k))
@ nRowPaint, nColumn IMAGE &oImgName FILENAME cImage OF oFld:aControls[ 3 ] SIZE 110, 110
&oImgName:setframe()
@ nRowPaint-40, nColumn BTNBMP &oBtnLeftName OF oFld:aControls[ 3 ] FILENAME ImgPath()+"Left.png" SIZE 35, 35 STYLE 2 TOOLTIP "Foto naar links"
&oBtnLeftName:bAction := CreateBlock(oBtnLeftName)
@ nRowPaint-40, nColumn+40 BTNBMP &oBtnNewName OF oFld:aControls[ 3 ] FILENAME ImgPath()+"Add.png" SIZE 35, 35 STYLE 2 TOOLTIP "Nieuwe foto"
&oBtnNewName:bAction := CreateBlock(oBtnNewName)
@ nRowPaint-40, nColumn+40 BTNBMP &oBtnDelName OF oFld:aControls[ 3 ] FILENAME ImgPath()+"Delete.png" SIZE 35, 35 STYLE 2 TOOLTIP "Verwijder Foto"
&oBtnDelName:bAction := CreateBlock(oBtnDelName)
@ nRowPaint-40, nColumn+80 BTNBMP &oBtnRightName OF oFld:aControls[ 3 ] FILENAME ImgPath()+"Right.png" SIZE 35, 35 STYLE 2 TOOLTIP "Foto naar rechts"
&oBtnRightName:bAction := CreateBlock(oBtnRightName)
nColumn := nColumn + 130
NEXT
nColumn := 10
nRowPaint := nRowPaint - 150
NEXT
RK_SetButtons()
*************************************************
FUNCTION RK_SetButtons()
FOR n = 1 TO 15
oBtnLeftName := 'oBtnLeft' + ALLTRIM(STR(n))
oBtnRightName := 'oBtnRight' + ALLTRIM(STR(n))
oBtnNewName := 'oBtnNew' + ALLTRIM(STR(n))
oBtnDelName := 'oBtnDel' + ALLTRIM(STR(n))
IF n == 1
oBtnLeftName:Disable()
ENDIF
IF n < nFoto
oBtnNewName:Disable()
ENDIF
IF n == nFoto
oBtnRightName:Disable()
ENDIF
IF n > nFoto
oBtnLeftName:Disable()
oBtnRightName:Disable()
oBtnDelName:Disable()
oBtnNewName:Disable()
ENDIF
NEXT
oBtnNewName := 'oBtnNew' + ALLTRIM(STR(nFoto+1))
oBtnNewName:Enable()
RETURN NIL
I have pushed my latest code to BitBucket
Rene
Re: change or put an image
Posted: Sat Oct 29, 2016 3:17 pm
by plantenkennis
Hello Antonio,
I have taken a complete new approach for the adding and changing images. Instead of showing all the images at once I put the names of the images in an array and show one of the images when i click on an item of a listbox. Now I am able to disable and enable buttons. Here is the code I now use:
Code: Select all
@ 140, 10 LISTBOX oBrwFoto FIELDS "", "" ;
HEADERS "Fotos", "" ;
OF oFld:aDialogs[ 3 ] SIZE 150, 400
oBrwFoto:SetArray( aFotoChange )
oBrwFoto:bLine = { | nRow | IF( nRow <= Len( aFotoChange ), aFotoChange[ nRow ], { "", "" } ) }
oBrwFoto:SetColWidth( 1, 150 )
oBrwFoto:SetColWidth( 2, 0 )
oBrwFoto:SetColEditable( 2, .F. )
oBrwFoto:SetColor( OwnClrGreen, OwnClrYellow )
oBrwFoto:Select( 1 )
oBrwFoto:bChange := { | obj , nindex| oImgChange:SetFile(aFotoChange[obj:nRowPos(), 2]), nRowSelected := obj:nRowPos(), IF(nRowSelected == 1, oBtnUp:Disable(), oBtnUp:Enable()), IF(nRowSelected == LEN(aFotoChange), oBtnDown:Disable(), oBtnDown:Enable())}
@ 40, 200 IMAGE oImgChange FILENAME aFotoChange[1,2] OF oFld:aControls[ 3 ] SIZE 500, 500
oImgChange:setframe()
@ 100, 10 BUTTON oBtnNew PROMPT '' OF oFld:aControls[ 3 ] ACTION RK_SelectFoto() FILENAME ImgPath()+"Add.png" SIZE 35, 35 STYLE 2
@ 100, 50 BUTTON oBtnDel PROMPT '' OF oFld:aControls[ 3 ] ACTION RK_DeletePict(nRowSelected) FILENAME ImgPath()+"Delete.png" SIZE 35, 35 STYLE 2
@ 100, 90 BUTTON oBtnUp PROMPT '' OF oFld:aControls[ 3 ] ACTION RK_MovePict(nRowSelected, -1) FILENAME ImgPath()+"Up.png" SIZE 35, 35 STYLE 2
@ 100, 130 BUTTON oBtnDown PROMPT '' OF oFld:aControls[ 3 ] ACTION RK_MovePict(nRowSelected, 1) FILENAME ImgPath()+"Down.png" SIZE 35, 35 STYLE 2
IF nFoto == 15
oBtnNew:Disable()
ENDIF
FUNCTION RK_SelectFoto()
*to select a picture, resize it and place it in the right folder
*28-09-2016
LOCAL oWndFoto, oBtnOK
LOCAL oFoto
LOCAL cFoto := ''
LOCAL nMaxWidth := 1000
LOCAL nMaxHeight := 800
LOCAL nFotoWidth
LOCAL nFotoHeight
LOCAL nFactor := 0
*choose photo
cFoto := ChooseFile( "Selecteer een foto", "jpg" )
IF LEN(ALLTRIM(cFoto)) > 0
nFoto++
cKopie := cPath + '/temp/' + ALLTRIM(STR(nPlantnum+nFoto)) + '.jpg'
*define a window to check the size of the photo
DEFINE DIALOG oWndFoto TITLE "grote foto" ;
FROM 0, 0 TO 800, 800
@ 40, 10 IMAGE oFoto FILENAME cFoto OF oWndFoto SIZE 640, 480
*check the size of the photo
nFotoWidth := oFoto:GetWidth()
nFotoHeight := oFoto:GetHeight()
*if the photo is too wide, set the right width
IF nFotoWidth > 1000
nFactor := 1000 / nFotoWidth
nFotoWidth := 1000
nFotoHeight := ROUND(nFotoHeight * nFactor, 0)
ENDIF
*if the photo is still to high, set the right height
IF nFotoHeight > 800
nFactor := 800 / nFotoHeight
nFotoHeight := 800
nFotoWidth := ROUND(nFotoWidth * nFactor, 0)
ENDIF
*now rescale the IMAGE
oFoto:SetSize( nFotoWidth, nFotoHeight )
oFoto:SetScaling( 1 )
oWndFoto:SetSize( nFotoWidth + 20, nFotoHeight + 40 )
@ 10, nFotoWidth-100 BUTTON oBtnOK PROMPT "Ok" OF oWndFoto ACTION oWndFoto:End()
ACTIVATE DIALOG oWndFoto
*and save the rescaled image in the temp folder
SaveImageFromImage( cFoto, cKopie, nFotoWidth, nFotoHeight )
AADD(aFotoChange, {'foto '+ ALLTRIM(STR(nFoto)), cKopie} )
oBrwFoto:Refresh()
oBrwFoto:Select( nFoto )
oBrwFoto:SetFocus()
IF nFoto == 15
oBtnNew:Disable()
ENDIF
ENDIF
RETURN
*************************************************
FUNCTION RK_MovePict(nFotoNum, nMove)
*LOCAL cBestand1 := cPath + '/temp/' + ALLTRIM(STR(nPlantnum + nFotonum)) + '.jpg'
*LOCAL cBestand2 := cPath + '/temp/' + ALLTRIM(STR(nPlantnum + nFotonum +nMove)) + '.jpg'
LOCAL cBestand1 := aFotoChange[nFotoNum,2]
LOCAL cBestand2 := aFotoChange[nFotoNum+nMove,2]
LOCAL cTemp := cPath + '/temp/temp.jpg'
COPY FILE &cBestand1 TO &cTemp
IF FERASE(cBestand1) <> 0
MsgInfo('fout bij het verplaatsen van de foto')
ENDIF
COPY FILE &cBestand2 TO &cBestand1
IF FERASE(cBestand2) <> 0
MsgInfo('fout bij het verplaatsen van de foto')
ENDIF
COPY FILE &cTemp TO &cBestand2
IF FERASE(cTemp) <> 0
MsgInfo('fout bij het verplaatsen van de foto')
ENDIF
aFotoChange[nFotoNum,2] := cBestand1
aFotoChange[nFotoNum+nMove,2] := cBestand2
oBrwFoto:Refresh()
oBrwFoto:Select( nFotoNum+nMove )
oBrwFoto:SetFocus()
RETURN
*************************************************
Re: change or put an image
Posted: Sat Oct 29, 2016 6:39 pm
by Antonio Linares
René,
great!
Is it working fine then now ?
Re: change or put an image
Posted: Sun Oct 30, 2016 4:27 pm
by plantenkennis
Hello Antonio,
Yes, the solution I have made is perfect.
"Sometimes, if things don't work the way you want, want them the way they work."
Again I am one step further in developing my program.
René
Re: change or put an image
Posted: Sun Oct 30, 2016 7:54 pm
by Antonio Linares
very good