2008-04-24

FoxCharts 0.14 ALPHA released !

i'm happy to announce that foxcharts has recently been accepted as a vfpx project.


today i've just uploaded to vfpx at codeplex a new version of foxcharts. this is version 0.14 - still alpha - not for production !


prerequisites:
visual foxpro 9 and the gdiplusx library from vfpx 


first of all i have to thank you all for your kind comments and feedback you provided in my last post. i had never expected to receive so many comments, in this blog, at the other vfp forums and by email. i really apreciated that. be sure that your feedback resulted in a superpowered motivation to improve it.


it is also important to tell everybody of the importance that both bo durban and craig boyd have in this project. they are the menthors and fathers of gdiplusx. without gdiplusx this project would become almost impossible. if i had to use any other of the gdi+ classes available for vfp, for sure it would have taken much more time - believe-me, i've tried them all.


using gdiplusx i can be indeed much more productive. once you understand how it works, things become really easy and simple.


at first sight, when i saw one of the first versions that bo and craig designed for gdiplusx i was really amazed, and i said to myself - i have to go deeper into this.


bo durban has also provided important help, providing important suggestions, support and testing. thanks also to emersonreed, luis maria guayan and leandro walfrans for your tips and support.


this version also distributes the two main files from gdiplusx - system.app and gdiplusx.vcx.
if you are already a gdiplusx user, you can use your own gdiplusx version.
just make sure to be using the latest version.


this new release contains lots of enhancements:

chart types
- bar charts
- multiple bars
- stacked bars

- pie
- doughnut

- lines
- area
- points and shapes


color variations:
- basic colors
- custom colors
- gradient colors
- random colors
- monochrome
- gradient or solid colors


legends in many places: axys, shapes, side legends

scales - automatic or customized

customize:
- titles
- subtitles
- backgrounds (solid or gradient)
- fonts
- colors


the sample form shows most of the features that are available. run the form "chartssample.scx" and play changing the various properties, generating some cool charts like the ones below.



all the relevant codes are in the init() event of the sample form. with very few lines of code you can create super cool and beautiful charts.


this sample also includes a report sample. check the codes in the command button that generates a report to see one of the various ways we have to print our charts.



 


important to remember that this is still an alpha version, and is not recommended to be used in production although it works nice.


some important improvements still need to be applied, specially in the class initialization. the codes also need to be optimized. my priority was in obtaining the results, and in many places the performance can be improved.


if you have any tips, or can provide suggestions, or fixes, you are most welcome !


enjoy !


download the latest version directly from the foxcharts page on vfpx:


http://www.codeplex.com/vfpx/wiki/view.aspx?title=foxcharts&referringtitle=home


the page for the latest release 0.14 alpha:


http://www.codeplex.com/vfpx/release/projectreleases.aspx?releaseid=12847


 



















 




 




 



 


 
  

 
 




 


here are the properties that are currently provided in foxcharts, that you can use to improve your charts:






























































































































































































