求教Tchart中关于ChartWidth、BarWidth的两个问题,急(100分)

  • 主题发起人 主题发起人 Discus
  • 开始时间 开始时间
D

Discus

Unregistered / Unconfirmed
GUEST, unregistred user!
BarWidth是TBarSeries的一个只读属性,在Delphi 6下,我取柱状图的宽度时,
Series.BarWidth却总是返回0,同样的现象也发生在TChart的ChartWidth属性。不知何
故?
我用CB 5来写程序时发现更怪,读TBarSeries对象的BarWidth属性时,由于
TBarSeries对象要去读其父类TCustomBarSeries的IBarSize才可获知BarWidth,但是
其父类的IBarSize竟是Private类型,根本无法获取。我试着在CB 5的Series.hpp文
件中将TCustomBarSeries的IBarSize修改为Protected类型,现在编译倒是通过了,但是
运行时症状和在Delphi下一样,BarWidth属性只能返回0。
求教!
 
你说的现象好象没有出现啊
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.AddBar(12,'12',clred);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(Series1.BarWidth);
Edit2.Text:=IntToStr(Chart1.ChartWidth);
end;
然后,edit1,edit2都出现了宽度数值啊
 
wangfu啊,你再试试这段代码
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.AddBar(12,'12',clred);
ShowMessage(IntToStr(Series1.BarWidth));
end;
 
没有人回答吗?为什么下面这段代码中,BarWidth总是返回0呢?
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.AddBar(12,'12',clred);
ShowMessage(IntToStr(Series1.BarWidth));
end;
 
to Discus
你把哪个安钮用鼠标多点一次,看看,怎么样?宽度出来了吧 :)
 
是啊,but why?
 
BarWidth是个只读且在运行时刻才有效的属性,它只有在运行时改变chart的大小时才会
改变本身的值。所以每次都返回上一次的值
 
同意楼上。
 
wangfu兄,在执行:
Series1.AddBar(12,'12',clred);
以后,Series的宽度已经改变,为什么此时取BarWidth依然是上一次的值?
 
我的理解是当chart大小改变时,而不是Series大小改变的时候
Barwidth属性才会改变
请看:
Edit5.Text := IntToStr(Chart1.ChartWidth);
Series1.AddBar(12,'12',clred);
Edit3.Text := IntToStr(Series1.BarWidth);
Edit4.Text := IntToStr(Chart1.ChartWidth);
这个时候edit5和edit4是相等的,也就是说第一次Addbar前后chartwidth并没有改变
所以edit3为0,也就是说没有改变barwidth属性的值。
--
我倒,刚才打了半天字,断线了,老天你要把我气死啊
[:(!][:(!]
 
先看wangfu最先给出的例子:
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.AddBar(12,'12',clred);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(Series1.BarWidth);
Edit2.Text:=IntToStr(Chart1.ChartWidth);
end;

在Button1的Click事件中改变BarWidth,然后在Button2的Click事件中取BarWidth,
结果正确。但是将这两个事件的代码放到一个Button1的Click事件中(如下),
BarWidth就为上一次的值(0),这是何故呢?
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.AddBar(12,'12',clred);
Edit1.Text:=IntToStr(Series1.BarWidth);
Edit2.Text:=IntToStr(Chart1.ChartWidth);
end;
 
在上面在添加一个,跟踪一下
procedure TForm1.Button1Click(Sender: TObject);
begin
Series1.AddBar(12,'12',clred);
Edit3.Text:=IntToStr(Chart1.ChartWidth);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(Series1.BarWidth);
Edit2.Text:=IntToStr(Chart1.ChartWidth);
end;

这样,你就会发现edit2和edit3不相等的,也就是说还是chartwidth改变了
你说呢?
 
现在我在程序中如果想在改变Series之后(比如Add Bar)
立即获得最新的BarWidth,该怎么写代码呢?
 
我倒,兄弟你好狠啊,我没有功劳也有苦劳啊
你一分都不给我,算你狠[:(!][:(!][:(!]
 
接受答案了.
 
后退
顶部