0

Delphi 7 で TChart を使用しており、いくつかの棒グラフを表示したいと考えています。次のコードを使用して、データベース クエリから系列値を設定しています。

  chart1.FreeAllSeries;

  chart1.SeriesList.Clear;

  chart1.AddSeries(TBarSeries.Create(Self));
  TBarSeries(chart1.Series[0]).BarStyle:=bsRectGradient;

  with query1 do
    begin
      Close;
      Execute;

      while not EoF do
        begin
          chart1.Series[0].Add(FieldAsFloat('sum_actual_days'), FieldAsString('contract_no'));
          Next;
        end;

    end;

各バー (値) には、バーの下とバーの上の黄色の四角形の両方にラベルが表示されます。

ラベルの値を 2 回繰り返す代わりに、クエリから、ラベルの代わりに (またはできればマウスオーバー ヒントとして) バーの上に表示したい追加情報があります。これは TChart で実行できますか? そしてどうやって... ?

4

4 に答える 4

5

これは、チャートの OnMouseMove イベントを使用して TChart で行うことができます。このようなものから始める必要があります:

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  SeriesIndex: Integer;
begin
  SeriesIndex := Series1.Clicked(X, Y);

  Chart1.ShowHint := SeriesIndex <> -1;

  if Chart1.ShowHint then
  begin
    query1.RecNo := SeriesIndex; { this may need to be SeriesIndex + 1 }
    Chart1.Hint := query1.FieldByName('YourFieldNameHere').AsString;
  end;
end;

もちろん、このコードが機能するためには、グラフの作成に使用したクエリがまだ開いている必要があります。

于 2009-06-25T22:43:03.067 に答える
1

「マーク ヒント」ツールは、カスタム テキストを提供するイベントを提供します (OnGetText イベント)。

procedure TForm1.ChartTool1GetText(Sender: TMarksTipTool;
  var Text: String);
var Index : Integer;
begin
  Index:=Series1.Clicked(Chart1.GetCursorPos);

  Text:='Hello point '+IntToStr(Index);
end;
于 2011-06-03T09:48:02.983 に答える
0

Panel を Chart に配置して、ヒントとして使用できます。NearestPoint ツールを使用すると、非常にうまく機能します。

ここに画像の説明を入力

最初に NearestPoint ツールをチャートに追加します (チャートをダブルクリックし、[ツール] → [追加] を選択します)。

次に、Panel を Chart に (Chart コンポーネントに) 追加し、必要に応じてスタイルを設定します。

次に、OnMouseMove イベントを使用します。

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var i:integer;
    px,py:integer;

begin   
  if PtInRect(Chart1.ChartRect,Point(X,Y)) then
    begin
      i:=ChartTool1.GetNearestPoint(Series1,X,Y);
      if (Series1.XValues.Count>0) and (i<Series1.Count) and (i>=0) then
        begin
          px:=Series1.CalcXPos(i);
          py:=Series1.CalcYPos(i);
          //You can add any data here to your panel, even you can put Images to it or anything else
          Panel_Hint.Caption:=TimeToStr(Series1.XValue[i])+' • '+FloatToStrF(Series1.YValue[i],ffNumber,20,2);
          Panel_Hint.Visible:=true;
          Form1.Canvas.Font.Assign(Panel_Hint.Font);
          Panel_Hint.Width:=Form1.Canvas.TextWidth(Panel_Hint.Caption)+8;
          Panel_Hint.Left:=px-Panel_Hint.Width div 2;
          Panel_Hint.Top:=py-Panel_Hint.Height-2;
        end
      else
        Panel_Hint.Visible:=false;
    end;
end;

必要に応じて NearestPoint ツールを無効にすることもできますが、対応するポイントを簡単に見つけるために必要です。

于 2016-02-04T13:51:06.857 に答える