Page 1 of 2

Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Wed Oct 26, 2022 8:58 am
by 16593417
Hi,

I have recently updated to TeeChart 2022.36 with Delphi 10.4.

Now that I have updated TChart I find that all my "Chart.Draw" calls now have a missing BottomAxis.

This is affecting several different applications, which I have been maintaining for years, through multiple previous upgrades of TeeChart.

This turns out to be because I am using "BottomAxis.LabelStyle := talText;" and GetAxisLabel to populate the labels.

Even with simple, short, test code I cannot get the BottomAxis to display anything at all when using Chart.Draw with talText.

Please find a sample attached. In this example I can step through the GetAxisLabel code and see a value being assigned to LabelText, but the bottom axis is still entirely missing.

Thanks,
Jamie

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Wed Oct 26, 2022 6:59 pm
by 16593417
I have tried everything I can think of to get the axis to draw, so far to no avail.

I have found a sort-of-workaround using "Chart.BottomAxis.Items.Add", which does display. But I am using GetAxisLabel to dynamically vary the number of labels displayed on a whole DrawGrid full of charts, as the form resizes. So it would be far from ideal to have to repopulate the bottom axis of every chart on the fly!

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Thu Oct 27, 2022 11:40 am
by yeray
Hello,

LabelStyle talText forces the axes to show the labels from the first series assigned to the axis. However, in that example you have no labels in your series. That's why no labels are drawn.

Assigning labels to the series, you don't even need to use OnGetAxisLabel event:

Code: Select all

procedure TForm2.Button2Click(Sender: TObject);
var
  Rect: TRect;
  i: Integer;
begin
  Chart := TChart.Create(Self);
  Chart.View3D := False;
  Chart.BottomAxis.LabelStyle := talText;
  //Chart.OnGetAxisLabel := ChartGetAxisLabel;
  Chart.AddSeries(TBarSeries.Create(Chart));
  Chart.SeriesList[0].FillSampleValues(48);

  for i:=0 to Chart[0].Count-1 do
    Chart[0].Labels[i]:='Idx '+IntToStr(i);

  Rect := Image1.ClientRect;
  Chart.Draw(Image1.Canvas, Rect);
  Chart.Free;
  Image1.Refresh;
end;
Project2_2022-10-27_13-39-20.png
Project2_2022-10-27_13-39-20.png (41.41 KiB) Viewed 5900 times

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Thu Oct 27, 2022 12:43 pm
by 16593417
Hi Yeray,

Thanks, but as I said in my second post this doesn't help me.

The change to TeeChart breaks existing code, which needs to dynamically adjust the bottom axis for sometimes over 100 charts on the screen at any time. OnGetAxisLabel is fired as the chart gets redrawn, whereas clearing and repopulating the axis for each chart is more cumbersome and less flexible.

If I assign any items to Chart.BottomAxis.Items then the string returned by OnGetAxisLabel is not shown.

What is the point of OnGetAxisLabel if it cannot change what is displayed?

Thanks,
Jamie

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Thu Oct 27, 2022 12:59 pm
by yeray
Hello Jamie,

My suggestion is to populate the series labels instead of using OnGetAxisLabel or Chart.BottomAxis.Items.
This should internally recalculate the labels to be drawn depending on the axis size.

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Thu Oct 27, 2022 1:23 pm
by 16593417
Hi Yeray,

Thanks, but because some of the labels are times and other values that have meaning the automatically calculated increments do not always make sense and customers have said so - hence I overrode it with my own algorithm, which my customers are happy with.

I say again though: why has OnGetAxisLabel stopped working? It now serves no purpose!

Why has this changed and broken my existing code, which has worked this way for over 10 years?

In that time I have upgraded TChart several times without it breaking before.

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Thu Oct 27, 2022 3:39 pm
by 16593417
OK, further to my last post, I just checked the latest Help chm file I downloaded and the description for OnGetAxisLabel still matches what I am trying to do.

Surely this is a bug, as this function no longer works?

I can see my code assigning values to LabelText, as shown, but they do no appear.

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Thu Oct 27, 2022 3:47 pm
by 16593417
... third post!

I should also point out, in answer to your point that the axis doesn't display because I have not added any labels, that OnGetAxisLabel is not called at all if I add even a single label to "BottomAxis.Items".

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Wed Nov 02, 2022 12:07 pm
by yeray
Hello Jamie,

I've been trying your test app with previous TeeChart versions (v2021.33 to v2022.36) with the same results. In what version do you find it behaved differently?
I'll be glad to investigate any braking change you may identify.

Indeed, if I add a custom item to the bottom axis, OnGetAxisLabel is not being fired, but the custom item is drawn, so you should be able to implement your algorithm with custom items. Ie:

Code: Select all

