PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Base class uses method from derived class
Base class uses method from derived class
Started by Paulus604, Jul., 24 2020 9:58 PM - 4 replies
Registered member
4 messages
Posted on July, 24 2020 - 9:58 PM
Hi, as I am new with WinDev I encounter next challenge:
in Base Class I made a void method, eg : HEADER
I need the Base Class to use the actual method from the derived Class, also named HEADER,

So in Base and Derived Class I wrote (but his doesn't work):
MakeDoc is Class
...
procedure virtual HEADER( )
// no code
...
procedure AddPage( )
...
Header( ) // at this place the method of the derived class need to be used
....
=================
Derived Class:
ActualDoc is MakeDoc
...
Procedure HEADER( ) // actual Method to be used by base class AddPage() !!
Trace("making header")
...
ActualDoc.Addpage( )

(Normally you override a Base-Method from the Derived Class, with a method IN the derived class.
Here I need to override a Base-Method within the Base Class, with a method IN the derived class.)
Thanks
Paul
Registered member
123 messages
Popularité : +7 (9 votes)
Posted on August, 04 2020 - 5:45 PM
Hi Paulus

There are some issues with your declarations...
And I think that what you want to do doesn't make any sense design wise.
Why would you want to force a method in a derived class from the base class?
Conceptually this doesn't make any sense but I think it can be done either by interfaces or by declaring the derived class in the base class which completely bullocks I guess...

This is how this should be designed where you instantiate the class that you want to run the method for...
MakeDoc is Class
VIRTUAL Procedure Header()
VIRTUAL Procedure AddPage()

ActualDoc is Class
inherits MakeDoc
Procedure Header()
Procedure AddPage()

DocVar is ActualDoc
DocVar.Header()


--
Peter Holemans
www.mcs2.eu
www.pixontri.eu
Registered member
4 messages
Posted on August, 18 2020 - 10:38 PM
Hello Peter, Thanks for your input. I will try to explane more:
I'm rewriting code from Visual Objects (C++ ish) to Windev. In VO it works: Method HEADER()/FOOTER() as void pascal Class MakeDoc.
In ActualDoc I create method HEADER()/FOOTER() with code of the base class (Like CELL / SETFONT / LINE / SETX / ..).
In the method AddPage() I need to paste (somewhere on top and in the middle) the code from FOOTER and HEADER.
So, if I ripp out Addpage, I need to be very carefull with the code, because most variables are global in the Base class.
The only methods from outside class MakeDoc are Header and Footer!
Also splitting up AddPage is not recommendable, because of these local variables. If I do so, calling a method from MakeDoc fails (error).

The cleanest way is to give priority to ActualDoc.Header, instead of MakeDoc.Header. I would think the VIRTUAL declaration would do the trick. Why else "Virtual"?

What I see in ProjectExplorer: HEADER and FOOTER having also a V in the icon ????? How can I get remove that?




I Hope I made it somewhat more clear what I need to make..: making ACTUALDOC.HEADER() visible.

----------------------------------------------
IN MAKEDOC (base)
Procedure PUBLIC AddPage()
LOCAL
l_family, l_style, l_dc, l_fc, l_tc is string
l_size, l_lw is real
l_cf is boolean

//Start a new page
l_family = m_sV_fontfamily
l_style = m_sV_fontStyle
l_size = m_rV_fontsizept
l_lw = m_rV_linewidth
l_dc = m_sV_drawcolor
l_fc = m_sV_fillcolor
l_tc = m_sV_textcolor
l_cf = m_bV_colorflag
IF m_nxV_page>0 THEN
//Page footer
m_bV_infooter = True
FOOTER()
m_bV_infooter = False
//Close page
_endpage()
END
//Start new page
_beginpage()
//Set line cap style to square
_out("2 J")
//Set line width
_out(_fmtreal(l_lw, 4) + " w")
//set font
IF Length(l_family) > 0 THEN
Setfont(l_family,l_style,l_size)
END
//Set colors
IF l_dc <> "0 G"
_out(l_dc)
END
IF l_fc <> "0 g" THEN
_out(l_fc)
END
m_sV_textcolor = l_tc
m_bV_colorflag = l_cf
//Page header
HEADER()
//Restore line width
IF m_rV_linewidth <> l_lw
m_rV_linewidth = l_lw
_out(_fmtreal(l_lw, 4) + " w")
END
//Restore font
IF Length(l_family) > 0 THEN
Setfont(l_family, l_style, l_size)
END
//Restore colors
IF m_sV_drawcolor <> l_dc THEN
m_sV_drawcolor = l_dc
_out(l_dc)
END
IF m_sV_fillcolor <> l_fc THEN
m_sV_fillcolor = l_fc
_out(l_fc)
END
m_sV_textcolor = l_tc
m_bV_colorflag = l_cf


---------------------------------------
IN ACTUALDOC (derived):
Procedure HEADER()
Trace("header in uitvoering")
Cell(190,12,"KOPSTUK",0,1,"C")


Procedure Footer()
Trace("footer in uitvoering")
Cell(190,12,"VOETSTUK",0,1,"C")
Registered member
4 messages
Posted on August, 25 2020 - 10:36 PM
Meanwhile in the Netherlands.....
Problem solved! As I was used to instantiate direct form a class and add the overload method there, in Windev you need an extra step.
So:
MakeDoc is class
//[base]; here you find Virtual Header and Virtual Footer

AllmostDoc is class inherits from Makedoc
//[derived]; overload the methods HEADER and FOOTER here

ActualDoc is AllmostDoc
//[instantiated]
// ... add the rest of the programm using the base-class methods, like: ActualDoc.Cell(....) or ActualDoc.Output(..)

Thanks all!
Registered member
4 messages
Posted on August, 25 2020 - 10:38 PM
As mentioned by Peter! I Almost forgot...