Pro's and Contra's fom Resources or Coded screens

User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Pro's and Contra's fom Resources or Coded screens

Post by Marc Venken »

What is the general opinion for using Resources or coding screens ?

I see both many times passing in this Forum. Is there a Rule, or just as often, it is the like/dislike of the programmer.
Marc Venken
Using: FWH 20.08 with Harbour
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Pro's and Contra's fom Resources or Coded screens

Post by Carlos Mora »

IMHO, Resources have the advantage of being visually designed. Coding, that is made by hand, requires lots of trial and error. May be with practice you get fluent coding screens, but reading code you are not aware of how the form looks like.
In the other hand, the absolute coordinates systems in which the Windows dialog system is based on doesn't helps to deal with the different screen resolutions out there, it would be better sth like the one used by gtk. I think someone in this forum made some layout controls that mimics the behavior.
My personal option is resources, because it helps somehow to keep certain separation between the presentation layer and the business rules.

My 0,02 € :D

Regards
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by Carles »

Hi

Resources of course. Why ? Time and effort. And at the end the results is the same
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Pro's and Contra's fom Resources or Coded screens

Post by hmpaquito »

Hi,

Coding... of course, but ! a long time I designed relative screen position commands for to help to coding screens:

(R) = RELATIVE

Code: Select all

@ RSAY "Customer"
@ RGET oRec:Code

@ RSAY "Name" ;
    SEPARATOR
    
@ RGET oRec:Name

FEED RSAY

@ RSAY "Address"
@ RGET oRec:Address
 
My 2 pixels
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by Enrico Maria Giordano »

Marc Venken wrote:What is the general opinion for using Resources or coding screens ?

I see both many times passing in this Forum. Is there a Rule, or just as often, it is the like/dislike of the programmer.
For normal app development resources is far more comfortable. For special tool development (like data driven forms) coding is required. As usual, having both technique available is the best thing for a developer (thank you FWH!).

EMG
User avatar
Otto
Posts: 4470
Joined: Fri Oct 07, 2005 7:07 pm
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by Otto »

@hmpaquito
Hello,
can you please explain your (R) = RELATIVE.
This looks very interesting to me.

@ others in favour of resources.
How can you resolve the different formfactors and how to program "METRO" style.

Thanks in advance
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org

********************************************************************
User avatar
Silvio.Falconi
Posts: 4956
Joined: Thu Oct 18, 2012 7:17 pm

Re: Pro's and Contra's fom Resources or Coded screens

Post by Silvio.Falconi »

on win7 many lose of resource and I made only @x,y
I put on res only the bmps

My 0,01 € :shock:
I use : FiveWin for Harbour August 2020 (Revision) - Harbour 3.2.0dev (r1712141320) - Bcc7.30 - xMate ver. 1.15.3 - PellesC
User avatar
TimStone
Posts: 2536
Joined: Fri Oct 07, 2005 1:45 pm
Location: Trabuco Canyon, CA USA
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by TimStone »

I used the @ commands with dBase / Clipper for DOS. However, I never found a way to get consistent results with the @ commands under windows. I would love to use them, but my forms are very filled, and spacing is critical. I use Resources and have everything spaced uniformly. I can specify the exact size, and I use 20 pixel spacing between fields horizontally, and 5 pixel spacing between rows vertically.

I would love to use @ commands, but I have yet to see anything that shows us how to get the spacing correctly. It seems to vary based on the type of control. I need to handle labels, gets, dropdowns, checkboxes, browses, bitmap bars, etc.

Sometimes if I say @ 5,5, then I cannot now use @ 6,5. They overlap. Maybe someone could write a tutorial on how to get these uniform. I'd love it.

With that said, I do have some popups where I can use these, but it is all trial and error. Also, I find that differing controls can vary in height which looks rather poor to the client.

Tim
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by Armando »

Marc:

I think, the best way is that you feel more comfortable.

Regards
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
gkuhnert
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by gkuhnert »

hmpaquito,


are you willing to share your relative screen position commands / technique with us? Like Otto I'm very interested too!
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Pro's and Contra's fom Resources or Coded screens

Post by hmpaquito »

gkuhnert,

