小编rho*_*ody的帖子

将新元素添加到枚举类型

给定Delphi中的枚举类型声明,例如:

TMyType = (Item1, Item2, Item3);
Run Code Online (Sandbox Code Playgroud)

有没有办法在运行时将第四项(比如Item4)添加到枚举类型中,以便在应用程序执行期间的某个时刻我有:

TMyType = (Item1, Item2, Item3, Item4);
Run Code Online (Sandbox Code Playgroud)

或者是在Delphi中修复的类型?

delphi types enumeration

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

如何确定对象是否支持给定的接口(两个DLL之间)

我刚刚开始更熟悉界面是如何工作的,所以如果这是一个微不足道的问题请耐心等待.

我有两个插件(称为A和B)以DLL(不是包)的形式.在应用程序中声明了一个GUID的接口,它加载DLL,称之为IMyInterface.两个插件都使用相同的GUID查看相同的接口定义.插件B实际上实现了接口.

插件A想知道插件B是否支持接口IMyInterface.我使用obj.GetInterface(IMyInterface,IObj)来找出它:

var IObj : IMyInterface;
    obj : TObject;

obj := getPluginObjReference;

if obj.GetInterface(IMyInterface, IObj) then
   showmessage ('Interface Supported');
Run Code Online (Sandbox Code Playgroud)

如果我在插件B中调用此代码,答案是肯定的,这是预期的.如果我在插件A中使用相同的代码(剪切和粘贴),则相同的代码声称插件B不支持该接口.当我将GetInterface调用跟踪到system.pas时,我发现InterfaceEntry:= GetInterfaceEntry(IID); 返回nil,因此找不到接口.

作为参考,IMyInterface看起来像:

IMyInterface = interface
['{277A3122-A3F2-4A14-AE56-C99230F31CE9}']
   function getModel : AnsiString;
   function getDescription : AnsiString;
end;
Run Code Online (Sandbox Code Playgroud)

并且实现如下:

// Now the real class, this is private to this plugin
TModelAPI = class (TInterfacedObject, IMyInterface)
   function getModel : AnsiString;
   function getDescription : AnsiString;
end;
Run Code Online (Sandbox Code Playgroud)

等等

我的问题:

正如预期的那样,插件B正确声称支持IMyInterface.为什么Plugin A无法发现插件B支持IMyInterface?跨越DLL边界询问接口是否有问题?

delphi plugins interface

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

Delphi XE2中的RichEdit控件在某些样式下不会显示字体颜色

我刚刚注意到在Delphi XE2中的一些新的VCL样式中,尝试更改RichEdit控件中的文本颜色不起作用.例如,Smokey Quarts Kamri和Carbon只显示黑色文本,而在Cobalt XEMedia中,字体颜色可以更改.这是我用来改变字体颜色的代码(粗体似乎适用于所有样式)

 memo.selStart:= length (text);
 memo.selLength:= 0;
 memo.SelAttributes.Color:= clRed;
 memo.SelAttributes.Style:= [fsBold];
 memo.selText := text;
Run Code Online (Sandbox Code Playgroud)

有关如何在使用Delphi XE2样式时更改RichEdit控件上的字体颜色的任何想法?

delphi delphi-xe2 vcl-styles

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

有没有办法检测表单是否被点击?

德尔福XE

有没有办法检测表单是否收到鼠标点击?表单中的OnClick事件仅在表单的空白部分触发.任何具有控件的部件都不会响应.

delphi mouseclick-event onmouseclick delphi-xe

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

如何将Delphi中的UTF-8字符串传递给DLL C extern函数?

我在Delphi中调用Visual Studio编译的DLL中的C extern函数.DLL方法又调用C++方法,该方法将C++字符串类型作为参数.Delphi端的字符串是UTF-8编码的(没有BOM).我需要确保采用字符串类型的C++方法获取UTF-8编码的字符串.

我可以修改DLL源代码.我的问题:

我在Delphi端的UTF-8字符串是string类型.C extern方法应该采用什么类型?PChar,PWideChar?以及如何将其转换为C++字符串类型?

注意:我无法首先将UTF-8字符串转换为AnsiString,因为编码存储了一些必须保留的希腊字母.C++端将复制Delphi字符串并处理任何已分配的内存.

Delphi结束(使用XE6):

mystr : string;

callCExternMethod (mystr) // cast to what?
Run Code Online (Sandbox Code Playgroud)

C++ End(使用VS 2013):

void callCExternMethod (????? mystr) {

  // convert mystr to C++ string type

  callCPlusPlusMethod (takes C++ string type)
}
Run Code Online (Sandbox Code Playgroud)

c delphi string utf-8

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

如何将基数转换为无符号字符串表示

