小编LaK*_*ven的帖子

Delphi语言功能列表以及引入/弃用它们的版本

在开始之前,我想指出的是,我已经通过谷歌进行了这样的事情,并且无法找到一个,我已经诚实而真实地搜索过.

我要求(对于我正在开发的项目)列出所有Delphi(2007年到最新发布的版本,我不再支持2007年以前的任何版本)"语言功能",以及它们被引入的版本和(在适用的情况下)弃用,改进或删除.

我之前已经在Stack Overflow上注意到类似的问题,尽管其中大部分是以"哪个特征最好"的形式表达的,并且被认为是不合适的.

如果有人知道这样的清单(或有足够的业余时间来编制一个清单),我将非常感激.

接受的答案将包含指向此类列表的链接或列表本身.

delphi delphi-2007

110
推荐指数
3
解决办法
3万
查看次数

包(BPL)自动命名后缀

我为Delphi编写了很多组件和库,其中大部分都需要使用BPL Packaging才能将它们安装到IDE中.

这很简单并且运行良好,直到你想要维护一组Package Project Files(在一个Project Group中),但是也想为不同的Delphi版本编译和分发那些相同的包.

到目前为止,我一直在为每个版本的Delphi创建一个不同的Package Project,并明确地将Delphi版本标识符定义为后缀(例如Kinect_XE.bplKinect_XE2.bpl).

我知道,在包项目的项目选项中,在描述下,有字段LIB前缀和(更重要的是我的需要)LIB后缀.

我进一步意识到,如果我在LIB后缀中放置一个值,它将被附加到已编译的BPL文件名的末尾.

然而,我的问题是,首先是否可以让IDE自动使用IDE/RTL版本号填充LIB后缀字段,如果是,那么......怎么样?

我相当肯定这是可能的,因为看起来vcl120.bpl(及其各自版本的Delphi的对应物)可以仅使用vcl引用(作为要求)您自己的包,而不必键入完整的vcl120.事实上,这是我希望实现的相同行为......我的包可以在内部引用彼此(作为必要),而不必提供特定于版本的引用来容纳后缀.

同样重要的是,解决这个问题将使我能够在一个项目组中维护一组项目文件(除了XE2之外,由于平台的添加,其项目文件与以前版本的Delphi不一定表现得很好).

我怀疑我可能需要在LIB后缀字段中输入类似$(VER)(或类似的东西)的值,但这似乎不起作用,我已经搜索谷歌寻找正确的解决方案.

希望你能帮忙!

更新1

我现在正在编写一个IDE插件,用于(至少)Delphi 2007到XE2,它为DLL和BPL项目提供了一个名为AutoSuffix的新选项.当切换为On时,任何安装了AutoSuffix插件的IDE 都会立即将正确的IDE版本后缀应用于项目.

AutoSuffix插件将在未来24小时内提供(免费)适合所有人,这个问题相应地更新.

更新2

好的...... Delphi 2007很痛苦!到目前为止,我已经将AutoSuffix与2009年的XE2合作,但2007年需要更多时间(耐心赞赏).

更新3

似乎Embarcadero听到了我们对版本之间简化包装统一的集体呼声.

Mark将推动这一过程,看看未来版本的Delphi是否可以容纳{$ LIBSUFFIX AUTO}功能.我希望很快能收到回复是否会出现这种情况.如果是这样,它肯定会影响AutoSuffix在XE2和旧版本上的工作方式(目前它不提供简单的AUTO开关......它有自己的方法).

我现在希望EMB能够认真对待这个请求,将其作为一个不可或缺的特征提供给它,这样就可以在现有版本上使用AutoSuffix来统一所有版本的流程!

delphi bpl package

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

如何使我的Deskband(任务栏工具栏)表单透明

我正在使用适用于Windows XP,Vista和7(Win32和Win64)的Delphi XE2中的Windows Deskband ...

我在我的代码中实现了所有必要的接口(ITrayDeskBand,IDeskBandInfo,IDeskBand2,IDeskBand),并且所有接口都完全正常(Vista/7上没有任何警告抱怨其他人经历过的兼容性).

我遇到的问题是我的Deskband表格显示为不透明的乐队.此外,仅显示某些控件(在这种情况下,TBitBtn和TImage包含PNG).我需要它来正确显示TEdit和TComboBox对象,但它们根本不会出现.

我已尝试在我的表单上启用GlassFrameSheetOfGlass属性,但这没有任何帮助.

此外,表单本身超出了任务栏的顶部边界,这意味着如果光标与我的Deskband正上方的任务栏顶部一致,则不能(例如)调整任务栏的大小.

我相信德尔福的VCL TForm类型在幕后做了一些事情,这使得TForm类型与Deskband容器不兼容......但这只是一种怀疑.

这是一个截图,说明了各种问题:

在此输入图像描述

正如您所看到的(上图),Deskband的表格是苍白的(而不是透明的),它与任务栏的顶部重叠(防止在任务栏"隐藏"时调整大小和自动隐藏)