My technique about design form with code use extensivity preprocessor for hide design machine.

Cuore is ?

New Commands based in fwh commands.... is a new GUI


Problems ?

At begin was very hard design all commands.


How do it do ?

All is relative positions and sizes. So insert new says or get is very easy.


A piece .ch base:

Code: Select all

///////////////////////
// RelativePositions.Ch
//
//
///////////////////////////////////////////
*
#Define PIX_SEPARASAY 80

#Define PWG_ ( oGet:VarGet() )


#Define TMPW_(xNormal, xWord) ;
            xNormal:= If(xNulo_lWord , xNulo_oWord:xWord, xNormal)
#Define TMPW2_(xNormal, xWord) ;
            xNormal:= If(xNulo_lWord .AND. xNulo_oWord:xWord  != NIL, xNulo_oWord:xWord, xNormal)

#xcommand @ [<nRow>] [, <nCol>] ;
            RPSAY <cText> ;
            [<clauses,...>]                     ;
            [ <pict: PICT, PICTURE> <cPict> ] ;
            [ FONT <oFont> ]                    ;
            [ SIZE <nWidth>, <nHeight> ]        ;
            ;
            [ SEPARASAY <lSeparaSay> ];
            [ SUMCOLPIX <nSumColPix> ];
            [ PARRAFO <lParrafo>     ];
            [ ADJUSTLEFT <lAdjustLeft> ] ;
            [ DOBLELINEA <lDobleLinea> ] ;
            [ GETWORD <lGetWord>] ;
            [ MAXWORD    <lMaxWord>            ] ;
            [ CODIGOWIDTH <nCodigoWidth>       ] ;
            [ GETPARRAFO <lGetParrafo>] ;
            [ COLORFORE <nColorFore>] ;
            [ COLORBACK <nColorBack>] ;
            ;
            => ;
            ;
            xNulo_lWord:= .F.;;
            [xNulo_lWord:= <lGetWord>;];
            ;
            xNulo_nCodigoWidth:= NIL;;
            [xNulo_nCodigoWidth:= If(<lMaxWord>, 1, NIL) ;];
            [xNulo_nCodigoWidth:= <nCodigoWidth> ;] ;
            ;
            oCnt:nActualListaWord:= xNulo_nCodigoWidth ;;
            ;
            xNulo_oWord:= If(xNulo_lWord, oCnt:GetWord(), NIL) ;;
            ;
            xNulo_cTextParrafo:= NIL                                        ;;
            [xNulo_cTextParrafo:= If(<lGetParrafo>, oCnt:GetParrafo(), NIL) ;];
            ;
            ;
            ;
            oCnt:xNulo_cText:= <cText>;;
            TMPW_(oCnt:xNulo_cText, cText) ;;
            oCnt:xNulo_cText:= If(xNulo_cTextParrafo != NIL, xNulo_cTextParrafo, oCnt:xNulo_cText) ;;
            ;
            xNulo_cPicture:= NIL;;
            [xNulo_cPicture:= <cPict>;];
            TMPW_(xNulo_cPicture, cPicture);;
            ;
            ;
            xNulo_lDobleLinea:= NIL;;
            [xNulo_lDobleLinea:= <lDobleLinea>;];
            TMPW_(xNulo_lDobleLinea, lDobleLinea);;
            ;
            xNulo_lParrafo   := .f. [.OR. <lParrafo>] [.OR. <lGetParrafo>] ;;
            ;
            xNulo_lAdjustLeft:= .f. [ .OR. <lAdjustLeft>] ;;
            xNulo_lAdjustLeft:= xNulo_lAdjustLeft .OR. (xNulo_lParrafo .AND. !<.lAdjustLeft.>) ;;
            ;
            xNulo_oArea:= oCnt:oArea                                         ;;
            ;
            xNulo_oFont:= If(<.oFont.>, <oFont>, oCnt:CtlSayDefFont(xNulo_lParrafo))         ;;
            TMPW2_(xNulo_oFont, oFont);;
            ;
            xNulo_aSize:= oCnt:CtlSayDefSize(oCnt:xNulo_cText, <cPict>, <nWidth>, <nHeight>, xNulo_oFont, xNulo_lDobleLinea, xNulo_nCodigoWidth)     ;;                       ;;
            TMPW_(xNulo_lDobleLinea, lDobleLinea);;
            xNulo_nRow:=           oCnt:CtlSayRow(<nRow>)                                                              ;;
            xNulo_nRowDobleLinea:= oCnt:CtlSayRowAjuDobleLinea(xNulo_lDobleLinea, xNulo_oWord)                                                              ;;
            ;
            xNulo_nCol:= If(<.nCol.>,  <nCol>,  oCnt:UltRight()) ;;
           [xNulo_nCol+= If(<lSeparaSay>, oCnt:SeparaSay(), 0) ;];
           [xNulo_nCol+= <nSumColPix> ;];
            xNulo_nCol:= If(xNulo_lAdjustLeft, If(xNulo_lParrafo, oCnt:MarginLeftParrafo(), oCnt:MarginLeft()), xNulo_nCol)             ;;
            ;
            oCnt:ToPos(xNulo_nRow, xNulo_nCol+ xNulo_aSize\[1\])                              ;;
            ;
            xNulo_nRow+= xNulo_nRowDobleLinea;;
            ;
            ;
            ;
          @ xNulo_nRow, xNulo_nCol    SAY oCnt:xNulo_cText ;
            [<clauses>]                                     ;
            PICTURE xNulo_cPicture                          ;
            OF xNulo_oArea                                  ;
            FONT xNulo_oFont                                ;
            PIXEL                                           ;
            ;
            ;
            ;
            ;
            COLOR (If(.f. [.OR. <lGetParrafo>], oCnt:nClrParrafoFore, oCnt:nClrSayFore) [, <nColorFore>]), ( xNulo_oArea:nClrPane [, <nColorBack>] );
            SIZE xNulo_aSize\[1\], xNulo_aSize\[2\]         ;
            ;;
            If(xNulo_lParrafo, oCnt:SetPagePanel(), NIL)