procedure TForm2.Button2Click(Sender: TObject);
var
  Chart: TChart;
  Rect: TRect;
begin
  Chart := TChart.Create(Self);
  Chart.View3D := False;
  //Chart.BottomAxis.LabelStyle := talText;

  Chart.BottomAxis.Items.Add(5, 'five');
  Chart.BottomAxis.Items.Add(10, 'ten');
  Chart.BottomAxis.MinorTicks.Hide;

  //Chart.OnGetAxisLabel := ChartGetAxisLabel;
  Chart.AddSeries(TBarSeries.Create(Chart));
  Chart.SeriesList[0].FillSampleValues(48);
  Rect := Image1.ClientRect;
  Chart.Draw(Image1.Canvas, Rect);
  Chart.Free;
  Image1.Refresh;
end;
custom items.png
custom items.png (35.37 KiB) Viewed 5730 times

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Sun Nov 06, 2022 9:24 pm
by 16593417
Hi Yeray,

I assign the same OnGetAxisLabel procedure to between 50 and 1000 charts in a grid, which automatically refresh the axis labels as the grid scrolls/resizes and the charts redraw, which seems a nice solution. I would prefer, if possible, not to risk introducing any bugs by changing the method, as the software runs 24/7, recording data.

Unfortunately in my many attempts to get the latest TeeChart version working with QuickReport I uninstalled all my previous versions of TeeChart for the other Delphi versions I have on my current development machines, so I can't say what the latest version was that OnGetAxisLabel was working with. I daren't try reinstalling any older versions, in case it breaks what took me weeks to get working!

I have booted up some older versions of Delphi on an old PC and my previous laptop and can confirm that the code I uploaded works as expected on the following TeeChart versions :-
Delphi XE2 : "TeeChart Standard v2011.03.32815 32bit VCL"
Delphi XE7 : "TeeChart Pro v2017.22.170619 32bit VCL"

Thanks,
Jamie

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Mon Nov 07, 2022 10:32 am
by yeray
Hello Jamie,
Jamie wrote:
Sun Nov 06, 2022 9:24 pm
Delphi XE7 : "TeeChart Pro v2017.22.170619 32bit VCL"
Thanks to this I found the issue you are experiencing was introduced with the fix for #1899.
We'll check if there's anything wrong with it.

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Mon Nov 07, 2022 2:18 pm
by yeray
Hello Jamie,

I've added it to the public tracker and already fixed it for the next maintenance release:
https://www.steema.com/bugs/show_bug.cgi?id=2565

Since you own the sources, you can apply the fix to your copy without waiting for the next release. At TeEngine.pas, substitute the CalcFirstLastAllSeries method for this:

Code: Select all

    procedure CalcFirstLastAllSeries(out tmpFirst,tmpLast:Integer);
    var t : Integer;
    begin
      tmpFirst:=High(Integer);
      tmpLast:=-1;

      for t:=0 to ISeriesList.Count-1 do
      with ISeriesList[t] do
      begin
        if (FLabels.Count>0) or (LabelStyle=talPointValue) or Assigned(ParentChart.FOnGetAxisLabel) then
        begin
          CalcFirstLastVisibleIndex;

          if (FFirstVisibleIndex<tmpFirst) and (FFirstVisibleIndex<>-1) then
             tmpFirst:=FFirstVisibleIndex;

          if FLastVisibleIndex>tmpLast then
             tmpLast:=FLastVisibleIndex;
        end;
      end;
    end;

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Tue Nov 08, 2022 2:48 pm
by 16593417
Hi Yeray,

Many thanks for your help. Unfortunately that doesn't seem to have solved the problem for me, but perhaps I'm missing something?

I made the change you suggested in TeEngine.pas and VCLTee.TeEngine.pas (just to be sure) and ran TeeRecompile, but I'm not seeing any change in the behaviour of my Project2 test code.

Is there something else I need to do?

Thanks again,
Jamie

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Wed Nov 09, 2022 10:28 am
by yeray
Hello Jamie,

This is how your project looks for me after the change:
Project2_2022-11-09_11-24-52.png
Project2_2022-11-09_11-24-52.png (38.98 KiB) Viewed 5616 times
Make sure you are rebuilding the project after applying the change.

Re: Chart.Draw with LabelStyle talText - BottomAxis missing

Posted: Wed Nov 09, 2022 4:54 pm
by 16593417
Hi Yeray,

Apologies, I made a silly mistake!

I edited the files, as stated, I ran TeeRecompile, I rebuilt the project ... but I had put the modified TeEngine.pas in the same directory as VCLTee.TeEngine.pas!

Hence TeeRecompile was still finding the old version of TeEngine.pas.

The project now works as expected and I can finally issue a product update.

Thanks again for your continued help.

All the best,
Jamie