有任何想法吗?

更新1 好的,我一直在玩,并注意到在创建用于Deskband的TToolBar控件时,观察到完全不同的行为,而不是表单:

在此输入图像描述

请注意,有三个TToolButton控件(由于Glass主题,它们的文本几乎不可见)?还应该有一个TEditTComboBox两个分隔符之间,但这些完全拒绝显示.

还要注意人工制品(重复实际的任务栏图标)?

我不确定这是否是朝着正确方向迈出的一步,但它可能会帮助您(或其他人)推断出一个解决方案!

delphi taskbar deskband delphi-xe2

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

获取给定DLL,EXE或BPL所需的BPL列表

我想知道是否有人知道一种优雅的方法来确定给定(编译)的DLL,EXE或BPL所需的BPL.

我不确定这是否可能只是简单地扫描二进制文件引用.bpl文件名(这可能容易出现误报).

理想情况下,我想返回一个TStringList甚至以逗号分隔的内容,String其中包含所有必需的.bpl文件的名称.

delphi packages bpl runtime-packages

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

"无法为未命名的组件创建方法"

以下代码(在包中注册时)为我们提供了一个TParentComponent在托盘中注册的组件Test.

但是,使用属性编辑器(在相同代码中提供)创建Child对象时,IDE将显示错误消息" 无法为未命名的组件创建方法".

奇怪的是,Child对象确实有一个名字.

这是来源:

unit TestEditorUnit;

interface

uses
  Classes, DesignEditors, DesignIntf;

type  
  TParentComponent = class;

  TChildComponent = class(TComponent)
  private
    FParent: TParentComponent;
    FOnTest: TNotifyEvent;
    procedure SetParent(const Value: TParentComponent);
  protected
    procedure SetParentComponent(AParent: TComponent); override;
  public
    destructor Destroy; override;
    function GetParentComponent: TComponent; override;
    function HasParent: Boolean; override;
    property Parent: TParentComponent read FParent write SetParent;
  published
    property OnTest: TNotifyEvent read FOnTest write FOnTest;
  end;

  TParentComponent = class(TComponent)
  private
    FChilds: TList;
  protected
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  public
    constructor …
Run Code Online (Sandbox Code Playgroud)

delphi events properties editor

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

Delphi中的浮点运算是否具有确定性?

Delphi中的浮点运算是否具有确定性?

我将使用与Win64编译器,OS X编译器,iOS编译器或Android编译器一样的Delphi Win32编译器编译的相同可执行文件中的相同浮点数学运算获得相同的结果吗?

这是一个至关重要的问题,因为我正在我的游戏引擎中实现多人游戏支持,我担心客户端的预测结果可能经常与服务器的确定(和权威)决定不同.

其结果是当权威游戏状态数据否决客户端侧的预测状态时,在客户端出现"滞后"或"急躁".

由于我实际上没有能力在不同的编译器上编译的不同平台上测试数十种不同的设备,而这些设备类似于"受控条件",我认为最好将这个问题提交给Delphi开发人员,看看是否有人对编译器的低级浮点确定性有内在的理解.

delphi floating-point precision cross-platform deterministic

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

类引用作为属性

谷歌对这些类型的搜索毫无用处,因为你得到了数亿个结果,绝对没有一个与特定问题有关.

问题很简单:

  • 是否可以在Delphi中使用类引用属性?
  • 如果是这样,怎么样?

这是我试过的......

type

  TMyObject = class
    // ...
  end;

  TMyObjectClass = class of TMyObject

  TMyObjectA = class(TMyObject)
    // specifics here
  end;

  TMyObjectB  =class(TMyObject)
    // specifics here
  end;

  TMyComponent = class(TComponent)
  private
    FObjectType: TMyObjectClass;
  published
    property ObjectType: TMyObjectClass read FObjectType write FObjectType;
  end;
Run Code Online (Sandbox Code Playgroud)

上面的代码编译得很好,但是Object Inspector根本没有显示ObjectType属性.

我的目标(如果您还没有猜到)是为了让我可以从特定基类中选择一个类后代,以使相同的组件以不同的方式运行.

我想这样做,以便组件不需要直接了解子类(它需要完全模块化).

让我说清楚一点:我不能使用Enum在子类类型之间进行选择,因为组件不能直接链接到子类类型(在这种特殊情况下根本不可能)

无论如何......提前谢谢!

delphi oop properties reference fpc

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

在主机应用程序和DLL之间传递包含方法的记录

是否可以(不使用运行时包或共享内存DLL)在主机应用程序和DLL模块之间传递Record类型,其中Record类型包含函数/过程(Delphi 2006及更高版本)?

让我们假设为了简单起见我们的Record类型不包含任何String字段(因为这当然需要Sharemem DLL),这里是一个例子:

TMyRecord = record
  Field1: Integer;
  Field2: Double;
  function DoSomething(AValue1: Integer; AValue2: Double): Boolean;
end;
Run Code Online (Sandbox Code Playgroud)

因此,简单地说明一下:我可以在主机应用程序和DLL(在任一方向)之间传递TMyRecord的"实例",而无需使用运行时包或共享内存DLL,并从主机EXE执行DoSomething功能和DLL?

delphi dll record shared-memory runtime-packages

5
推荐指数
2
解决办法
1341
查看次数

如何在Delphi7中使用已存在的Form作为Tab

我的Delphi 7应用程序包含我已经制作的多种表单.我现在想让每个单独的表单出现在单个容器表单的单独选项卡中.因为我是Delphi的新手,所以我不知道采取什么方法,那么Delphi中有哪些方法可以帮助我实现这一目标?

谢谢.

delphi pascal

5
推荐指数
3
解决办法
2671
查看次数

提升后代类中方法可见性的最佳方法

详细阐述这个问题的最好方法是举例说明我正在尝试做什么......

我定义了一个"基类":

TMyBaseClass = class(TPersistent)
protected
  procedure Foo(const AValue: String); virtual;
  // more methods here (many more in fact)
end;
Run Code Online (Sandbox Code Playgroud)

我现在定义一个后代类:

TMyDescendantClass = class(TMyBaseClass)
public
  procedure Foo(const AValue: String); override;
  // etc. for all desired methods I wish to elevate into Public
end;
Run Code Online (Sandbox Code Playgroud)

这里的问题是我必须重新定义TMyDescendantClass的方法"Foo"以将链调用传递给TMyBaseClass:

procedure TMyDescendantClass.Foo(const AValue: String);
begin
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

这是浪费空间!我想知道是否有人知道任何方式来否定重新实现该方法的需要并且"继承".

一个理想的解决方案看起来像:

TMyDescendantClass = class(TMyBaseClass)
public
  procedure Foo(const AValue: String); elevated;
  // etc. for all desired methods
end;
Run Code Online (Sandbox Code Playgroud)

显然这是假设的,我知道Delphi语言中不存在关键字"已提升".是否有一个关键字具有相同的效果,我只是不知道?

谢谢!

delphi

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

在将"增强记录"分配给普通"数据类型"变量时,我会使哪个运算符重载?

首先,我需要知道,如果我想做的事情是可能的.如果有可能,我需要知道如何.

它更容易证明问题​​而不是解释它,所以这里:

我有一个"增强记录"(目的 - 虽然对这个问题不重要 - 是产生一个"智能字符串"类型,以取代普通的字符串类型):

TLKString = record
  Value: String;
  // Some methods here to operate on and build String values

  // Allows me to assign String values directly to "instances" 
  // of this record type! I have others (hence "overload") to 
  // handle other data types (such as Integer etc.)
  class operator Implicit(const AValue: String): TLKString; overload; 
end;
Run Code Online (Sandbox Code Playgroud)

我现在可以使用这个TLKString类型,如下所示:

var
  LSmartString: TLKString;
begin
  LSmartString := 'Hello World'; // The "Implicit" operator then 
                                 // assigns this to LSmartString.Value …
Run Code Online (Sandbox Code Playgroud)

delphi overloading record operator-keyword delphi-xe2

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

Delphi:通过一个套接字多线程发送数据

有人可以告诉我如何通过多线程中的一个连接发送和接收数据.

模型看起来像这样:

模型

我所知道的是,如果所有三个客户端同时发送数据,"客户端X"将接收所有接收数据的合并,并且"客户端X"不能分离该数据以识别哪个部分来自哪个客户端.

Delphi 2010,Indy,Win7.

对不起,如果我的英语不好,我希望你理解这个想法.

delphi multithreading

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

在数组中保存时释放接口对象的问题

为了提供尽可能多的信息,这里是我正在做的事情的一个非常基本的例子

type
  IMyInterface = interface
  [THE_GUID_HERE]
    // some methods
  end;

  TMyInterfaceArray = Array of IMyInterface;

  TMyInterfacedObject = class(TInterfacedObject, IMyInterface)
    // implementation of the Interface etc. here
  end;

  TContainingObject = class
  private
    FIObjectArray: TMyInterfaceArray;
  public
    constructor Create;
    destructor Destroy; override;
    procedure NewInstanceOfInterfacedObject;
  end;

  implementation

  constructor TContainingObject.Create;
  begin
    inherited;
    // Just to illustrate that an Instance is being created...
    NewInstanceOfInterfacedObject;
  end;

  destructor TContainingObject.Destroy;
  var
    I: Integer;
  begin
    for I := Low(FIObjectArray) to High(FIObjectArray) do
      FIObjectArray[I] := nil;
    SetLength(FIObjectArray, 0); // Array collapsed …
Run Code Online (Sandbox Code Playgroud)

arrays delphi interface delphi-xe2 automatic-ref-counting

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