#Trans VALFUN_(<oCnt>, [<ValidFunc>], [<PreValidFunc>], [<PostValidFunc>], [<SetSeModificoFunc>], [<lAsignaSeModifico>]) => ;
  {|oGet, lPaso|;
  lPaso:= ThFunValidGet(oGet, <oCnt>, <.ValidFunc.>, <.PreValidFunc.>, <.PostValidFunc.>,;
    {|oGet| nil[, <ValidFunc>]}, {|oGet| nil[, <PreValidFunc>]}, {|oGet, lSeModificoGet| nil[, <PostValidFunc>]}),;
  If(!<.lAsignaSeModifico.> [.OR. <lAsignaSeModifico>], <oCnt>:AsignaSeModifico(oGet), nil),;
                                 ;
                                 ;
  lPaso}

#command @  RPGET <uVar> ;
            [<clauses,...>                        ] ;
            [ <pict: PICT, PICTURE> <cPict>       ] ;
            ;
            ;
            ;
            [ ANCHO <nAncho>                      ] ;
            [ SOLONUMEROS <lSoloNumeros>          ] ;
            [ NAME <cName>                        ] ;
            ;
            ;
            [PREVALID <PreValidFunc>              ] ;
            [VALID <ValidFunc>                    ] ;
            [POSTVALID <PostValidFunc>            ] ;
            [OBLIGATORIO <lObligatorio>           ] ;
            [bOBLIGATORIO <lbObligatorio>         ] ;
            [SETSEMODIFICO <SetSeModificoFunc>    ] ;
            [ASIGNASEMODIFICO <lAsignaSeModifico> ] ;
            [NAMEGET_NOMBRE   <cNameGetNombre>    ] ;
            [ONPOSTSELECCION  <bPostSeleccion>    ] ;
            [OBJVAR           <oObjVar>           ] ;
            [TOAST            <bToast>            ] ;
            => ;
            ;
            xNulo_oGet := NIL;;
            ;
            xNulo_oArea:= oCnt:oArea                 ;;
            xNulo_oFont:= oCnt:CtlGetDefFont()          ;;
            xNulo_aSize:= oCnt:CtlGetDefSize(<uVar>, <cPict>, NIL, NIL, xNulo_oFont, <nAncho>, <lSoloNumeros>)     ;;
            xNulo_nRow:= oCnt:UltTop()              ;;
            ;
            xNulo_nCol:= oCnt:UltRight()                     ;;
            xNulo_nCol+= oCnt:SepSayGet();;
            ;
            ;
            oCnt:ToPos(NIL, xNulo_nCol+ xNulo_aSize\[1\])                              ;;
            ;
            ;
         @ xNulo_nRow, xNulo_nCol GET xNulo_oGet VAR <uVar> ;
            [<clauses>]                                ;
            [ PICTURE <cPict> ] ;
            VALID {|oGet, lRet| lRet:= Eval(VALFUN_(oCnt, <ValidFunc>, <PreValidFunc>, <PostValidFunc>, <SetSeModificoFunc>, <lAsignaSeModifico>), oGet), lRet  };
            OF xNulo_oArea    ;
            COLOR "N*/W" ;
            PIXEL        ;
            NOBORDER ;
            SIZE xNulo_aSize\[1\], xNulo_aSize\[2\] ;
            FONT xNulo_oFont                        ;;
            ;
            [<oObjVar>:= oClone(xNulo_oGet)         ;];
            ;
            xNulo_oGet:cVarName:= DepuraName(<(uVar)>) ;;
            [xNulo_oGet:cVarName:= <cName>          ;];
            If(<.cName.>, oCnt:DefineBtnGet(xNulo_oGet, <cNameGetNombre>, <bPostSeleccion>), NIL);;
            xNulo_oGet:oGet:Cargo:= CargoGetClip() ;;
            xNulo_oGet:oGet:Cargo:xOriginal1:= <uVar> ;;
            xNulo_oGet:oGet:Cargo:xOriginal2:= <uVar> ;;
            [xNulo_oGet:bToast:= <bToast> ]



