小编Dav*_*nan的帖子

为什么TBitBtn中包含的字形如此丑陋和过时?

甚至Delphi 2010与TBitBtn相关的字形也不稳定且"丑陋".是否存在向后兼容的原因?Embarcadero是否包含我可以使用的更新的png替换而不是这些正常的字形?

也许这只是我,但我很想看到Embarcadero征求(或雇用)平面设计师来改善这些图标.

替代文字

delphi

15
推荐指数
4
解决办法
4786
查看次数

如何从命令行安装Delphi组件包?

我正在准备一个安装程序(Inno Setup)将我的组件包安装到Delphi XE中,而无需在IDE中手动操作.

如何将Delphi组件包(例如,MyComponent.bpl)安装到Delphi中,而无需通过"Install Packages"菜单项手动执行此操作?它是注册表项吗?

delphi components install

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

如何通过为AreEqual添加新的静态重载来扩展NUnit Assert类?

我目前正在为我的产品的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类上调用静态方法.

我很抱歉,如果这看起来有点模糊,但我的直觉告诉我,我不是这样做的最佳方式,我想知道如何做对.

c#

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

如何重新思考树形视图是否需要水平滚动条?

考虑以下非常简单的单元:

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)

delphi

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

什么可以改变我背后的浮点控制字?

我有一个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设置信号处理程序.即使我使用这种方法进行初始化,控制字也会发生变化,因此我更加确信这不是机制.

c python windows delphi floating-point

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

使用自定义绘图时,Delphi列表视图控件中是否存在错误?

QC#101189

我正在尝试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)

delphi delphi-xe2

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

如何编写允许数据从本机流向托管的自定义封送程序?

在尝试编写与此问题相关的自定义封送程序(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)

c# pinvoke

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

在Delphi XE5编译设置中,"有限调试信息"和"调试信息"之间有什么区别

用于Win32的Delphi XE5编译器具有调试信息的新设置:有限调试信息.

有限调试信息调试信息有什么区别?

delphi delphi-xe5

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

Delphi构造函数和类构造函数

我怀疑我无法解决.我已经在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)

delphi

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

以编程方式为"此文件夹,子文件夹和文件"分配访问控制列表(ACL)权限

我必须使用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 …

.net c# windows winapi

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