小编saa*_*stn的帖子

调用从接口和另一个祖先继承的类的方法

我在实现某些类之间的关系时遇到问题.我有三个不同的课程,提供三种不同的形式.所有这些类都使用相同的语言,因此它们是从同一个类中继承的TAncestorServer.让我们把它的后代TForm1Server,TForm2ServerTForm3Server.TAncestorServer包含一个名为的抽象方法Function1,所以TForm1,TForm2并且TForm3可以通过它们自己继承的类来调用它,它们可以通过名为的属性访问类Server.但问题在于另一种形式叫做TForm4!它与其他形式非常相似,但它并不像他们那样独立.它适用于TForm2ServerTForm3Server.还没问题,但像想象另一种方法,Function2这是在宣布TForm2ServerTForm3Server,TForm4需要给他们打电话.我可以这样:

if Server is TForm2Server then
   TForm2Server(Server).Function2
else if Server is TForm3Server then
  TForm3Server(Server).Function2;
Run Code Online (Sandbox Code Playgroud)

但它可以变成一个无限的if-else子句!所以我认为像多重继承这样的东西可能会有所帮助.我声明了一个名为IForm4Servercontains 的接口Function2.所以TForm2Server,TForm3Server继承两者TAncestorServerIForm4Server.我认为这样的事情可行:

If Server is IForm4Server then
  IForm4Server(Server).Function2;
Run Code Online (Sandbox Code Playgroud)

但是编译器不这么认为,它说它不是一个有效的类型转换,因为TAncestorServer它不是IForm4Server,这是绝对正确的.TForm1Server不知道实施Function2,不得不留空.我不能宣布TForm4.ServerIForm4Server …

delphi oop interface multiple-inheritance

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

最小的封闭正六边形

是否有任何算法/方法可以在一组点(x,y)周围找到最小的正六边形。

最小的意思是最小的面积。

我目前的想法是找到包围点的最小圆,然后从那里创建一个六边形并检查所有点是否都在里面,但这听起来像是一个永无止境的问题。

algorithm geometry mathematical-optimization

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

如何保留TControlCanvas的所有属性并在以后恢复?

我正在尝试为a编写自定义绘制单元格方法TDBGridEh.问题是,当我改变笔,画笔的属性时......绘画变得混乱.那是因为控件在调用事件后会做一些额外的绘画.所以我必须保留所有道具,然后在我自己的画完成后重置它们.

我尝试创建自己的TControlCanvas并为其分配网格,但我得到一个带有消息的运行时异常:

无法将TControlCanvas分配给TControlCanvas

,表示该AssignTo方法TControlCanvas未针对其祖先实施,也未针对其祖先实施.所以我的问题是:

  1. 为什么TControlCanvas没有AssignTo方法?问题是什么?

  2. 如何保留和恢复TControlCanvas的所有属性?而我的意思的东西比创造更便捷TPen,TBrush,TFont,等.

delphi graphics tcanvas

4
推荐指数
2
解决办法
285
查看次数

如何将 RGB 或 HEX 颜色代码分组为更大的颜色组集?

我正在分析大量图像并提取主要颜色代码。

我想将它们分组为通用颜色名称范围,例如绿色、深绿色、浅绿色、蓝色、深蓝色、浅蓝色等。

我正在寻找一种与语言无关的方式来自己实现一些东西,如果有我可以研究的例子来实现这一点,我将非常感激。

classification image-processing computer-vision

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

是否可以从引用中获取(静态/动态)数组的长度?

我想将数组的引用传递给需要数组长度的函数.我想知道我是否必须传递它的长度,或者我可以从数组引用中检索它.

uses
  Vcl.Dialogs, System.SysUtils, System.Types;

type
  IntegerArray  = array[0..$effffff] of Integer; // defined in System
  PIntegerArray = ^IntegerArray; // defined in System

procedure Foo(const P: PIntegerArray);
begin
  ShowMessage(IntToStr(Length(P^)));
end;

const
  A: array[0..2] of Integer = (1, 2, 3);
var
  B: TIntegerDynArray;

initialization
  Foo(@A);
  B := [4, 5, 6];
  Foo(@B[0]);
end.
Run Code Online (Sandbox Code Playgroud)

arrays delphi pointers

3
推荐指数
2
解决办法
170
查看次数

防止RTL TListView镜像复选框和/或图形

我正在尝试从右到左显示ListView的列.这已经被问及并回答了.但问题是关于图标和复选框.当我使用ListView RTL时SetWindowLong,它也会反映图形和复选框,这是不需要的.我可以使用编辑工具镜像图形,困扰但可行,但我不知道如何处理复选框.

在此输入图像描述

我认为他们两个都有相同的原因,所以我搜索了它并在Microsoft Docs中找到了一篇关于RTL布局的完整文章.在" 按设备上下文激活镜像"部分中,它指出了图形问题.它建议改变DC的布局样式LAYOUT_RTLLAYOUT_BITMAPORIENTATIONPRESERVED标志.

这是我用文章中提出的组合方法和上面提到的答案实现的功能:

const
  LAYOUT_RTL = 1;
  LAYOUT_BITMAPORIENTATIONPRESERVED = 8;

function GetLayout(DC: HDC): DWORD; stdcall; external 'gdi32.dll';
function SetLayout(DC: HDC; dwLayout: DWORD): DWORD; stdcall; external 'gdi32.dll';

procedure MakeRTL(const Handle: HWND);
var
  DC: HDC;
begin
  SetWindowLong(Handle, GWL_EXSTYLE,
    GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYOUTRTL);

  DC := GetWindowDC(Handle);
  if DC <> 0 then
    SetLayout(DC, GetLayout(DC) or LAYOUT_RTL or LAYOUT_ORIENTATIONMASK);

  InvalidateRect(Handle, nil, True);
end;
Run Code Online (Sandbox Code Playgroud)

但它没有改变任何东西.我试图阻止其中任何一个,改变它们的顺序并改变不同的地方来调用它,但没有成功.

现在的问题是,如何使ListView的列从右到左显示,而不镜像图形或复选框?

我正在使用Win10 x64和Delphi 2010.

如果你想重现这个问题,这是我的delphi代码:

unit Unit1; …
Run Code Online (Sandbox Code Playgroud)

delphi winapi listview gdi+ right-to-left

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

如何使用LINQ对未知数量的数组元素求和?

我有一个相同大小的数字数组的列表。是否可以在不使用for循环的情况下计算其第一,第二,...,第n个元素的总和?

这是我使用循环执行的代码:

static void Main(string[] args)
{
    List<int[]> list = new List<int[]>();
    int n = 4;
    list.Add(new int[] { 1, 2, 3, 4 });
    list.Add(new int[] { 5, 6, 6, 7 });
    list.Add(new int[] { 8, 9, 10, 11 });

    int[] sum = new int[n];
    foreach (int[] array in list)
        for (int i = 0; i < n; i++)
            sum[i] += array[i];
    foreach (int value in sum)
        Console.Write($"{value} ");
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

c# linq

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

是否有可能找到谁建立了exe文件?

手头有exe文件,是否可以找到有关编译它的人的任何信息?更具体地说,delphi编译器是否包含自己的许可证信息或OS用户,甚至可执行文件中的某些硬件ID?

delphi portable-executable

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