// Como comando GET con _
#command @ [<nRow>] [, <nCol>] RPASOCIADO [ <oGet> VAR ] <uVar> ;
            [ <dlg: OF, WINDOW, DIALOG> <oWnd> ] ;
            [ <pict: PICT, PICTURE> <cPict> ] ;
            [ VALID <ValidFunc> ] ;
            [ <color:COLOR,COLORS> <nClrFore> [,<nClrBack>] ] ;
            [ SIZE <nWidth>, <nHeight> ]  ;
            [ FONT <oFont> ] ;
            [ <design: DESIGN> ] ;
            [ CURSOR <oCursor> ] ;
            [ <pixel: PIXEL> ] ;
            [ MESSAGE <cMsg> ] ;
            [ <update: UPDATE> ] ;
            [ WHEN <uWhen> ] ;
            [ <lCenter: CENTER, CENTERED> ] ;
            [ <lRight: RIGHT> ] ;
            [ ON CHANGE <uChange> ] ;
            [ <readonly: READONLY, NO MODIFY> ] ;
            [ <pass: PASSWORD> ] ;
            [ <lNoBorder: NO BORDER, NOBORDER> ] ;
            [ <help:HELPID, HELP ID> <nHelpId> ] ;
            [ ACTION <uAction> ] ;
            [ BITMAP <cBmpName> ] ;
            [ CUEBANNER <cCueText> ] ;
            ;
            ;
            ;
            [ ANCHO <nAncho>                      ] ;
            [ SOLONUMEROS <lSoloNumeros>          ] ;
            [ ASOCIADOINTENSO  <lAsociadoIntenso>             ] ;
            [ ASOCIADOINTENSO2 <lAsociadoIntenso2>            ] ;
       => ;
            ;
            xNulo_oArea:= oCnt:oArea                 ;;
            xNulo_oFont:= oCnt:CtlGetDefFont()          ;;
            xNulo_aSize:= oCnt:CtlGetDefSize(<uVar>, <cPict>, NIL, NIL, xNulo_oFont, <nAncho>, <lSoloNumeros>)     ;;
            xNulo_nRow:= oCnt:UltTop()              ;;
            ;
            xNulo_nCol:= oCnt:UltRight()                     ;;
            xNulo_nCol+= oCnt:SepSayGet();;
            ;
            oCnt:ToPos(NIL, xNulo_nCol+ xNulo_aSize\[1\])                              ;;
            ;
            ;
            xNulo_lReadOnly:= .t.;;
            xNulo_lNoBorder:= (.T.             [,     !<lAsociadoIntenso> ] );;
            xNulo_lNoBorder:= (xNulo_lNoBorder [.AND. !<lAsociadoIntenso2>] );;
            ;
            ;
            ;
            xNulo_oGet:=  TGet():New( xNulo_nRow, xNulo_nCol, <{uVar}>,;
             xNulo_oArea, xNulo_aSize\[1\], xNulo_aSize\[2\], <cPict>, <{ValidFunc}>,;
             <nClrFore>, <nClrBack>, xNulo_oFont, <.design.>,;
             <oCursor>, .t., <cMsg>, <.update.>, \{|| .f. \},;
             <.lCenter.>, <.lRight.>,;
             [\{|nKey, nFlags, Self| <uChange>\}], xNulo_lReadOnly,;
             <.pass.>, xNulo_lNoBorder, <nHelpId>,,,,,, [\{|self| <uAction> \}],;
             <cBmpName>, [<(oGet)>], [<cCueText>],;
             nil, nil, nil,;
         .t., <lAsociadoIntenso>, <lAsociadoIntenso2> );;
             ;
             [<oGet>:= xNulo_oGet;];
             oCnt:AddCtlAsociado(xNulo_oGet)
 


