TChartのプロットデータ固有のデータをポップアップ表示するには?

解決


ジョージ  2006-03-12 22:37:37  No: 20480

はじめまして、ジョージと申します。
現在、TChartとTPointSeriesを用いて散布図を作成しているのですが
以下の2つの機能を実現出来なくて困っています。

①プロットの色をプロット毎に変更したい。

//iIndex : 座標インデックス
iYDatums : 基準値
Procedure Set_PlotData(Const iIndex, iYDatums : Integer);
begin
  case iYDatums of
    1 ..10 : PSeries.ValueColor[iIndex] := clRed;
    11..20 : PSeries.ValueColor[iIndex] := clYellow;
    else     PSeries.ValueColor[iIndex] := clBlue;
  end;
end;

としてみましたが、すべてデフォルトの色(PSeries.Pointer.Brush.Color)で
描画されてしまいます。
  
②グラフのプロット上にマウスカーソルが移動してきた時に
  そのプロットデータ固有のデータをポップアップ表示したい。

①、②についてどなたか、ご教授お願い致します。


@っしー  2006-03-15 00:45:30  No: 20481

(1)は、シリーズにポイントをAddする際に色を指定できたと思います。

(2)は、シリーズのClickイベント内で、

Sender.XValues[ValueIndex]
Sender.YValues[ValueIndex]

とすれば値が拾えます。


ジョージ  2006-03-15 04:29:39  No: 20482

@っしーさん、返答ありがとうございます。
(1)に関しては、実装できました。ありがとうございます。

(2)に関しましては、OnClickイベント時ではなく、
マウスカーソルがTPointSeries上にある時に、、、
と考えております。
以下、現在調査中のロジックです。

var
  Comp : TComponent;
  P    : TPoint;
begin
    GetCursorPos(P);                 //マウス位置の取得
    Comp := FindDragTarget(P, True); //マウス下のコンポーネント名取得

    if (Comp <> nil) and (Comp is TPointSeries)
    then begin
     ・・・


@っしー  2006-03-15 20:49:19  No: 20483

ジョージさんの調査中のロジックですと、ChartのMouseMoveイベントではTPointSeriesが拾えないので、ベタですが、こんな感じでどうでしょう?

ChartにLabelを貼り付けておきます。

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i: Integer;
  Xv, Yv, Xc, Yc: Double;
  flag: Boolean;
const
  d = 1;
begin
  //カーソル上の値
  TChart(Sender).Series[0].GetCursorValues(Xc, Yc);

  flag := False;
  for i:=0 to TChart(Sender).Series[0].Count-1 do begin
    //シリーズの値
    Xv := TChart(Sender).Series[0].XValue[i];
    Yv := TChart(Sender).Series[0].YValue[i];
    if (Xv > (Xc-d)) and (Yv > (Yc-d)) and
        (Xv < (Xc+d)) and (Yv < (Yc+d)) then begin
      //シリーズ値とカーソル値(ボックス範囲)を比較して
      //ボックス内にあればフラグを設定して抜ける
      flag := True;
      Break;
    end;
  end;

  if flag = True then begin
    Label1.Caption := Format('(%8.4f,%8.4f)', [Xv, Yv]);
    Label1.Left := X + 5;
    Label1.Top  := Y - 10;
    Label1.Visible := True;
    Application.ProcessMessages;
  end else begin
    Label1.Visible := False;
    Application.ProcessMessages;
  end;

end;


ジョージ  2006-03-16 00:28:32  No: 20484

@っしー さん、返信ありがとうございます。
無事、@っしー さんのコードで実現できました。
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加