我在实现某些类之间的关系时遇到问题.我有三个不同的课程,提供三种不同的形式.所有这些类都使用相同的语言,因此它们是从同一个类中继承的TAncestorServer.让我们把它的后代TForm1Server,TForm2Server和TForm3Server.TAncestorServer包含一个名为的抽象方法Function1,所以TForm1,TForm2并且TForm3可以通过它们自己继承的类来调用它,它们可以通过名为的属性访问类Server.但问题在于另一种形式叫做TForm4!它与其他形式非常相似,但它并不像他们那样独立.它适用于TForm2Server或TForm3Server.还没问题,但像想象另一种方法,Function2这是在宣布TForm2Server和TForm3Server,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继承两者TAncestorServer和IForm4Server.我认为这样的事情可行:
If Server is IForm4Server then
IForm4Server(Server).Function2;
Run Code Online (Sandbox Code Playgroud)
但是编译器不这么认为,它说它不是一个有效的类型转换,因为TAncestorServer它不是IForm4Server,这是绝对正确的.TForm1Server不知道实施Function2,不得不留空.我不能宣布TForm4.Server为IForm4Server …
是否有任何算法/方法可以在一组点(x,y)周围找到最小的正六边形。
最小的意思是最小的面积。
我目前的想法是找到包围点的最小圆,然后从那里创建一个六边形并检查所有点是否都在里面,但这听起来像是一个永无止境的问题。
我正在尝试为a编写自定义绘制单元格方法TDBGridEh.问题是,当我改变笔,画笔的属性时......绘画变得混乱.那是因为控件在调用事件后会做一些额外的绘画.所以我必须保留所有道具,然后在我自己的画完成后重置它们.
我尝试创建自己的TControlCanvas并为其分配网格,但我得到一个带有消息的运行时异常:
无法将TControlCanvas分配给TControlCanvas
,表示该AssignTo方法TControlCanvas未针对其祖先实施,也未针对其祖先实施.所以我的问题是:
为什么TControlCanvas没有AssignTo方法?问题是什么?
如何保留和恢复TControlCanvas的所有属性?而我的意思的东西比创造更便捷TPen,TBrush,TFont,等.
我正在分析大量图像并提取主要颜色代码。
我想将它们分组为通用颜色名称范围,例如绿色、深绿色、浅绿色、蓝色、深蓝色、浅蓝色等。
我正在寻找一种与语言无关的方式来自己实现一些东西,如果有我可以研究的例子来实现这一点,我将非常感激。
我想将数组的引用传递给需要数组长度的函数.我想知道我是否必须传递它的长度,或者我可以从数组引用中检索它.
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) 我正在尝试从右到左显示ListView的列.这已经被问及并回答了.但问题是关于图标和复选框.当我使用ListView RTL时SetWindowLong,它也会反映图形和复选框,这是不需要的.我可以使用编辑工具镜像图形,困扰但可行,但我不知道如何处理复选框.
我认为他们两个都有相同的原因,所以我搜索了它并在Microsoft Docs中找到了一篇关于RTL布局的完整文章.在" 按设备上下文激活镜像"部分中,它指出了图形问题.它建议改变DC的布局样式LAYOUT_RTL和LAYOUT_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) 我有一个相同大小的数字数组的列表。是否可以在不使用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) 手头有exe文件,是否可以找到有关编译它的人的任何信息?更具体地说,delphi编译器是否包含自己的许可证信息或OS用户,甚至可执行文件中的某些硬件ID?