TeeChart for Microsoft Visual Studio .NET, Xamarin Studio (Android, iOS & Forms) & Monodevelop.
-
Christopher
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Post
by Christopher » Thu May 22, 2014 1:08 pm
Hello!
wakeup wrote:Tchart still is having problmes to set well the margin with scrollpager and custom axis. You can reproduce it with the example I sent in the previous post.
Try:
Code: Select all
private void button2_Click(object sender, EventArgs e)
{
tChart1.GetAxesChartRect += tChart1_GetAxesChartRect;
AddCustomAxis();
}
void tChart1_GetAxesChartRect(object sender, Steema.TeeChart.GetAxesChartRectEventArgs e)
{
if (tChart1.Series[0].CustomVertAxis != null)
{
double maxVal = tChart1.Series[0].YValues.Maximum;
float twidth = tChart1.Graphics3D.TextWidth(maxVal.ToString(tChart1.Series[0].CustomVertAxis.Labels.ValueFormat));
int width = Steema.TeeChart.Utils.Round(twidth) + 30;
Rectangle rect = tChart1.Chart.ChartRect;
rect.X = width;
rect.Width = tChart1.Width - 80;
e.AxesChartRect = rect;
}
}
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Thu May 22, 2014 1:16 pm
It doesn't run the chart and the scrollpager are one over the other...
-
Attachments
-
- margin2.png (32.22 KiB) Viewed 23477 times
-
Christopher
- Guru
- Posts: 1603
- Joined: Fri Nov 15, 2002 12:00 am
Post
by Christopher » Thu May 22, 2014 1:44 pm
wakeup wrote:It doesn't run the chart and the scrollpager are one over the other...
Here is your modified project which includes this code, and
here is a video of it working correctly with the latest publicly available release of TeeChart.dll.
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Thu May 22, 2014 1:57 pm
Thanks now it seems to run was confused between GetAxesChartRect functions of the chart and the subcharts...
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Thu Jun 19, 2014 12:49 pm
I follow with some problems in the same topic.
Please find an example project to reproduce.
http://193.145.251.126/pnp/files/TnROgF ... leZoom.zip
If you press button1 to configure the chart. Button2 to save the chart, and button 3 to open the save chart the margin in the scrollpager is changed.
And if you reopen the application and press button3 to open the saved chart the margin of the main chart is also changed.
-
Narcís
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
-
Contact:
Post
by Narcís » Thu Jun 19, 2014 1:55 pm
Hello wakeup,
That's because when exporting/importing a chart, associated events are not being exported. The reason behind that is that you could load that chart in an application where those events doesn't exist, which would cause an error loading the chart. Having that in mind, you should add the event handlers again. So you should only modify
button3_Click code in your project to look like this:
Code: Select all
private void button3_Click(object sender, EventArgs e)
{
chart.Import.Template.Load(@"C:\testzoom.ten");//
chart.GetAxesChartRect +=chart_GetAxesChartRect;
Steema.TeeChart.Tools.ScrollPager mt = (Steema.TeeChart.Tools.ScrollPager)chart.Tools[0];
mt.SubChartTChart.GetAxesChartRect += SubChartTChart_GetAxesChartRect;
addPagescroller(mt);
}
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Fri Jun 20, 2014 7:14 am
Thanks I understand your point, but anyway, if that events sets some properties to the chart, why that property values are not saved and then loaded when opened?
-
Narcís
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
-
Contact:
Post
by Narcís » Fri Jun 20, 2014 9:57 am
Hi wakeup,
Those are properties that are calculated dynamically depending from other chart properties, which are only valid after the chart has been painted. Hence them being set with the event handlers. Those values (axis.posAxis, axis.Labels.position and axis.posTitle in Steema.TeeChart.Chart.ReCalcAxisElements) could probably be serialized, which might be good for your particular case, however this wouldn't work importing the .ten file into another chart as the values would need to be recalculated again. Moreover, setting custom AxesChartRect is an advanced chart customisation that it wouldn't be desirable in most importing circumstances and could lead to really unpredictable and weird charts.
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Fri Jun 20, 2014 10:42 am
Ok thanks. I have another related question.
In order to get the width of the labels we do this?
Code: Select all
double maxVal = chart.Series[current].CustomVertAxis.Maximum;
float twidth = chart.Graphics3D.TextWidth(maxVal.ToString(chart.Series[current].CustomVertAxis.Labels.ValueFormat));
But by example when maxval is 94.33, and the diference between the minimum of the scale and the maximum is big the label doesn’t show decimals, so the label only shows 94. So the twidth is not right because “ValueFormat” says "#,##0.###". But I cannot change the valueformat because it is interesting to show decimals if the scale is short.
How can I know if the scale is showing thee maximum with or without decimals?
-
Narcís
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
-
Contact:
Post
by Narcís » Fri Jun 20, 2014 11:27 am
Hi wakeup,
I'm not sure about what you are trying to achieve here.
wakeup wrote:But I cannot change the valueformat because it is interesting to show decimals if the scale is short.
Why not? You can force having decimal values changing "#" to "0" as explained in
Custom Numeric Format Strings.
wakeup wrote:How can I know if the scale is showing thee maximum with or without decimals?
You can check it in the
GetAxisLabels event, for example:
Code: Select all
private bool maxHasDecimals = false;
private double max;
void chart_GetAxisLabel(object sender, Steema.TeeChart.GetAxisLabelEventArgs e)
{
if (((Steema.TeeChart.Axis)sender).IsCustom())
{
double tmpMax;
bool tmp = false;
if (double.TryParse(e.LabelText, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out tmpMax))
{
tmp = (tmpMax % Math.Truncate(tmpMax) > 0.0);
}
if (tmpMax > max)
{
max = tmpMax;
maxHasDecimals = tmp;
}
}
}
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Fri Jun 20, 2014 1:12 pm
Narcís wrote:Hi wakeup,
I'm not sure about what you are trying to achieve here.
wakeup wrote:But I cannot change the valueformat because it is interesting to show decimals if the scale is short.
Why not? You can force having decimal values changing "#" to "0" as explained in
Custom Numeric Format Strings.
I can't because if the values by example are between 0 an 1, I like to see the decimals... if they are between 0 and 90 no.
Narcís wrote:
wakeup wrote:How can I know if the scale is showing thee maximum with or without decimals?
You can check it in the
GetAxisLabels event, for example:
Code: Select all
private bool maxHasDecimals = false;
private double max;
void chart_GetAxisLabel(object sender, Steema.TeeChart.GetAxisLabelEventArgs e)
{
if (((Steema.TeeChart.Axis)sender).IsCustom())
{
double tmpMax;
bool tmp = false;
if (double.TryParse(e.LabelText, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out tmpMax))
{
tmp = (tmpMax % Math.Truncate(tmpMax) > 0.0);
}
if (tmpMax > max)
{
max = tmpMax;
maxHasDecimals = tmp;
}
}
}
It doesn't run, I tried and I got
maxHasDecimals = true
max = 94.832
but in the labels the maximum value you can see is 90. Without decimals...
Thanks
-
Narcís
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
-
Contact:
Post
by Narcís » Fri Jun 20, 2014 1:36 pm
Hello wakeup,
wakeup wrote:
I can't because if the values by example are between 0 an 1, I like to see the decimals... if they are between 0 and 90 no.
Ok, in that case you should manually parse
e.LabelText argument in the
GetAxisLabel event, for example:
Code: Select all
void chart_GetAxisLabel(object sender, Steema.TeeChart.GetAxisLabelEventArgs e)
{
if (((Steema.TeeChart.Axis)sender).IsCustom())
{
double tmp = Convert.ToDouble(e.LabelText);
e.LabelText = (tmp < 1) ? tmp.ToString("#.##"): tmp.ToString("#.00");
}
}
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Fri Jun 20, 2014 1:58 pm
I think you did't undestand me. When I said " between 0 an 1, I like to see the decimals... if they are between 0 and 90 no." it was only and example, the same is if its between 4 and five.... This behaviour is what teechart does automatically. The labels are right, the question is how to acces to the real labels proglamatically... In your example they were with decimals and the real labels although the real labels weren't with decimals...
Thanks
-
Narcís
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
-
Contact:
Post
by Narcís » Fri Jun 20, 2014 2:36 pm
wakeup wrote:I think you did't undestand me. When I said " between 0 an 1, I like to see the decimals... if they are between 0 and 90 no."
Ok, I think I understood you now. In that case you could add something like the code below at the end of
button1_Click method in your project.
Code: Select all
chart.Draw();
for (int i = 0; i < chart.Axes.Custom.Count; i++)
{
Steema.TeeChart.Axis a = chart.Axes.Custom[i];
double range = a.Maximum - a.Minimum;
a.Labels.ValueFormat = (range < 1) ? "#.00" : "#.##";
}
wakeup wrote:
it was only and example, the same is if its between 4 and five.... This behaviour is what teechart does automatically. The labels are right, the question is how to acces to the real labels proglamatically... In your example they were with decimals and the real labels although the real labels weren't with decimals...
Ok. You should get the labels using the
GetAxisLabels and
GetNextAxisLabel. You'll find more information about those events in tutorial 4, at the "
Axis events" section. Tutorials can be found at TeeChart's program group.
-
acastro
- Advanced
- Posts: 204
- Joined: Tue Oct 27, 2009 12:00 am
Post
by acastro » Fri Jun 20, 2014 2:43 pm
Narcís wrote:wakeup wrote:I think you did't undestand me. When I said " between 0 an 1, I like to see the decimals... if they are between 0 and 90 no."
Ok, I think I understood you now. In that case you could add something like the code below at the end of
button1_Click method in your project.
Code: Select all
chart.Draw();
for (int i = 0; i < chart.Axes.Custom.Count; i++)
{
Steema.TeeChart.Axis a = chart.Axes.Custom[i];
double range = a.Maximum - a.Minimum;
a.Labels.ValueFormat = (range < 1) ? "#.00" : "#.##";
}
Thanks but I don't need this, this is for changing the lables and the labels are right in my graph automatically. That's not the problem
Narcís wrote:
wakeup wrote:
it was only and example, the same is if its between 4 and five.... This behaviour is what teechart does automatically. The labels are right, the question is how to acces to the real labels proglamatically... In your example they were with decimals and the real labels although the real labels weren't with decimals...
Ok. You should get the labels using the
GetAxisLabels and
GetNextAxisLabel. You'll find more information about those events in tutorial 4, at the "
Axis events" section. Tutorials can be found at TeeChart's program group.
I have seen the tutorial, but it is not usefully because e.LabelText and e.LabelValue are not the labels shown in my chart, they are with decimals although the labels in my chart are without decimals.