sourcealiascharacter, the name of the alias that contains the needed fields that will create the chart
fieldvalue1character, the field name of the cursor that contains the numeric values that contain the values that will create the chart.
fieldcolorcharacter, the field name of the cursor that contains the rgb values of the custom colors for the chart
fielddetachslicecharacter, the field name of the cursor that contains the logical values that tell if the slice of the pie or donut chart will be detached or not
fieldhideslicecharacter, the field name of the cursor that contains the logical values that tell if the slice of the pie or donut chart will be hidden or not
fieldlegendcharacter, the field name of the cursor that contains the character values that contain the main legends of the pie or donut charts
fieldlegend2character, the field name of the cursor that contains the character values that contain the secondary legends of the chart that will be drawn inside the slice, or point or bar.
fieldxaxyscharacter, the name of the field that contains the text to be drawn in the x axys
color1numeric, the rgb value of the color from the first chart
legend1character, the legend text for the first sequence of values
charttypenumeric, type of chart: 1 = pie ; 2 = donut ; 3 = unspecified ; 4 = point ; 5 = line ;  6 = area ; 7 = simple bar ; 8 = multiple bars ; 9 = stacked bars
chartscountnumeric, the number of value sources
fontnamecharacter, the name of the font to be used to display text
titlefontsizenumeric, the font size for the main title
titlecaptioncharacter, the title caption
titleforecolornumeric, the title and subtitle forecolor rgb value
subtitlecaptioncharacter, the subtitle caption
subtitlefontsizenumeric, the subtitle font size
showlegendlogical, shows the side legends
legendfontsizenumeric, the fontsize for the side legends
legendforecolornumeric, the legend fore color rgb value
showvaluesonshapeslogical, determines if the values will be drawn inside the shapes of the chart
legendonshapecolornumeric, the rgb value for the shape color
legendonshapefontsizenumeric, the font size for legends on shape
showaxyslogical, for line, area or point charts - determines if the x and y axys will be drawn
axysxcaptioncharacter, the main text for the x axys
axysycaptioncharacter, the main text for the y axys
axyscolornumeric, the rgb value for the axys main color
backcolornumeric, rgb value of the main backcolor
backcolor2numeric, rgb value of the secondary (destination) backcolor. this is used to create gradients, together with "backcolor"
backgradientmodenumeric, if gradient background (having backcolor2 specified) - 0 - horizontal; 1 - vertical; 2 - diagonal1 ; 3 - diagonal 2
showscalelogical, determines if the scale in the y axys will be shown
scalenumeric, the scale value for the y axys; 0 = automatic scale
scalebacktypenumeric, the background scale type; 0 = none; 1 = lines; 2 = rectangle
colortypenumeric, the type of colors of the chart: 0 = basic colors   1 = custom (default)   2 = random   3 = scale of gradients
brushtypenumeric, type of brush used to fill the chart: 1 - solid colors; 2 - gradient colors; 3 - monochrome hatch brush
gradientlevelnumeric, for gradient brush mode (-10 = destination black; 0 = solid color; +10 destination white)
alphachannelnumeric, 0-255 determines the level of the transparency level; 255 = opaque; 0 = transparent
_3dnumeric, the quantity of pixels that create the 3d effect (0 = plain)
marginnumeric, specifies the margin width created in the text portion of the control.
donutrationumeric, for donut chart - the width of the donut related to its size ( 0.01 = full slice ; 0.99 = thin)
linecapslogical, for the case of plain line chart, shows rounded caps in each point.
lineshape
pointsshapenumeric, the shape to be used in a points chart: 0 = round; 1 = square; 2 = triangle; 3 = cross; 4 = star; 5 = man; 98 = gdi+x path object; 99 = custom image
pointsshapewidthnumeric, for point chart, determines the width of the pen that will draw the shapes
piedetachpixelsnumeric, for pie and donut charts, the quantity of pixels to detach from center
barsspacebetweennumeric, for bars chart - the distance in pixels between bars
area3dtoplogical, when true, a line will be drawn on the top of the 3d area chat
multichartlogical, determines if more than one kind of chart will run at the same time


 


 

2008-04-11

How to disable print button in report preview

till now i had seen many samples showing how we can make the print button invisible from the report preview toolbar, but i had never seen the possibility to show it disabled.
here's a sample, totally based in emerson reed's, from an old post in his great blog: a sample on how to add features to report listener - http://weblogs.foxite.com/emersonreed/archive/2006/09/13/a_sample_on_how_to_add_features_to_report_listener.aspx


it brings the possibility to hide completely the print button or to disable it - just set the properties "printbuttonvisible" and "printbuttonenabled". apart from this, it also allows to change the tooltips from the buttons. for my case this is really helpful, in order to have the translated tooltips to my native language.


i've only added 7 or 8 lines of code all the sample comes from emerson.
it was tricky to set the "enabled" property of the print button, because there's no property that allows us to set this, differently from the "visible", that was allowed, using the property "allowprintfrompreview".
even setting the property "enabled" directly in the extensionhandler class below, the button still appeared enabled.


.cmdprint.enabled = .f. && did not work


my solution was to use bindevent, in order to control the behavior whenever the report previewer tried to change the "enabled" property:


bindevent(this.previewform.toolbar.cmdprint,"enabled",this,"disabled",1)
 
then, i added a custom function "disabled", that forces the print button to appear disabled:
 
procedure disabled
   this
.previewform.toolbar.cmdprint.enabled = .f.
endproc

 

 
* see "leveraging the default preview container" topic in help for more info
* report listener based on emerson reed's sample from
*
http://weblogs.foxite.com/emersonreed/archive/2006/09/13/a_sample_on_how_to_add_features_to_report_listener.aspx


* create a report listener object
local loreportlistener
loreportlistener =
newobject("myreportlistener")
with loreportlistener
   .
listenertype = 1 && preview
   .printbuttonvisible = .t.
   .printbuttonenabled = .f.
endwith
 
