【问题标题】:Simple Delphi DBcharting简单的 Delphi DBcharting
【发布时间】:2013-03-23 21:25:20
【问题描述】:

所以,我遇到的问题是我在图表上为每个学生显示了两个条形,我只想要其中一个。不过他们的身高是正确的,所以这很好。 这是我的 Delphi 源代码;

strlstField := TStringList.Create();
ADOQGetResults.SQL.clear;
ADOQGetResults.SQL.Add(
                      'SELECT Results.StudentID, SUM(Results.Rawmark) as TRM, StudentInfo.Fname '+
                      'FROM (StudentInfo INNER JOIN Results ON StudentInfo.StudentID = Results.StudentID) '+
                      'WHERE (((StudentInfo.StudentID)=Results.StudentID))  AND Results.TestID =12 '+
                      'GROUP BY StudentInfo.Fname, Results.StudentID'
                      );
ADOQGetResults.Active := True;
ADOQGetResults.Open;

DBChart1.Title.Text.Clear;
DBChart1.Title.Text.Add('Class leaderboard');
DBChart1.Title.Font.Size := 15;
DBChart1.LeftAxis.Title.Font.Size := 12;
DBChart1.LeftAxis.Title.Caption := 'Total marks';
DBChart1.BottomAxis.Title.Font.Size := 12;
DBChart1.BottomAxis.Title.Caption := 'Student';

//Charting Series
//To Remove Old Series
for intCnt := DBChart1.SeriesCount -1 downto 0 do
    DBChart1.Series[intCnt].Free;
//To Add New Series
for intCnt := 1 to ADOQGetResults.FieldCount - 1 do
begin
   strlstField.Add(ADOQGetResults.FieldList[intCnt].FieldName);
   DBChart1.AddSeries(TBarSeries.Create(nil));
end;
//To set source for Series
for intCnt:= 0 to DBChart1.SeriesCount -1 do
begin
   with DBChart1 do begin
      Series[intCnt].Clear;
      Series[intCnt].Title := strlstField[intCnt];
      Series[intCnt].ParentChart := DBChart1;
      Series[intCnt].DataSource := ADOQGetResults;
      Series[intCnt].XLabelsSource := 'Fname';
      Series[intCnt].YValues.ValueSource := 'TRM';
   end;
end;

我整天都在努力找出问题所在,所以如果有人能提供帮助,我将不胜感激! 这是图表现在的样子; http://oi48.tinypic.com/6qelba.jpg

【问题讨论】:

    标签: delphi


    【解决方案1】:
    1. 为什么要遍历结果中的每个字段(在查询中返回 3 个字段)并在结果中添加一个系列 PER 字段?几乎就像您认为字段数等于您的行数或其他内容。其次,我敢猜测,您的查询中的某些内容加上您的数据(我们看不到)可能会导致您在查询结果中获得比预期更多的行。

    2. 当您的查询总是返回 3 个字段、1 个字段未绘制图表、1 个字段是系列标签源和 1 个字段是系列值源时,为什么要销毁和重新添加系列?只需在设计时在您的 dfm 中静态创建一个系列,然后忘记所有这些疯狂的运行时内容。您是否尝试过双击 dbchart 并在其中添加 ONE BarChart 系列?

    3. 这很有效,而且代码更少。顺便说一句,您不需要打开数据集两次。请注意,我这里使用的是 Delphi 自带的 DBDEMOS.mdb 数据库,这样大家就可以一起玩了。添加一个 db 图表并在 DESIGNTIME 添加一个条形图系列。根据需要进行配置。使用此代码。下面的数据集是一个 TADODataset。

    -

    dataset.CommandText :=    'select EmpNo,FirstName,Salary from employee';
    
    dataset.Active := True;
    
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('Class leaderboard');
    DBChart1.Title.Font.Size := 15;
    DBChart1.LeftAxis.Title.Font.Size := 12;
    DBChart1.LeftAxis.Title.Caption := 'Total marks';
    DBChart1.BottomAxis.Title.Font.Size := 12;
    DBChart1.BottomAxis.Title.Caption := 'Student';
    
    
    if DBChart1.SeriesCount<1 then
    begin
      raise Exception.Create('Add series to your chart in the dfm ONCE.');
    end;
    
    
    //To set source for Series
       with DBChart1 do begin
          Series[0].Title :=  'Test';
          Series[0].DataSource := dataset;
          Series[0].XLabelsSource := 'FirstName';
          Series[0].YValues.ValueSource := 'Salary';
       end;
    

    请注意,这仍然比您必须编写的代码多。如果不是全部在 dfm(表单设计器)中,您可以完成大部分操作。

    【讨论】:

    • “疯狂的运行时东西”哈哈。但是设计时的东西只有在你只有一种类型的查询和图表时才有用。 OP 的帖子可能只是一个更可变场景的简化示例。但是对于所有其他 cmets/remarks 还是 +1 :)
    • 如果您需要在运行时添加-a-TBarChart-at-runtime,请务必执行。但如果你不这样做,那么最好不要这样做。 “active := true”的方法,然后是这样的开放,重复,让我认为这个人基本上是在胡乱胡闹,并不是故意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多