甚至Delphi 2010与TBitBtn相关的字形也不稳定且"丑陋".是否存在向后兼容的原因?Embarcadero是否包含我可以使用的更新的png替换而不是这些正常的字形?
也许这只是我,但我很想看到Embarcadero征求(或雇用)平面设计师来改善这些图标.

我正在准备一个安装程序(Inno Setup)将我的组件包安装到Delphi XE中,而无需在IDE中手动操作.
如何将Delphi组件包(例如,MyComponent.bpl)安装到Delphi中,而无需通过"Install Packages"菜单项手动执行此操作?它是注册表项吗?
我目前正在为我的产品的DLL开发一个C#P/invoke包装器.我没有C#的经验,这是我做过的第一个重要的C#编码.我敏锐地意识到我对语言的细节和习语缺乏了解.
我的问题涉及我正在编写的单元测试,我使用的是NUnit.我需要比较double[]变量的值.如果我Assert.AreEqual(...)这样做,那么比较值是否完全相等.但是,我想比较宽容.AreEqual()允许delta参数的标量实数值存在重载.但是,我无法找到数组的等价物.我错过了一些明显的事吗?
目前我用以下代码解决了这个问题:
class Assert : NUnit.Framework.Assert
{
public static void AreEqual(double[] expected, double[] actual, double delta)
{
AreEqual(expected.Length, actual.Length);
for (int i = 0; i < expected.Length; i++)
{
AreEqual(expected[i], actual[i], delta);
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这似乎有效,但我想知道是否有更清洁的解决方案.特别值得我担心的是,对于我的派生类使用相同的名称,不仅风格很差,而且可能会导致未预料到的问题.
我想要使用扩展方法,但我知道它们只适用于扩展时有类的实例.当然,我只在Assert类上调用静态方法.
我很抱歉,如果这看起来有点模糊,但我的直觉告诉我,我不是这样做的最佳方式,我想知道如何做对.
考虑以下非常简单的单元:
Unit1.pas
unit Unit1;
interface
uses
Windows, Classes, Controls, Forms, ComCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
SLongString = 'blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah';
procedure TForm1.FormCreate(Sender: TObject);
var
Node: TTreeNode;
begin
TreeView1.Width := 200;
Node := TreeView1.Items.Add(nil, SLongString);
Node.Text := 'blah';
end;
end.
Run Code Online (Sandbox Code Playgroud)
Unit1.dfm
object Form1: TForm1
ClientHeight = 137
ClientWidth = 216
OnCreate = FormCreate
PixelsPerInch = …Run Code Online (Sandbox Code Playgroud) 我有一个32位Windows应用程序,主要用Delphi编写,它使用8087 FPU执行浮点数值模拟.我最近添加了通过python2x.dll使用Python API链接外部Python代码的功能.最近的这一变化导致了一些非常奇怪的行为.
该应用程序具有批处理操作模式,可并行执行多个模拟以利用多核架构.一旦在此过程中执行了Python代码,我就开始在不同的线程上看到对8087控制字的更改.我已经仔细检查了这一点,我观察到控制字已经改变了,即使在一个从未调用过Python DLL的线程中也是如此.
我知道这听起来很奇妙,但是,正如我所发现的那样,有一些机制可以表明这种行为.我已经了解了信号.我首先假设Python DLL正在设置进程范围的信号处理程序(通过调用signal()),这些信号处理程序负责更改控制字.例如,与Python代码无关的线程可能会导致SIGFPE并且可能反过来修改控制字.
我宁愿得出signal()不是机制的结论.我安排在启动时执行Python代码.然后我将信号处理程序设置回来SIG_DFL.然后我开始模拟.但仍然发生了控制字的变化.
我的问题(最后)是否有人知道可以通过这种方式改变控制字的另一种机制.我想要寻找中断,APC等等!
更新
控制字正在更改为0x037FIntel默认值.这与MSVC/Windows默认值不同0x027F.我假设某事正在呼唤FPINIT.
我还发现Py_InitializeEx允许调用者停止Python设置信号处理程序.即使我使用这种方法进行初始化,控制字也会发生变化,因此我更加确信这不是机制.
我正在尝试TListView根据NGLN对另一个SO问题的答案在Delphi中自定义绘制进度条.除了使用Vista中引入的新资源管理器主题绘制时与热跟踪的交互之外,此工作正常.
热跟踪绘画和Delphi自定义绘图事件似乎互相干扰.例如,我看到的那种输出看起来像这样:

第1列中的文字应为第3项,但已删除.它看起来像列表视图控件的Delphi包装中的一个错误,但同样可能是我做错了!
虽然我一直在XE2中开发这个,但是在2010年也发生了同样的行为,大概是XE.
这是重现此行为的代码:
Pascal文件
unit Unit1;
interface
uses
Windows, Classes, Controls, Forms, CommCtrl, ComCtrls;
type
TForm1 = class(TForm)
ListView: TListView;
procedure FormCreate(Sender: TObject);
procedure ListViewCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ListView.RowSelect := True;
ListView.Items.Add.Caption := 'Item 1';
ListView.Items.Add.Caption := 'Item 2';
ListView.Items.Add.Caption := 'Item 3';
end;
procedure TForm1.ListViewCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: …Run Code Online (Sandbox Code Playgroud) 在尝试编写与此问题相关的自定义封送程序(P/Invoke从C到C#而不知道数组的大小)时,我遇到了一些我无法理解的问题.这是我写的第一个定制封送器,所以毫无疑问,由于我的无知,我错过了一些明显的东西.
这是我的C#代码:
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace CustomMarshaler
{
public class MyCustomMarshaler : ICustomMarshaler
{
static MyCustomMarshaler static_instance;
public IntPtr MarshalManagedToNative(object managedObj)
{
if (managedObj == null)
return IntPtr.Zero;
if (!(managedObj is int[]))
throw new MarshalDirectiveException("VariableLengthArrayMarshaler must be used on an int array.");
int[] arr = (int[])managedObj;
int size = sizeof(int) + arr.Length * sizeof(int);
IntPtr pNativeData = Marshal.AllocHGlobal(size);
Marshal.WriteInt32(pNativeData, arr.Length);
Marshal.Copy(arr, 0, pNativeData + sizeof(int), arr.Length);
return pNativeData;
}
public object MarshalNativeToManaged(IntPtr pNativeData)
{
int …Run Code Online (Sandbox Code Playgroud) 用于Win32的Delphi XE5编译器具有调试信息的新设置:有限调试信息.
有限调试信息和调试信息有什么区别?
我怀疑我无法解决.我已经在embarcadero上阅读了类构造函数的文档,但我无法理解它的含义.换句话说,a constructor和a 之间的用法差异是class constructor什么?我这样做了:
type
TGeneric<T> = class
private
FValue: T;
aboutString: string;
procedure setValue(const a: T);
public
property V: T read FValue write setValue;
property about: string read aboutString;
constructor Create;
destructor Destroy; override;
end;
implementation
{ TGeneric<T> }
constructor TGeneric<T>.Create;
begin
inherited;
aboutString := 'test';
end;
Run Code Online (Sandbox Code Playgroud)
相反,此代码无法正常工作:
type
TGeneric<T> = class
private
FValue: T;
aboutString: string;
procedure setValue(const a: T);
public
property V: T read FValue write setValue;
property about: string read aboutString; …Run Code Online (Sandbox Code Playgroud) 我必须使用C#.NET以编程方式为文件夹及其子文件夹和文件分配权限.我这样做如下:
var rootDic = @"C:\ROOT";
var identity = "NETWORK SERVICE"; //The name of a user account.
try
{
var accessRule = new FileSystemAccessRule(identity,
fileSystemRights: FileSystemRights.Modify,
inheritanceFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
propagationFlags: PropagationFlags.InheritOnly,
type: AccessControlType.Allow);
var directoryInfo = new DirectoryInfo(rootDic);
// Get a DirectorySecurity object that represents the current security settings.
DirectorySecurity dSecurity = directoryInfo.GetAccessControl();
// Add the FileSystemAccessRule to the security settings.
dSecurity.AddAccessRule(accessRule);
// Set the new access settings.
directoryInfo.SetAccessControl(dSecurity);
}
catch (Exception ex)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
它确实为我的'C:\ ROOT'文件夹分配权限.但它仅为子文件夹和文件分配权限,但不为"ROOT"文件夹分配权限.

问:如何定义FileSystemAccessRule …
delphi ×7
c# ×3
windows ×2
.net ×1
c ×1
components ×1
delphi-xe2 ×1
delphi-xe5 ×1
install ×1
pinvoke ×1
python ×1
winapi ×1