A small sample:

Code: Select all

//-------------------------------------------------------------------------//
FUNCTION ControlDesign(oCnt)

SET VSEPARATION TO 10  // Vertical Separation by default
SET HSEPARATION TO 8   // Horizontal Separation inter Says

@ 2, 1 RPSAY "Customer"
@ PWTGET oPid:oVar:cCli;
  POSTVALID oPid:EnableDisableBtnOkCancel() ;
  NAME "CUSTOMER_CODE" ;
  ONPOSTSELECCION {|oGet| oPid:EnableDisableBtnOkCancel()}
@ RPASOCIADO BUS2_CLIENT(oPid:oVar:cCli, NomCli)


oCnt:FeedSay()
@ RPSAY "Name";
  GETWORD .T.;
  ADJUSTLEFT .T. ;
  MAXWORD .T.
@ RPGET oRec:NameCli;
  PICTURE "@S35" ;
  NAME "NameCli"

oCnt:Activate()

RETURN NIL
User avatar
gkuhnert
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by gkuhnert »

hmpaquito,
thank you very much. I will try, see and learn :-)
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by Antonio Linares »

You can easily use relative coordinates this way:

Code: Select all

#include "FiveWin.ch"

function Main()

   local nRow := ScreenHeight() / 80
   local nCol := ScreenWidth() / 120
   local oDlg, cName := Space( 10 ), cAddress := Space( 15 )

   DEFINE DIALOG oDlg SIZE nCol * 30, nRow * 20
   
   @ nRow * 1.2, nCol * 2 SAY "Name:" OF oDlg PIXEL

   @ nRow * 1, nCol * 5 GET cName OF oDlg PIXEL

   @ nRow * 3.2, nCol * 2 SAY "Address:" OF oDlg PIXEL

   @ nRow * 3, nCol * 5 GET cAddress OF oDlg PIXEL

   ACTIVATE DIALOG oDlg CENTERED

return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Marc Venken
Posts: 727
Joined: Tue Jun 14, 2016 7:51 am

Re: Pro's and Contra's fom Resources or Coded screens

Post by Marc Venken »

Use both systems will be best. In my 16 bit version I use these from recources : (preparing conversion to FWH)

Image

Image

But as Otto asked, These cannot by resized on the fly?

If I want to pimp design (More color and so) that is not done in (Pelles), but with code changing the object as far as I see code ?

Larger screens will be Recources
Little = coding.

Thanks for all replies.
Marc Venken
Using: FWH 20.08 with Harbour
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Pro's and Contra's fom Resources or Coded screens

Post by Carles »

Marc,

Larger screens = Resources
Little = Resources

Believe me :wink:

C.
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
Post Reply