はじめまして、ジョージと申します。
現在、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)で
描画されてしまいます。
②グラフのプロット上にマウスカーソルが移動してきた時に
そのプロットデータ固有のデータをポップアップ表示したい。
①、②についてどなたか、ご教授お願い致します。
(1)は、シリーズにポイントをAddする際に色を指定できたと思います。
(2)は、シリーズのClickイベント内で、
Sender.XValues[ValueIndex]
Sender.YValues[ValueIndex]
とすれば値が拾えます。
@っしーさん、返答ありがとうございます。
(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
・・・
ジョージさんの調査中のロジックですと、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;
@っしー さん、返信ありがとうございます。
無事、@っしー さんのコードで実現できました。
ありがとうございます。
ツイート | ![]() |