delphi - 如何计算字符串网格中选定单元格的最小值、最大值和平均值?

标签 delphi delphi-xe3

我正在使用 Delphi XE3,正在开发一个从 Excel 读取数字类型单元格的应用程序。我使用 TStringGrid 进行此导入。

我已经知道如何将它们放入字符串网格,但无法像 Excel 那样执行任何数学函数。如何计算字符串网格的选定单元格值的最小值、最大值和平均值?

最佳答案

您可以尝试以下功能。它返回在当前字符串网格选择中找到的数值的计数。传递给它的声明参数返回当前选择的数值的最小值、最大值和平均值(如果有的话):

uses
  Math;

function CalcStats(AStringGrid: TStringGrid; var AMinValue, AMaxValue,
  AAvgValue: Double): Integer;
var
  Col, Row, Count: Integer;
  Value, MinValue, MaxValue, AvgValue: Double;
begin
  Count := 0;
  MinValue := MaxDouble;
  MaxValue := MinDouble;
  AvgValue := 0;

  for Col := AStringGrid.Selection.Left to AStringGrid.Selection.Right do
    for Row := AStringGrid.Selection.Top to AStringGrid.Selection.Bottom do
    begin
      if TryStrToFloat(AStringGrid.Cells[Col, Row], Value) then
      begin
        Inc(Count);
        if Value < MinValue then
          MinValue := Value;
        if Value > MaxValue then
          MaxValue := Value;
        AvgValue := AvgValue + Value;
      end;
    end;

  Result := Count;
  if Count > 0 then
  begin
    AMinValue := MinValue;
    AMaxValue := MaxValue;
    AAvgValue := AvgValue / Count;
  end;
end;

这是一个示例用法:

procedure TForm1.Button1Click(Sender: TObject);
var
  MinValue, MaxValue, AvgValue: Double;
begin
  if CalcStats(StringGrid1, MinValue, MaxValue, AvgValue) > 0 then
    Label1.Caption :=
      'Min. value: ' + FloatToStr(MinValue) + sLineBreak +
      'Max. value: ' + FloatToStr(MaxValue) + sLineBreak +
      'Avg. value: ' + FloatToStr(AvgValue)
  else
    Label1.Caption := 'There is no numeric value in current selection...';
end;

另一章是如何在字符串网格的选择发生变化时获取通知。没有事件或虚拟方法来实现像 OnSelectionChange 这样的事件。但这将是另一个问题的主题。

关于delphi - 如何计算字符串网格中选定单元格的最小值、最大值和平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14447453/

相关文章:

delphi - EmptyParam 是变量,现在是函数 - 如何解析遗留代码?

ios - 火猴应用程序。需要数据更新

json - 如何在Delphi XE3中解析JSON对象中的指定值?

delphi - 如何停止Memo控件的自动滚动?

delphi - 亚马逊MWS签名-Delphi

mysql - 在 Delphi 和 MySQL 中使用 Enum 填充 ComboBox

delphi - Delphi中如何防止隐式初始化

delphi - 为什么向 exe 添加大量资源会很慢并且有时会损坏 exe?

delphi - 在 DBGrid 中使用 Canvas.TextOut - Delphi XE 3

delphi - 如何从 DNS 中获取主机名的 IP 地址?