小编j.k*_*par的帖子

Delphi - 比较两个"Real"数字变量

我对"Real"类型的两个变量的比较有问题.一个是数学运算的结果,存储在数据集中,第二个是表单中的编辑字段的值,由StrToFloat转换并存储到"Real"变量.问题是这样的: 121,97不等于121,97

正如你所看到的,该程序试图告诉我,121,97不等于121,97 ...我已经阅读了 这个主题,我并不完全确定,这是同样的问题.如果是,那么变量中存储的数字不会是完全相同的最接近可表示的数字,对于121.97是121.96999 99999 99998 86313 16227 83839 70260 62011 71875多少?

现在让我们说它们不会存储为最接近的可表示数字.我怎样才能找到它们的存储方式?当我查看"CPU"调试窗口时,我完全迷失了.我看到地址,那些值应该是,但没有什么甚至类似于一些二进制,十六进制或实际数字的任何表示...我承认,高级调试对我来说是未知的宇宙......

编辑:这两个值确实略有不同.

在此输入图像描述

好的,我不需要了解一切.虽然我没有处理金钱,但最多会有3位小数,所以"货币"就是出路

顺便说一句:计算方法是:

DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它是3695 - 3573.03

delphi floating-point

7
推荐指数
1
解决办法
844
查看次数

圆周上每个点的坐标

首先,请注意,这个问题不是这些问题的重复:1st2nd3rd

我正在使用 delphi 和 openCV,但我正在寻找一种算法,一种与语言无关的解决方案。

为了进行精确的图像分析,我需要检查圆形区域中像素强度的变化。所以我在不断增长的圆的圆周上读取像素值。为了能够做到这一点,我当然需要知道像素的坐标。

我找到的最好的解决方案是y:= Round(centerY + radius * sin(angle)), x:= Round(centerX + radius * cos(angle)),因为只用 360 度计数是不够的,当圆的半径大于大约 60 像素时,角度是这样计算的angle:= angle + (360 / (2 * 3.14 * currentRadius))- > 我扫描了从 0 到 360 的每个值,而该值正在增加 360/圆周长的一小部分(以像素为单位)。但是这种方法不是很精确。圆越大,角度的分数需要越小,精度会受到 Pi 的不准确以及四舍五入的影响。

如果我使用上述方法,并尝试使用以下代码绘制计数像素:

  centerX:= 1700;
  centerY:= 1200;
  maxRadius:= 500;

  for currentRadius:= 80 to maxRadius do
  begin

    angle:= 0;
    while angle < 360 do
    begin

      xI:= Round(centerX + currentRadius * cos(angle));
      yI:= Round(centerY …
Run Code Online (Sandbox Code Playgroud)

delphi algorithm math opencv image-processing

5
推荐指数
1
解决办法
3462
查看次数

Delphi-RoundTo-总是掉下来

我需要将浮点数四舍五入到小数点后两位,但总是向下。现在,我使用RoundTo(number, -2),但是它在数学上正确地进行了舍入,这对于我的情况是不希望的行为。除了我需要这样做的原因...

我最终使用以下方法实现了它:

var a,b: currency;
    floatStr: string;
    format: TFormatSettings;
    localeDec: char;
begin


  format:= TFormatSettings.Create;
  localeDec:= format.DecimalSeparator;
  format.DecimalSeparator:= ',';
  System.SysUtils.FormatSettings:= format;

  a:= 2/30;
  floatStr:= floatToStr(a);
  b:= strToCurr(
      copy(floatStr, 1, ansiPos(',', floatStr) + 2)
  );
  showMessage(currToStr(b));

  format.DecimalSeparator := localeDec;
  System.SysUtils.FormatSettings:= format;

end;
Run Code Online (Sandbox Code Playgroud)

但是,这种解决方案感觉并不正确。有没有一种“数学上干净的”方法来做到这一点,而又不会弄乱字符串和重置小数点分隔符等?我搜索了很多,但没有找到。

delphi rounding

1
推荐指数
1
解决办法
2914
查看次数

Delphi获取(并销毁)表单的实例

在使用"主窗体"上的TPanel的应用程序中,为了显示其他窗体,我需要不仅能够在TPanel上显示这些窗体,而且还能够使用主窗口上的控件(按钮)关闭和销毁它们形成.

目标是遵循 - 许多按钮,每个按钮在主窗体上的一个面板上显示特定的形式.然后,一个按钮,杀死当前正在显示的任何可能的形式(=嵌入在面板上).另外,每当触发一些"打开"按钮时,应该调用相同的关闭/终止动作,因此如果面板上显示某个表单,则应该用新表单替换它.

要在TPanel中显示表单,我使用以下内容:

procedure TMainForm.Button1Click(Sender: TObject);
begin
  if not assigned(form4) then
    form4:= TForm4.Create(Panel2);
  form4.Parent:= Panel2;
  form4.Show;
end;
Run Code Online (Sandbox Code Playgroud)

现在,为了关闭窗口,使用主窗体上的另一个按钮,我尝试了各种方法,包括CloseWindow方法,使用句柄或指针等.最有希望的方式,是这样的:

procedure TMainForm.Button2Click(Sender: TObject);
begin
  Panel2.controls[0].Free;
end;
Run Code Online (Sandbox Code Playgroud)

它实际上关闭了表单,但由于FreeAndNil没有使用,重复单击Button1,导致一系列令人讨厌的异常,因为表单(在这种情况下为form4)已被释放,但对它的引用没有,所以assigned()方法返回是的,然后我尝试为某个不再存在的东西赋值form4.Parent:= Panel2;.Action:= caFree嵌入式表单上的onClose 也没有帮助,因为onClose操作根本没有被触发...放置FreeAndNil(Form4)Form4的onDestroy事件,也会导致一系列以"无效指针操作"开头的异常.

运用

procedure TMainForm.Button2Click(Sender: TObject);
begin
  FreeAndNil(Panel2.controls[0]);
end;
Run Code Online (Sandbox Code Playgroud)

导致以下错误: [dcc32 Error] Unit3.pas(47): E2197 Constant object cannot be passed as var parameter

那么获取嵌入式表单实例的正确方法是什么,能够使用FreeAndNil(......表单......)?我无法通过名称来解决它,主要是因为我不知道当前显示的是什么形式.我需要能够找到基于事实的表单实例,它属于TPanel主窗体上,然后完全销毁它,以便再次单击Button1,再次显示它,然后再单击Button2将再次关闭并销毁它.

forms delphi

-4
推荐指数
1
解决办法
378
查看次数