小编Gra*_*ter的帖子

Delphi元素对齐 - 中心

似乎有align一个非常好的属性,但是可以对齐元素,这样如果所有元素都小于容器的大小,那么面板上的所有元素都将对齐到彼此底部的所有元素?像顶部中心的东西.

像这样的东西:

像这样的东西

或至少水平,垂直,他们可以100%.

delphi vcl delphi-xe6

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

在对象pascal中声明一个接口并将其用作返回值

使用Delphi 7.这是一个(不完整的)示例,演示了我的问题:

interface
uses Classes, Contnrs;

type
   IEditorModule = interface;
   procedure Method1;
   procedure Method2;
   end;

   TEditorModuleList = class(TList)
   protected
    function GetItem(Index: Integer): IEditorModule;
    procedure SetItem(Index: Integer; const Value: IEditorModule);
   public
    property  Items[Index: Integer]: IEditorModule
      read GetItem write SetItem; default;   
   end;

implementation

function TEditorModuleList.GetItem(Index: Integer): IEditorModule;
begin
  Result := IEditorModule(inherited Items[index]);
end;
Run Code Online (Sandbox Code Playgroud)

无法编译,因为我收到此错误:

[错误] LEditorModule.pas(73):不兼容的类型:'IEditorModule'和'TObject'

声明新TList后代的主要原因是能够执行以下操作:

aModuleList[3].Method1;
Run Code Online (Sandbox Code Playgroud)

什么样的语法允许我将对象强制转换为接口(而不是具体的类)?事实:

  • 我不能让TEditorModule成为一个类.它需要是一个接口,因为完全不同的层次结构中的类将实现它.
  • 我需要一个类来存储实现IEditorModule接口的对象列表的引用.

我该怎么做呢?

delphi delphi-7

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

将浮点"> ="转换为">"并将"<="转换为"<"

我正在寻找一种方法在Delphi中获取最小的单浮点值和双浮点值,我可以添加或减去或添加到我的数字,以使浮点数比较的数字不同.或者,如果我可以获得比我的数字更小和更大的下一个浮点数.从浮点的角度来看,我想转换这个:

if (A >= B) or (C <= D) then
Run Code Online (Sandbox Code Playgroud)

if (A > newnumber1) or (C < newnumber2) then
Run Code Online (Sandbox Code Playgroud)

它们在浮点产生相同结果的地方.newnumber1newnumber2显然是用于单和双打不同.我需要一些值,我可以从我的A中减去并添加到我的C值以获得newnumber1和newnumber2,或者我需要一种从B和D获取这些数字的方法.

在C++ 11中,有一个方法std::nextafter在这个问题中引用,看起来就足够了.

在C++中查找最接近的浮点值小于特定的整数值?

上下文

我正在做矢量操作,我需要做相当于大于或等于.实现此目的的最简单方法是采用稍微小一些的数字,并使用大于操作的数字.如果可能的话,我宁愿不要嘲笑似乎有效的价值.

我正在使用的向量操作是ippsThreshold_LTValGTVal_32s来自:

https://software.intel.com/en-us/node/502143

该库显然不支持> =操作.这在浮点意义上是不实际的.要创建一个等效函数,我需要增加和减少我的比较值来计算它,然后使用大于操作和小于操作.

例如

如果我有一个包含5个值的数组[99.4,20,19.9,99,80],ippsThreshold_LTValGTVal_32s向量操作将允许我用我自己的替换值替换向量中的特定值.在这个例子中,我想用0替换所有值> = 99和<= 20.要做到这一点,我想传递这样的东西.因此,我必须用略小的东西替换99,用稍微大一些的东西替换20.

函数签名如下所示:

ippsThreshold_LTValGTVal_32s(..., ..., ..., levelLT, valueLT, levelGT, valueGT);
Run Code Online (Sandbox Code Playgroud)

我的电话会是这样的:

ippsThreshold_LTValGTVal_32s(..., ..., ..., 20.00000001, 0, 98.99999, 0);
Run Code Online (Sandbox Code Playgroud)

然后,这将包括用于小于操作的20和用于大于操作的99,并且给出一个看起来像[0,0,0,0,80]的向量.

我需要找出20.0000001和98.999999的用途.我希望这些值之间的差异和原始值尽可能小,同时仍然足够重要,以包括>和<操作中的值.

delphi simd delphi-xe4

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

适当的对象创建 - 寻找通用解决方案

有3个类(可能还有更多),它们具有相同的过程(程序Populate).它们几乎相同,只是通过对象创建而不同.我想要的只是在基类中编写一个通用过程,它将永远取代这个臭名昭着的代码重复.我不确定,如果我可以准确地表达我的意思,但请查看下面的代码并查看.

  TGrandFather = class(TObject)

  end;

  TFather = class(TGrandFather)

  end;

  TSon = class(TFather)

  end;

  TGrandson.... and so on... 



  TGrandFathers = class (TList)
  public
    procedure Populate(Amount:Integer);
  end;

  TFathers = class (TGrandFathers)
  public
    procedure Populate(Amount:Integer);
  end;

  TSons = class (TFathers)
  public
    procedure Populate(Amount:Integer);
  end;

  TGrandsons.... 
...

procedure TGrandFathers.Populate(Amount:Integer);
var i:integer;
    xGrandFather:TGrandFather;
begin
   for i := 0 to Amount do
   begin
   xGrandFather:=TGrandFather.Create;
   Add(xGrandFather);
   end;
end;

procedure TFathers.Populate(Amount:Integer);
var i:integer;
    xFather:TFather;
begin
   for i := 0 to Amount do
   begin
   xFather:=TFather.Create;    //this is the point, …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

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

编译器定义Design Time包或代码以检查IDE中的执行

是否有任何编译器定义或函数/常量/变量可用于判断某些代码是为构建时间包构建还是从IDE内部执行?

我们在一个单元的初始化中设置了一些代码钩子,这是一个包的一部分.我们不希望在IDE中安装软件包时执行此代码,只有当它作为应用程序的一部分运行时才会执行.

现在我已经为设计时间包添加了一个编译器定义,它剥离了代码,但我想知道是否有一个内置的编译器定义,表明这是设计时包的一部分,或者是否有一些函数/常量可以检查代码是否在IDE中运行.类似于if csDesigning in ComponentState then人们从内部组件使用的旧版本.

delphi delphi-10-seattle

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

Delphi的DFM是否兼容不同版本?

我正在从D7迁移到XE2,并且IDE已经更改了一些DFM文件.

在某些文件中,更改只是一些简单的属性,如删除ItemHeight或添加ExplicitLeft = 0.

但是,在其他文件中,更改比删除整个object声明更大,我可以在将dfm文件与D7进行比较时检查.

当我在XE2中从D7添加DFM的缺失部分时,它会保存而不会出现错误:

未找到TGenReglas类.忽略错误并继续?

我已经检查过,TGenReglas在项目中,我甚至将其文件夹添加到项目路径中,以防万一.

保存并重新打开项目后,我的所有更改都不会保存.

我可以将DFM文件从D7复制到XE2中以解决这个问题或我应该怎么做?

delphi delphi-7 delphi-xe2

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