我有一个返回UInt32的DLL例程.我认为德尔福基数类型相当于这种类型.我想将UInt32值显示为字符串.但是,inttostr()假定参数是带符号的Int32,因此它有时会返回一个具有负值外观的字符串.有没有办法将基数转换为无符号字符串表示?

使用XE6.

delphi

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

什么是char***的Delphi声明

我有一个基于C的DLL导出一个char***作为参数的函数,这是一个指向char指针的指针(非unicode)我的问题是,经过多次挫折,什么是等效声明在德尔福结束?

我试过例如:

 // C Method declaration
 void method (char*** arg)


 TArrayOfPAnsiChar = array of PAnsiChar;
 PArrayOfPAnsiChar = ^TArrayOfPAnsiChar;
 PPArrayOfPAnsiChar = ^PArrayOfPAnsiChar;

 // Delphi declaration
 procedure method (var p : PPArrayOfPAnsiChar); cdecl;

 p : PPArrayOfAnsiChar;
 method (p)
Run Code Online (Sandbox Code Playgroud)

但我没有得到任何明智的回报.有什么建议?声明中的var当然已经是一个指针,所以也许这就是我出错的地方.我已经尝试了很多变体,在纸上写下了结构是什么,反向设计了德尔福的解体但无济于事.此DLL用于其他基于C的应用程序,因此我认为它的功能正常.

使用XE6

delphi

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

在FireMonkey中创建图像按钮

适用于XE6,Firemonkey

我通过在firemonkey中自定义TSpeedButton来创建一个带有图像的按钮.我这样做是通过在样式编辑器中向TSpeedButton添加图像.新按钮工作正常.我现在想制作另一个图像按钮,所以我想我会复制并粘贴表格上的第一个按钮.我更改了复制按钮中的图像(通过样式编辑器),当我点击应用并关闭时,新按钮获取新图像.但是我也注意到我复制的原始按钮也获得了新图像.所以现在我有两个具有相同图像的按钮.除了创建一个全新的按钮并添加一个新图像(这允许我使用具有独特图像的按钮)之外,有没有办法使用复制/粘贴创建具有自己样式的按钮?

我注意到这个问题与如何编辑样式设计器之外的FireMonkey样式中的控件有关但在这里我想做同样的事情,但是从IDE,而不是以编程方式.

delphi firemonkey

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

如何使用 pandas 仅绘制散点矩阵的一半

我正在使用 pandas scatter_matrix (无法让 seaborn 中的 PairgGrid 工作)来绘制 pandas 框架中一组列的所有组合。每列有 9 列,有 1000 个数据点。

我正在使用以下代码:

pandas.plotting.scatter_matrix(df, alpha=0.2, figsize=(8,8))
Run Code Online (Sandbox Code Playgroud)

我得到如下图所示:

在此输入图像描述

这很好。但是,您会注意到在主对角线上我有一个镜像。是否可以仅绘制下部部分,如我使用油漆制作的以下假图所示:

在此输入图像描述

python matplotlib pandas

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

如何在启动时隐藏 Delphi 控制台应用程序

我想控制 Delphi 控制台窗口在启动时何时可见。目前我使用以下代码作为我隐藏控制台的第一件事,做其他事情,然后让它再次可见

showWindow(GetConsoleWindow, SW_HIDE);

... do other stuff

showWindow(GetConsoleWindow, SW_NORMAL);
Run Code Online (Sandbox Code Playgroud)

但是,在被 SW_HIDE 隐藏之前,仍然可以看到初始控制台窗口的闪烁。在 Windows 甚至尝试在启动时使其可见之前,是否有另一种方法可以隐藏控制台窗口?

为了提供更多背景信息,我所追求的用户体验是控制台屏幕出现在屏幕中央。我知道如何将控制台窗口居中,但在窗口居中之前,我仍然在启动时看到闪烁。我想控制控制台何时可见,以便对用户而言,控制台窗口在启动时不会出现任何窗口幽灵。

delphi console

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

TCollection.Add是否实际添加?

我已经开始在Delphi XE中使用TCollection类,并且在Delphi中的Using TOwnedCollection后代中找到了答案,是一个很好的起点。TCollection管理TCollectionItems的列表。但是我注意到TCollection.Add似乎没有将TCollectionItem添加到Collections数组,实际上我的测试似乎证实了这一点。TCollection本身的代码是:

function TCollection.Add: TCollectionItem;
begin
  Result := FItemClass.Create(Self);
  Added(Result);
end; 
Run Code Online (Sandbox Code Playgroud)

FItemClass是将创建的对象类型,我认为已添加到TCollection对象中。不推荐使用Added()方法,它似乎是一个旧的通知方法。我在哪里都看不到将结果添加到集合中。如何将TCollectionItem添加到TCollection?

delphi

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