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

Delphi 如何计算字符串网格中选定单元格的最小值、最大值和平均值?,delphi,delphi-xe3,Delphi,Delphi Xe3,我正在使用DelphiXE3,我正在开发一个从Excel中读取数字类型单元格的应用程序。我正在使用TStringGrid进行此导入 我已经知道了如何将它们放到字符串网格中,但无法像Excel中那样处理任何数学函数。如何计算字符串网格中选定单元格值的最小值、最大值和平均值?您可以尝试以下函数。它返回在当前字符串网格的选择中找到的数值的计数。传递给它的To声明参数从当前选择的数值(如果有)返回最小值、最大值和平均值: 另一章是如何在字符串网格的选择发生更改时获取通知。没有事件或虚拟方法来实现类似于O

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


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

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


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

您可以使用实时绑定来实现这一点。或者绝地的表情评估师。这两个库都有大量的演示和示例可用。这就是您想要的吗?如果没有,请毫不犹豫地在这里发表评论。如果有任何反馈,我将不胜感激。不客气!如果它解决了你的问题,你可能会。谢谢对不起,忘了。再次感谢!:)
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;