QNo. |
Q.質問 |
A.回答 |
50
|
Q.Delphi6,C++Builder6には対応していますか? |
A.申し訳ありませんが、TeeChart
Pro4Jでは対応しておりません。
対応コンテナについては「OS・コンテナ対応表」をご覧ください。 |
49
|
Q.オブジェクトインスペクタやコード上からF1キーを押してもヘルプが立ち上がらないのですが? |
A.製品をインストールすると設定したフォルダの階層化にHelpフォルダが作成されますので、そのフォルダの中のTeeChart.hlpとTeeChart.cntの2つのファイルをDelphiもしくはC++BuilderのHelpフォルダにコピーしてください。 |
48
|
Q.チャートのズームを水平方向のみに設定(垂直方向はズームしない)したいのですができますか? |
A.ズームとスクロールは、軸の最小値および最大値を変更します。水平方向の軸だけをズームした場合、Chart.OnZoomイベントで垂直軸の最小値と最大値を再セットしなければなりません。
Delphi :
procedure TForm1.Chart1Zoom(Sender:TObject);
begin
TChart(Sender).LeftAxis.Automatic:=true;
end;
C++Builder :
void
__fastcall TForm1::Chart1Zoom(TObject *Sender)
{
dynamic_cast<TChart*>(Sender)->LeftAxis->Automatic=true;
} |
47
|
Q.チャートがズームされたかされないか、どのように確認しますか? |
A.チャートがズームされた場合、軸の最小値および最大値が再計算されるため、軸の「Automatic」プロパティがFalseに設定されます。チャートが「ズームを解除」された場合、軸の「Automatic」プロパティは全て元の設定に戻ります。全ての軸(あるいは指定する軸)が「Automatic」の場合、チャートはズームされません。
Delphi :
function IsChartZoomed(AChart:TChart): Boolean;
begin
With AChart do
result:= not(LeftAxis.Automatic and BottomAxis.Automatic and
RightAxis.Automatic and TopAxis.Automatic) ;
end;
C++Builder :
bool
IsZoomed(TChart *AChart)
{
bool result=!(AChart->BottomAxis->Automatic &&
AChart->LeftAxis->Automatic && AChart->RightAxis->Automatic &&
AChart->TopAxis->Automatic) ;
return result;
} |
46
|
Q.何回もズームをするとエラーが発生します。 |
A.Windows GDIは、線や長方形などをプロットしている場合、座標値の最大値を持っています。Chart1.OnZoomイベントで、ズームの超過を回避できます。
Delphi :
procedure
TForm1.Chart1Zoom(Sender: TObject);
Const SmallerRange=0.001;
begin
With Chart1.LeftAxis do
if (Maximum-Minimum) < SmallerRange then Maximum:
=Minimum+SmallerRange;
With Chart1.BottomAxis do
if (Maximum-Minimum) < SmallerRange then Maximum:
=Minimum+SmallerRange;
end;
C++Builder :
void
__fastcall TForm1::Chart1Zoom(TObject *Sender)
{
const float SmallerRange=1;
if ((Chart1->LeftAxis->Maximum-Chart1->LeftAxis->Minimum) <
SmallerRange)
Chart1->LeftAxis->Maximum=Chart1->LeftAxis->Minimum+SmallerRange;
if ((Chart1->BottomAxis->Maximum-Chart1->BottomAxis->Minimum) <
SmallerRange)
Chart1->BottomAxis->Maximum=Chart1->BottomAxis->Minimum+SmallerRange;
} |
45
|
Q.TeeCommanderに新しいボタンを追加するにはどうするのですか?
|
A.下記のコードは新しいTSpeedButtonを作成し、ボタンのParentプロパティをTeeCommander1に設定します。新しいボタンは、標準のTSpeedButtonで、このボタンのプロパティ/メソッドを使用できます。
Delphi :
uses Buttons;
var tmp:TSpeedButton;
begin
tmp:=TSpeedButton.Create(TeeCommander1);
with tmp do
begin
OnClick:=nil; // no event, but you'll add your own event
Left:=237;
Top := 4;
Width := 25;
Height := 25;
Hint := '';
Down := True;
ParentShowHint := False;
ShowHint := True;
Parent:=TeeCommander1;
Caption:='Test';
end;
end;
C++Builder :
#include <Buttons.hpp>
TSpeedButton *tmp=new TSpeedButton(TeeCommander1);
tmp->OnClick=NULL; // no event, but you'll add your own event
tmp->Left=267;
tmp->Top=4;
tmp->Width=40;
tmp->Height=25;
tmp->Hint="custom button";
tmp->Down=true;
tmp->ParentShowHint=false;
tmp->ShowHint=true;
tmp->Parent=TeeCommander1;
tmp->Caption="Custom"; |
44
|
Q.チャートプレビューダイアログを表示する場合、「初期値に戻す」のチェックおよび「余白」を変更できますか?
|
A.これは現在の制限事項で、チャートのPrintMarginsプロパティは反映されません。たとえば、Chart1.PrintMargins:=Rect(8,8,8,8)およびChart.PrintProportional:=falseに設定した場合、この設定は反映されません。以下のコードを使用してPrintProportionalを無効にして、「余白」を設定しています。
Delphi :
Chart1.PrintProportional:=false;
Chart1.PrintMargins:=Rect(8,8,8,8);
ChartPreviewer1.Options:=ChartPreviewer1.Options-[cpoProportional];
ChartPreviewer1.Execute; |
43
|
Q.エクスポートダイアログフォームを表示するにはどうするのですか?
|
A.uses節に「Teexport」ユニットをインクルードしなければなりません。下記のコードは、Chart1にエクスポートフォームを表示します。
Delphi :
uses
Teexport;
begin
with TTeeExportForm.Create(Self) do
try ExportPanel:=Chart1;
ShowModal();
finally
Free();
end;
end;
C++Builder :
#include <Teexport.hpp>
TTeeExportForm *tmp=new TTeeExportForm(this);
try
{
tmp->ExportPanel=Chart1;
tmp->ShowModal();
}
__finally {
delete tmp;
} |
42
|
Q.実行時のチャートギャラリに拡張された系列型が表示されません。
|
A.プロジェクトに「EditPro」ユニットを付加してください。
Delphi :
uses EditPro;
C++Builder :
#include <EditPro.hpp> |
41
|
Q.実行時にTeeChartエディタおよび印刷プレビューを表示するにはどうするのですか?
|
A.下記のコードを使用してください。
Delphi :
uses
TeePrevi;
ChartPreview(Self,Chart1);
uses EditChar;
EditChart(Self,Chart1);
C++Builder :
#include <TeePrevi.hpp>
ChartPreview(this,Chart1);
#include <EditChar.hpp>
EditChart(this,Chart1);
(DBChartコンポーネントを使用する場合)
Delphi :
uses DBEditCh;
EditChart(Self,DBChart1);
C++Builder :
#include <DBEditCh.hpp>
EditChart(this,DBChart1);
拡張系列あるいは関数のどれかを使用する場合、「uses」にEditProユニットを付加してください。
Delphi :
uses EditPro, EditChar;
C++Builder :
#include <EditPro.hpp>
#include <EditChar.hpp> |
40
|
Q.TWindRoseSeriesにAddPolarメソッドがありません。どうすればよろしいですか?
|
A.AddPolarメソッドは、AddXYメソッドと基本的に同じです。下記のAddPolar定義を参照してください。
function TPolarSeries.AddPolar(Const Angle,Value:Double; Const
ALabel:String; AColor:TColor):Longint;
begin
result:=AddXY(Angle,Value,ALabel,AColor);
end;
回避方法は下記の2つあります。(bはVCL+Source版のみ)
a) AddXYメソッドを使用。
b) TWindRoseSeriesから新しい系列を派生し、AddPolarメソッドを追加してください。 |
39
|
Q.極系列が複数ある場合、チャートパネルのサイズを変更し、再度リサイズすると極系列がリサイズ(欠けて描画される)されません。どうすればよろしいですか?
|
A.CustomXRadiusおよびCustomYRadiusプロパティがデフォルト値にリセットされないことが原因です。回避方法としましては、FormResizeイベントでこのプロパティをリセットします。
Delphi :
procedure
TForm1.FormResize(Sender:TObject);
begin
Series1.CustomXRadius:=0;
Series1.CustomYRadius:=0;
Series2.CustomXRadius:=0;
Series2.CustomYRadius:=0;
{we had only two series}
end;
C++Builder :
void __fastcall TForm1::FormResize(TObject *Sender)
{
Series1->CustomXRadius=0;
Series1->CustomYRadius=0;
Series2->CustomXRadius=0;
Series2->CustomYRadius=0;
// we had only two series
} |
38
|
Q.極・レーダー・風向図系列でラベルを反時計周りから時計回りに変更するにはどうするのですか? |
A.
Delphi :
type TMyPolarSeries=class(TPolarSeries)
protected
function GetCircleLabel(Const AngleOrIndex:Double):String; override;
end;
function TMyPolarSeries.GetCircleLabel(Const AngleOrIndex:Double):String;
begin
result:=FloatToStr(360-AngleOrIndex); //clockwise
end;
C++Builder :
*.H file :
class TMyPolarSeries : public Series::TPolarSeries
{
typedef Series::TFastLineSeries inherited;
protected:
virtual AnsiString __fastcall GetCircleLabel(const float AngleOrIndex);
public:
__fastcall virtual TMyPolarSeries(Classes::TComponent* AOwner);
__fastcall virtual ~TMyPolarSeries();
};
*.CPP file :
__fastcall TMyPolarSeries::TMyPolarSeries(Classes::TComponent* AOwner) : inherited(AOwner)
{
}
__fastcall TMyPolarSeries::~TMyPolarSeries()
{
}
AnsiString __fastcall GetCircleLabel(const float AngleOrIndex)
{
float result=FloatToStr(360-AngleOrIndex);
return result;
} |
37
|
Q.円系列の境界線を制御できますか?
|
A.PiePenプロパティを使用してください。
Delphi :
Series1.PiePen.Visible:=true;
Series1.PiePen.Width:=1;
Series1.PiePen.Style:=psDot;
C++Builder :
Series1->PiePen->Visible=true;
Series1->PiePen->Width=1;
Series1->PiePen->Style=psDot; |
36
|
Q.チャートエディタから系列を削除(非登録)するにはどうするのですか?
|
A.ギャラリで表示される系列は、usesユニットで制御されます。プロジェクトでユニットを使用する場合、系列はギャラリに登録(表示)されます。下記のコードにより、ギャラリを表示する前に系列を「非登録」にできます。
procedure TForm1.FormCreate(Sender: TObject);
begin
// TLineSeriesおよびTBarSeriesを表示しない
UnRegisterTeeSeries([TLineSeries,TBarSeries]);
end;
uses節にSeriesを追加することを忘れないでください。 |
35
|
Q.実行時に系列型を変更するにはどうするのですか? |
A.ChangeSeriesType(var
ASeries:TChartSeries;NewType:TChartSeriesClass)メソッドを使用してください。下記のコードは、TLineSeries型をTBarSeries型に変更します。
Delphi :
var tmp:TChartSeries;
begin
tmp:=Series1;
ChangeSeriesType(tmp,TChartSeriesClass(TBarSeries));
end;
C++Builder :
ChangeSeriesType(Series1, __classid(TBarSeries)); |
34
|
Q.系列の値だけをストリームに(から)、保存(ロード)のメソッドはありますか? |
A.下記を使用してください。
procedure WriteSeriesData(AStream:TStream; ASeries:TChartSeries);
procedure ReadSeriesData(AStream:TStream; ASeries:TChartSeries);
uses節にTeeStoreを追加することを忘れないでください。 |
33
|
Q.実行時に17以上の系列を異なる色で描画するにはどうするのですか? |
A.17以上の系列を追加すると、17以上の系列は全て同じ色で描画されます。この場合、系列を作成した後に、それぞれの系列に色を設定しなければなりません。
Delphi :
uses TeeProcs;
var t:Integer;
for t:=0 to Chart1.SeriesCount-1 do
Chart1[t].SeriesColor:=GetDefaultColor(t);
C++Builder :
for (int t=0;t<=Chart1->SeriesCount()-1;t++)
Chart1->Series[t]->SeriesColor=GetDefaultColor(t); |
32
|
Q.実行時に系列の順番を変更したいのですがどうするのですか? |
A.系列はChart1.SeriesList
TListオブジェクトに追加されている順番で描画されます。Chart
SeriesDownおよびSeriesUpメソッドを使用して系列を前あるいは後ろに移動できます。 |
31
|
Q.OnClickSeriesイベントでポイントを削除する場合、例外エラーが発生します。 |
A.OnClickSeriesイベントで系列のポイントを削除し、系列のカーソルを指定すると例外エラーが発生します。これは、ポイントが削除された後に発生します。系列は「Chart.Repaint」呼び出しますが、Repaintが終わる前にDelphiがOnMouseMoveイベントを発生するので系列に存在しないポイントをアクセスしてしまうために、このエラーが発生します。回避方法として、ポイントを削除した後にChart1.Updateを呼んでください。OnMouseMoveイベントの前にチャートが正しく再描画されます。(下記のコードを参照してください)これは、系列カーソルを指定しない場合にはエラーが発生しません。
Delphi :
procedure TForm1.Chart1ClickSeries(Sender: TCustomChart; Series:
TChartSeries; ValueIndex: Integer; Button: TMouseButton; Shift: TShiftState; X, Y:
Integer);
begin
if MessageDlg('Delete '+InttoStr(ValueIndex)+ #13, mtWarning, [mbYes, mbNo], 0) =
mrYes then
begin
Series1.Delete(ValueIndex);
Chart1.Update;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Series1.Cursor:=crTeeHand;
end;
C++Builder :
void
__fastcall TForm1::FormActivate(TObject *Sender)
{
Series1->Cursor=(TCursor)crTeeHand;
}
void __fastcall TForm1::Series1Click(TChartSeries *Sender, int ValueIndex, TMouseButton
Button, TShiftState Shift, int X, int Y)
{
Sender->Delete(ValueIndex);
Chart1->Update();
} |
30
|
Q.チャートのタイトルをワードラップできますか? |
A.できません。 |
29
|
Q.ASCIIファイルからチャートに値をインポートできますか? |
A.ASCIIファイルのためのDelphiの標準メソッドを使用できます。
var f:TextFile;
AssignFile( f, 'myfile.txt');
Reset(f);
try
while not eof(f) do
begin
Readln(f, value, label);
Series1.Add( value, label, clGreen );
end;
finally
CloseFile(f);
end; |
28
|
Q.1899以前の日付を使用すると不正な結果になります。どうすればいいのですか? |
A.Delphi 3,4,5のDatetimeの最小値は「1899/01/01」です。そのため、DateTimeを最小値以前の日付に設定すると不正な結果になってしまいます。1つの回避方法として、Datetime値を使用せずに、OnGetAxisLabelイベントで変換を行ってください。
Delphi :
procedure TForm1.FormCreate(Sender:TObject);
begin
Series1.XValues.DateTime:=False;
Series1.BottomAxis.AxisValuesFormat:='';
Series1.AddXY(EncodeDate(1890,1,1),123,'',clTeeColor);
Series1.AddXY(EncodeDate(1890,1,2),321,'',clTeeColor);
end;
procedure
TForm1.Chart1GetAxisLabel(Sender:TChartAxis;Series:TChartSeries;ValueIndex:Integer;var
LabelText:String);
begin
if Sender=chart1.BottomAxis then
LabelText:=FormatDateTime('mm-dd-yyyy',StrToFloat(LabelText));
end;
C++Builder :
void __fastcall
TForm1::FormCreate(TObject *Sender)
{
Series1->XValues->DateTime=false;
Chart1->BottomAxis->AxisValuesFormat="";
Series1->AddXY(EncodeDate(1890,1,1),123,"",clTeeColor);
Series1->AddXY(EncodeDate(1890,1,2),321,"",clTeeColor);
}
void __fastcall TForm1::Chart1GetAxisLabel(TChartAxis *Sender, TChartSeries *Series, int
ValueIndex, AnsiString &LabelText)
{
if (Sender==Chart1->BottomAxis)
{
float tmp=StrToFloat(LabelText);
LabelText=FormatDateTime("mm-dd-yyyy",tmp);
}
} |
27
|
Q.ガント系列を複数のページに分割すると最後のページが正しく表示されません。 |
A.TChartのMaxPointsPerPageプロパティは、系列のXポイントの座標に従ってページに系列を分割します。ガント系列を使用する場合、それぞれのポイントは2つのX座標を持ちます。ページでこのX座標が分けられた場合、最後のページが正しく表示されません。ガント系列の場合は、MaxPointsPerPageプロパティの代わりにSetMinMaxメソッドを使用してください。
Delphi :
Chart1.BottomAxis.SetMinMax(MyMin, MyMax);
C++Builder :
Chart1->BottomAxis->SetMinMax(MyMin, MyMax);
MyMinおよびMyMaxはページの開始と終了のX座標を設定します。
Delphi :
Chart1.BottomAxis.SetMinMax(EncodeDate(1998,1,1), EncodeDate(1998,
12, 31));
C++Builder :
Chart1->BottomAxis->SetMinMax(EncodeDate(1998,1,1),EncodeDate(1998,
12, 31)); |
26
|
Q.TChart.Canvasのピクセルカラーを取得するにはどうするのですか? |
A.Chart.CanvasのReferenceCanvasプロパティを使用してください。
Delphi :
var tmp:TColor;
begin
tmp:=Chart1.Canvas.ReferenceCanvas.Pixels[X,Y];
C++Builder :
TColor tmp;
tmp=Chart1->Canvas->ReferenceCanvas->Pixels[X][Y]; |
25
|
Q.チャート上にどうやってカスタム描画するのですか? |
A.Chart1.Canvasを使用してください。(DelphiのTCanvasドキュメントを参照してください)カスタム描画を常に有効にするために、Chart1.OnAfterDrawイベントにカスタム描画内容のコードを記述してください。テキストを出力する場合は、Chart1.Canvas.TextOutメソッドを使用してください。
Delphi :
procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
With Chart1,ChartRect do
Canvas.Rectangle(Left,Top,Right,Bottom);
end;
C++Builder :
void __fastcall TForm1::Chart1AfterDraw(TObject *Sender)
{
Chart1->Canvas->Rectangle(
Chart1->ChartRect.Left,Chart1->ChartRect.Top,
Chart1->ChartRect.Right,Chart1->ChartRect.Bottom)
} |
24
|
Q.チャートの設定内容をファイルに保存およびファイルからのロードはどのようにするのですか?
|
A.TeeStoreユニット、LoadChartFromFileメソッド、SaveChartToFileメソッドを使用してください。
Delphi :
uses TeeStore;
procedure TForm1.BtnSaveClick(Sender: TObject);
begin
SaveChartToFile(Chart1,'c:\temp\test.tee');
end;
procedure TForm1.BtnLoadClick(Sender: TObject);
var tmpChart:TCustomChart;
begin
Chart1.Free; //assuming Chart1 is already on the Form
tmpChart:=TChart.Create(Self);
LoadChartfromFile(tmpChart,'c:\temp\test.tee);
Chart1 := tmpChart as TChart;
Chart1.Parent:=Self;
end; |
23
|
Q.背景イメージを削除するにはどうするのですか?
|
A.下記のコードで、背景イメージを削除できます。
Delphi :
Chart1.BackImage.Assign(nil);
C++Builder :
Chart1->BackImage->Assign(NULL); |
22
|
Q.あるチャートを他のチャートにコピーするにはどうするのですか? |
A.下記のコードにより他のチャートにコピーできます。(下記の例は他のフォーム上のチャートにコピーしています。)
Delphi :
procedure TForm1.BitBtn1Click(Sender: TObject);
var t:Integer;
begin
With Form2 do
begin
Chart2.FreeAllSeries;
Chart2.Assign(Self.Chart1);
{ duplicate the Series and values }
for t:=0 to Self.Chart1.SeriesCount-1 do
CloneChartSeries(Self.Chart1[t]).ParentChart:=Chart2;
Show;
end;
end;
C++Builder :
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Form2->Chart2->FreeAllSeries();
Form2->Chart2->Assign(this->Chart1);
//duplicate the Series and values
for (int t=0;t<=this->Chart1->SeriesCount()-1;t++)
CloneChartSeries(this->Chart1->Series[t])->ParentChart=Form2->Chart2;
Form2->Show();
} |
21
|
Q.コードで系列型を変更するにはどうするのですか?
|
A.「chart.pas」ユニットに、グローバルメソッドがあります。いくつかの系列型は他の系列に変更できません。(たとえば、サーフェス系列は1つポイントに対し3つの値が必要ですが、リボン系列にはYあるいはXYだけなので変更できません。)
Delphi :
var
MySeries:TChartSeries;
MySeries:=Series1;ChangeSeriesType(MySeries, TBarSeries);
C++Builder :
ChangeSeriesType(Series1, __classid(TBarSeries)); |
20
|
Q.XValuesがTDateTime型ではない場合、TCandleSeriesの使用は可能ですか?
|
A.はい、下記のコードで可能です。
Delphi :
Series1.XValues.DateTime:=false; // DateTimeを使用しない
Series1.AddCandle(10,12,10,3,3);
Series1.AddCandle(11,15,30,12,20);
Series1.AddCandle(15,3,30,11,20);
Series1.AddCandle(18,11,30,22,20);
C++Builder :
Series1->XValues->DateTime=false; // DateTimeを使用しない
Series1->AddCandle(10,12,10,3,3);
Series1->AddCandle(11,15,30,12,20);
Series1->AddCandle(15,3,30,11,20);
Series1->AddCandle(18,11,30,22,20); |
19
|
Q.キャンドル系列のOHLCデータベースチャートで週末を削除するにはどうするのですか?
|
A.キャンドル系列の「系列」
-
「データ」タブの「日付」フィールドを選択しないでください。これは、各ポイント(キャンドルのDateTime値の代わり)に異なるX値を割り当てます:1,2,3,4,5,6....そして、日付ラベルを設定するために、「ラベル」フィールドに「Date」を選択してください。
Delphi :
Series1.XValues.ValueSource:=''; { <--- X座標なし }
Series1.XLabelsSource:="MyDate";
Series1.OpenValues.ValuesSource:="Open";
Series1.CloseValues.ValuesSource:="Close";
Series1.HighValues.ValuesSource:="High";
Series1.LowValues.ValuesSource:="Low";
Series1.DataSource:=Table1;
C++Builder :
Series1->XValues->ValueSource="";
{ <--- X座標なし }
Series1->XLabelsSource="MyDate";
Series1->OpenValues->ValuesSource="Open";
Series1->CloseValues->ValuesSource="Close";
Series1->HighValues->ValuesSource="High";
Series1->LowValues->ValuesSource="Low";
Series1->DataSource=Table1; |
18
|
Q.バーの周りの縁を設定するにはどうするのですか? |
A.BarPenプロパティを使用して縁を簡単に設定できます。
Delphi :
Series1.BarPen.Visible:=true;
Series1.BarPen.Width:=2;
C++Builder :
Series1->BarPen->Visible=true;
Series1->BarPen->Width:=2; |
17
|
Q.系列のソートを昇順/降順に設定するにはどうするのですか? |
A.系列にポイントを追加してある場合、降順にしたい場合は、下記のコードを使用してください。
Delphi :
Series1.Yvalues.Order:=loDescending;
C++Builder :
Series1->YValues->Order=loDescending;
ポイントを追加する前もソート順を設定できます。
Delphi :
Series1.Yvalues.Sort;
C++Builder :
Series1->YValues->Sort(); |
16
|
Q.指定するバーポイントだけ縁を変更したい。 |
A.BarPenプロパティを設定すると、全てのポイントの縁が変更されてしまいます。たとえば、Y値が1000以下のポイントは赤色の縁にしたい場合どうするのですか?
以下のコードのように、バー系列コンポーネントのOnGetBarStyleイベントを使用してください。
Delphi :
procedure TForm1.Series1GetBarStyle(Sender: TCustomBarSeries;
ValueIndex: Integer; var TheBarStyle: TBarStyle);
begin
if Sender.YValues[ValueIndex]<1000 then Chart1.Canvas.Pen.Style:=psClear
else Chart1.Canvas.Pen.Style:=Sender.BarPen.Style;
end;
C++Builder :
void __fastcall
TForm1::Series1GetBarStyle(TCustomBarSeries *Sender, int ValueIndex, TBarStyle
&TheBarStyle)
{
if (Sender->YValues->Value[ValueIndex]<1000)
Chart1->Canvas->Pen->Style=psClear;
else
Chart1->Canvas->Pen->Style=Sender->BarPen->Style;
} |
15
|
Q.チャートの内側だけでなく、外側も使用してバー系列の全てのバーを表示したいのですが、どうするのですか? |
A.バー系列の「CalcVisiblePoints」プロパティをFalseに設定してください。このプロパティがFalseの場合、系列はバーがチャートの内側か外側かを計算しません。
Delphi :
Series1.CalcVisiblePoints:=False;
C++Builder :
Series1->CalcVisiblePoints=false; |
14
|
Q.カスタム軸がズームできません。どうするのですか? |
A.カスタム軸は自動的にズームしません。しかし、チャートのOnZoomおよびOnUndoZoomイベントを使用すると、ズームイン・ズームアウトができます。
Delphi :
procedure TForm1.FormCreate(Sender: TObject);
var tmp: TChartAxis;
begin
Series1.FillSampleValues(20);
tmp:=TChartAxis.Create(Chart1);
tmp.OtherSide:=true;
tmp.PositionPercent:=20;
Series1.CustomVertAxis:=tmp;
end;
procedure TForm1.Chart1Zoom(Sender: TObject);
begin
With Series1.GetVertAxis do
SetMinMax(CalcPosPoint(Chart1.IZoom.Y1),CalcPosPoint(Chart1.IZoom.Y0));
end;
procedure TForm1.Chart1UndoZoom(Sender: TObject);
begin
Series1.GetVertAxis.Automatic:=true;
end;
C++Builder :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TChartAxis* tmp=new TChartAxis(Chart1);
tmp->OtherSide =true;
tmp->PositionPercent=20;
Series1->FillSampleValues(20);
Series1->CustomVertAxis=tmp;
}
void __fastcall TForm1::Chart1Zoom(TObject *Sender)
{
Series1->GetVertAxis->SetMinMax(Series1->GetVertAxis->CalcPosPoint(Chart1->IZoom->Y1),
Series1->GetVertAxis->CalcPosPoint(Chart1->IZoom->Y0));
}
void __fastcall TForm1::Chart1UndoZoom(TObject *Sender)
{
Series1->GetVertAxis->Automatic=true;
} |
13
|
Q.軸のスケールをLog
2にできますか? |
A.LogarithmicBaseプロパティを使用して変更できます。
Delphi :
Chart1.BottomAxis.LogarithmicBase:=2;
C++Builder :
Chart1->BottomAxis->LogarithmicBase=2; |
12
|
Q.指数書式を"E"から"10^"に変更するにはどうするのですか? |
A.Chart OnGetAxisLabelイベントを使用してください。
Delphi :
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;Series:
TChartSeries; ValueIndex: Integer; var LabelText: String);
var tmp:string;
begin
if sender=Sender.ParentChart.BottomAxis then
begin
tmp:=LabelText;
LabelText:=StringReplace(tmp,'E','10^',[rfIgnoreCase]);
end;
end;
C++Builder :
void __fastcall TForm1::Chart1GetAxisLabel(TChartAxis *Sender,
TChartSeries *Series, int ValueIndex, AnsiString &LabelText)
{
AnsiString label = LabelText;
if (Sender==Chart1->BottomAxis)
{
int curPos=label.Pos("E");
if (curPos)
{
label.Delete(curPos,1);
label.Insert(" 10^",curPos);
LabelText=label;
}
}
} |
11
|
Q.チャートからカスタム軸を削除できないのですか? |
A.これは、TCustomChartAxis.Destroyの現在の制限事項です。回避策として、TCustomChartAxis.Destroyの前にChart.AxesList.Removeメソッドを呼び出してください。
Delphi :
tmpSer : TLineSeries;
tmpAxis : TChartAxis;
// create new stuff
tmpSer:=TLineSeries.Create(Self);
tmpSer.FillSampleValues(20);
tmpAxis:=TChartAxis.Create(Chart1);
tmpAxis.PositionPercent:=20;
tmpSer.CustomVertAxis:=tmpAxis;
tmpSer.ParentChart:=Chart1;
// now remove it
tmpSer.CustomVertAxis:=nil;
TChart(tmpSer.ParentChart).AxesList.Remove(tmpAxis);
tmpAxis.Destroy;
tmpSer.ParentChart:=nil;
tmpSer.Free;
C++Builder :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TLineSeries *tmpSer=new TLineSeries(this);
TChartAxis *tmpAxis=new TChartAxis(Chart1);
// create new stuff
tmpSer->FillSampleValues(20);
tmpAxis->PositionPercent=20;
tmpSer->CustomVertAxis=tmpAxis;
tmpSer->ParentChart=Chart1;
// now remove it
tmpSer->CustomVertAxis=NULL;
dynamic_cast<TChart*>(tmpSer->ParentChart)->AxesList->Remove(tmpAxis);
delete tmpAxis;
tmpSer->ParentChart=NULL;
delete tmpSer;
} |
10
|
Q.小さい時間インクリメントを使用すると、ラベルがうまく表示されません。どうすればいいのですか? |
A.最初に、TTime値をDoubleに変更し、表示し、OnGetAxisLabelイベントでそれらの値をTTime形式に戻してください。実際は、Double値で描画されています。軸ラベルが描画された時にTTime形式に変更されています。(下記のコードを参照してください)
Delphi :
procedure TForm1.FormCreate(Sender: TObject);
begin
// データを追加
Series1.AddXY(1,EncodeTime(0,0,2,0));
Series1.AddXY(2,EncodeTime(0,0,2,250));
Series1.AddXY(4,EncodeTime(0,0,2,500));
Series1.AddXY(12,EncodeTime(0,0,2,600));
Chart1.LeftAxis.AxisValuesFormat:='#0.000000'; // 小数部6桁表示
Chart1.LeftAxis.Title.Caption:='time (ss:mmm)';
end;
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;Series: TChartSeries; ValueIndex:
Integer; var LabelText: String);var tmpTime:TTime;h,m,s,ms:Word;
begin
If Sender=Chart1.LeftAxis then
begin
tmpTime:=StrToFloat(LabelText);
DecodeTime(tmpTime,h,m,s,ms);
LabelText:=IntToStr(s)+':'+IntToStr(ms);
end;
end;
C++Builder :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Series1->AddXY(1,EncodeTime(0,0,2,0),"",clTeeColor);
Series1->AddXY(2,EncodeTime(0,0,2,250),"",clTeeColor);
Series1->AddXY(4,EncodeTime(0,0,2,500),"",clTeeColor);
Series1->AddXY(12,EncodeTime(0,0,2,600),"",clTeeColor);
Chart1->LeftAxis->AxisValuesFormat="#0.000000";
// 小数部6桁表示
Chart1->LeftAxis->Title->Caption="time (ss:mmm)";
}
void __fastcall TForm1::Chart1GetAxisLabel(TChartAxis *Sender, TChartSeries *Series, int
ValueIndex, AnsiString &LabelText)
{
float tmpTime;
Word h,m,s,ms;
if (Sender==Chart1->LeftAxis) // If labels from left axis
{
tmpTime=StrToFloat(LabelText); //First create TTime
DecodeTime(tmpTime,h,m,s,ms);
LabelText=IntToStr(s)+":"+IntToStr(ms); // Rewrite label
}
} |
9 |
Q.カスタム軸を使用しています。この軸の外側のポイントをクリッピング(削除)するにはどうするのですか? |
Q.SeriesのOnBeforeDrawValuesイベントのChartRect()値を変更してください。
Delphi :
Chart1.ChartRect:=Rect(100,100,250,250); {このrectの外側の全てのポイントがクリッピングされます}
C++Builder :
Chart1->ChartRect=Rect(100,100,250,250); |
8 |
Q.E-12より小さい値を使用すると、ラベルが正しく表示されません。どうすればよろしいのでしょうか? |
A.軸のインクリメントはE-12が限界になっており、最小の軸の範囲はE-11が限界になっています。これらの定数は、TeEngine.pasで定義されておりますので、範囲あるいはインクリメントをこれらの限界以下に設定した場合、ラベル値は、自動的にインクリメント=1E-12、範囲=1E-11にリセットされます。
もし、これらの限界以下に設定したい場合は、TeEngine.pasの定数を変更するとご利用できます。(TeEngine.pasを変更できるのはVCL+Source版のみです。)
MinAxisIncrement:=0.000000000001;
{<-1E-12, you can change it to smaller value}
MinAxisRange:=0.00000000001; {1E-11, you can change it to smaller value} |
7 |
Q.軸と軸タイトルの間のスペースをどうやって設定するのですか? |
A.これは、ラベルの回転とラベルの値によって異なります。Chart1.LeftAxis.LabelsSizeプロパティを使用することにより、ピクセル単位でスペースを設定できます。 |
6 |
Q.軸の小さい値が描画されないのですが? |
A.デフォルトの軸ラベルの文字列書式は:#,##0.###。
とても小さい値の場合(たとえば:1E-09)、値が3桁少数より細かく上の書式文字列では常に同じ結果を戻します。全ての桁を表示させるには書式を(0.##################)を変更するか、空に設定してください。
Delphi :
Chart1.LeftAxis.AxisValuesFormat := '0.###################';
C++Builder :
Chart1->LeftAxis->AxisValuesFormat =
"0.###################"; |
5 |
Q.対数軸のラベルが重なって表示されてしまいます。 |
A.これはとても難しい問題です。回避方法としまして、「TeeDemo.dpr」デモプロジェクトの中の「loglabels.pas」の例ユニットと同様な方法を行ってください。それは、OnGetNextAxisLabelイベントを使用し、軸ラベルの数と場所をカスタマイズできます。 |
4 |
Q.指定した値の範囲のピクセルサイズを取得するにはどうするのですか?
|
A.軸の「CalcXSizeValue(水平方向)」あるいは「CalcYSizeValue(垂直方向)」メソッドを使用してください。
Delphi :
tmp := Chart1.BottomAxis.CalcXSizeValue(3.2);
C++Builder :
int tmp = Chart1->BottomAxis->CalcXSizeValue(3.2); |
3 |
Q.軸のラベルを指数形式で設定するにはどうするのですか?
|
A.Delphi(あるいはC++Builder)の指定している形式方法を使用してください。
Delphi :
Chart1.BottomAxis.AxisValuesFormat := '0.0E+';
C++Builder :
Chart1->BottomAxis->AxisValuesFormat= "0.0E+"; |
2 |
Q.全ての軸ラベルを表示するにはどうするのですか? |
A.デフォルトで、軸はいくつかのラベルを非表示にしてラベルの重なりを回避しているため、残りを表示できるように、十分なスペースがあります。
「LabelsSeparation」プロパティをゼロに設定することで、全てのラベルを表示することができます。
Delphi :
Chart1.BottomAxis.LabelsSeparation := 0;
C++Builder :
Chart1->BottomAxis->LabelsSeparation=0;
他の方法として、軸ラベルの角度を90°に設定して重なりを回避できます。
Delphi :
Chart1.BottomAxis.LabelsAngle:=90;
C++Builder :
Chart1->BottomAxis->LabelsAngle=90; |
1 |
Q.チャートのスクロールまたはズームをするために、どのように軸のスケールを変更できますか?
|
A.該当する軸の「SetMinMax」メソッドを使用してください。
Delphi :
Chart1.BottomAxis.SetMinMax(EncodeDate(1997,1,1
),EncodeDate(1997,12,31));
C++Builder :
Chart1->BottomAxis->SetMinMax(EncodeDate(1997,1,1
),EncodeDate(1997,12,31));
For non-datetime axes:
Delphi :
Chart1.BottomAxis.SetMinMax(1234,5678);
C++Builder :
Chart1->BottomAxis->SetMinMax(1234.0,5678.0); |