* run a report from the samples of vfp using the new report engine (object-assisted output)
report form ;
   home() + 'samples\solution\reports\colors.frx' ;
   object loreportlistener
return
 
 
 
* custom report listener that adds some features
define class myreportlistener as fxlistener of addbs(home()) + "ffc\_reportlistener.vcx"


* public properties
printbuttonvisible = .t.
printbuttonenabled = .t.
*
procedure loadreport
   dodefault
()
   with this
      if
.listenertype==1 and not vartype(.previewcontainer)=="o"
         .extendpreviewcontainer()
      endif
   endwith
endproc
*
function extendpreviewcontainer
   local lopreviewcontainer
   lopreviewcontainer =
null
   do
(_reportpreview) with lopreviewcontainer
   lopreviewcontainer.allowprintfrompreview =
this.printbuttonvisible

   local loexthandler
   loexthandler =
createobject("myextensionhandler")
   loexthandler.disableprintbutton = not
this.printbuttonenabled

   lopreviewcontainer.setextensionhandler(loexthandler)
   this.previewcontainer = lopreviewcontainer
endfunc
enddefine



* create a class that will extend report preview
define class myextensionhandler as custom
   disableprintbutton = .f.


procedure show(istyle)
with this.previewform
   with .toolbar
   * translate toolbar buttons tooltips to brazilian portuguese language
   .cbozoom.tooltiptext = "zoom"
   .cmdclose.
tooltiptext = "fechar a visualização"
   .cmdgotopage.
tooltiptext = "ir para a página"
   .cmdprint.
tooltiptext = "imprimir"
 
   if this.disableprintbutton
      * bindevent(this.previewform.toolbar.cmdprint, "visible", this, "invisible", 1)


      * here we control the enabled property
      bindevent(this.previewform.toolbar.cmdprint, "enabled", this, "disabled", 1)
   endif

   with
.cntnext
      .cmdbottom.
tooltiptext = "última página"
      .cmdforward.
tooltiptext = "próxima página"
   endwith


   with .cntprev
      .cmdback.
tooltiptext = "página anterior"
      .cmdtop.
tooltiptext = "primeira página"
   endwith


   with .opgpagecount
      .opt1.
tooltiptext = "uma página"
      .opt2.
tooltiptext = "duas páginas"
      .opt3.
tooltiptext = "quatro páginas"
   endwith
*
   endwith
   .windowstate = 2 && maximize report preview
   endwith
   dodefault
(istyle)

endproc


* here is the relevant code to disable the button
procedure disabled
   this
.previewform.toolbar.cmdprint.enabled = .f.
endproc
*
enddefine

2008-04-04

FoxCharts !!!

wanna create some cool charts in vfp ?



with no activex controls, dlls, or 3rd party products ?



what do you think of these ?





 



 



 


recently, i’ve seen many discussions about people asking for charts components.
since gdiplusx brings us all these possibilities, i thought it would  be worth to start a project regarding this.



 


foxcharts is a subclass of the imagecanvas class from gdiplusx, that allows us to direct draw in an image object, among many other cool and useful features, that are not in the scope of this post.



goals of foxcharts:
- create good looking and modern charts in pure vfp
- no activex components
- easy to setup
- easy to customize.
- easy to save to disk or print
- open source
- benefit from all the gdiplusx drawing capabilities, allowing users to modify the charts the way they like.
- save as emf, resulting in perfect charts when printed in vfp reports



prerequisites:
visual foxpro 9 and the gdiplusx library from vfpx 



in the source code you'll find a sample form, “newchart.scx” that allows to create different kinds of charts using this class.


please note that as it is still in alpha version, the codes that create the charts are still in the sample form. gpcharts.vcx is (at this moment) just a holder that contains the pems needed to draw. in development mode, double click the imagecanvas object to see the source code that generates these charts.


the codes that will instantiate gpcharts reside in the init() event of the sample form, only there.


 


currently available:
bars, lines, area, pie and donut charts, in various color variations, using gradients, custom colors, basic and random colors.
titles, subtitles and legends


 


to do:
enhance the data filling, create a builder, allow different kinds of charts to appear together (eg. lines and bars). legends in the y and x axys.


and obviously:
fix some bugs !



if you are interested in developing and enhancing foxcharts, feel free to post a comment here.
your suggestions, tips, critics, testing and bugs hunting will be most appreciated !


 


download directly from the foxcharts page in vfpx


http://www.codeplex.com/vfpx/wiki/view.aspx?title=foxcharts&referringtitle=home