标签: delphi-xe4

为什么PDWord不是^ DWORD?

这个计划

{$APPTYPE CONSOLE}
{$TYPEDADDRESS ON}

uses
  Winapi.Windows;

procedure Foo(P: PDWORD);
begin
end;

procedure Bar;
var
  dw: DWORD;
begin
  Foo(@dw);
end;

begin
end.
Run Code Online (Sandbox Code Playgroud)

在XE3中编译,但在XE4,XE5,XE6和XE7中不编译.错误发生在

Foo(@dw);
Run Code Online (Sandbox Code Playgroud)
[dcc32 Error] E2010 Incompatible types: 'PDWORD' and 'Pointer'

这感觉很奇怪.因此,经过一番挖掘,似乎问题归结为PDWORD.人们可能自然会认为它会是:

PDWORD = ^DWORD;
Run Code Online (Sandbox Code Playgroud)

事实上,XE3就属于这种情况.在以后的版本中,我们发现:

// Note: Not ^DWORD yet
PDWORD = ^CppULongInt;
Run Code Online (Sandbox Code Playgroud)

奇.那么,是什么CppULongInt

CppULongInt = type LongWord; 
{$EXTERNALSYM CppULongInt 'unsigned long'} 
{$OBJTYPENAME CppULongInt 'Bul' 'Gm'}
Run Code Online (Sandbox Code Playgroud)

然后看着DWORD我们发现的声明:

//NOTE: DWORD should really be CppULongInt
DWORD = LongWord;
Run Code Online (Sandbox Code Playgroud)

所以,CppULongInt并且DWORD是不同的类型.因此编译错误.

这里发生了什么?目的是 …

delphi delphi-xe4

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

XE4 Delphi TCustomListView TViewStyle'vsSmallIcon'严重排列的图标

我在我的表单中使用TListView(继承自TCustomListView),当我将ListView样式更改为"vsSmallIcon"时,图标排列得很糟糕.自从我们将我们的代码从Borland 2006移植到XE4以来,我们发现了这个问题.休息所有"ViewStyle"就像vsIcon,vsList和vsReport一样正常.有没有人遇到与VCL的TlistView组件类似的问题?我已经尝试了ListView1-> Arrange(arDefault)和'AutoArrange'图标选项,但似乎没有任何东西可用于'vsSmallIcon'TViewStyle.

我在Windows 7上使用RAD Studio XE4和Update1.

谢谢,
Santosh Thankachan
PS:添加了一个图像来显示vsSmallIcon TViewStyle的这个问题.

TCustomListView TViewStyle vsSmallIcon严重排列的图标 Borland 2005 TListView'vsSmallIcon'整齐排列

代码如下:

//SmallIconIssue.h
#ifndef SmallIconsIssueH
#define SmallIconsIssueH
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ImgList.hpp>
#include <Vcl.ComCtrls.hpp>
class TSmallIconTest : public TForm
{
__published:    // IDE-managed Components
  TImageList *ImageList1;
  TComboBox *ComboBox1;
  TListView *ListView1;
  TLabel *Label1;
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall ComboBox1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
  __fastcall TSmallIconTest(TComponent* Owner);
};
extern PACKAGE TSmallIconTest *SmallIconTest;
#endif

//SmallIconIssue.cpp
#pragma package(smart_init)
#pragma resource "*.dfm"
TSmallIconTest …
Run Code Online (Sandbox Code Playgroud)

delphi icons tlistview delphi-xe4

17
推荐指数
0
解决办法
864
查看次数

Delphi XE4不可变字符串

使用适用于iOS平台的Delphi XE4,引入了一种新的字符串类型:不可变的基于零的字符串.到目前为止,Delphi在写可变字符串上有副本.所以问题是,这对我未来的编程意味着什么?一种字符串类型比另一种字符串有什么优势吗?当切换到新的字符串类型时,我需要注意哪些陷阱(除了明显的0对1基数)?

delphi delphi-xe4

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

Delphi接口参考计数

我今天在测试时遇到了一个奇怪的情况.

我有很多接口和对象.代码如下所示:

IInterfaceZ = interface(IInterface)
['{DA003999-ADA2-47ED-A1E0-2572A00B6D75}']
  procedure DoSomething;
end;

IInterfaceY = interface(IInterface)
  ['{55BF8A92-FCE4-447D-B58B-26CD9B344EA7}']
  procedure DoNothing;
end;

TObjectB = class(TInterfacedObject, IInterfaceZ)
  procedure DoSomething;
end;

TObjectC = class(TInterfacedObject, IInterfaceY)
public
  FTest: string;
  procedure DoNothing;
end;

TObjectA = class(TInterfacedObject, IInterfaceZ, IInterfaceY)
private
  FInterfaceB: IInterfaceZ;
  FObjectC: TObjectC;
  function GetBB: IInterfaceZ;
public
  procedure AfterConstruction; override;
  procedure BeforeDestruction; override;
  property BB: IInterfaceZ read GetBB implements IInterfaceZ;
  property CC: TObjectC read FObjectC implements IInterfaceY;
end;

procedure TObjectB.DoSomething;
begin
  Sleep(1000);
end;

procedure TObjectA.AfterConstruction;
begin
  inherited;
  FInterfaceB := TObjectB.Create; …
Run Code Online (Sandbox Code Playgroud)

delphi interface reference-counting delphi-xe4

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

调试器中奇怪的"无法访问的值"

谁能解释这个屏幕:

在此输入图像描述

正如你所看到的,我有简单的数组 - 当我使用A [0],A 1时,调试器显示其元素的值...但我无法获得具有局部变量A [i]的 元素(但是"i"的值正确显示).

项目设置:
调试信息:ON
本地符号:ON
优化:OFF.

项目(一个PAS文件)是BUILD,所以DCU是新鲜的.您可以在该屏幕上看到此测试项目的几乎完整代码,因此不可能在其他单元等中声明数组A或"i"...

现在我检查了 - Delphi XE3中的相同代码完美运行 - 调试器显示所有值.似乎XE4在基本功能方面存在严重错误: - ((

delphi debugging delphi-xe4

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

ARC(iOS)下的Delphi TThread尚未发布

在ARC管理下使用Delphi for iOS终止线程的正确方法是什么?

举个简单的例子:

  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  public
    destructor Destroy; override;
  end;

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    FThread: TMyThread;
  public
  end;

{ TMyThread }
destructor TMyThread.Destroy;
begin

  ShowMessage('Destroy');

  inherited Destroy;

end;

procedure TMyThread.Execute;
begin

  Sleep(5000);

end;

{ TForm2 }
procedure TForm2.Button1Click(Sender: TObject);
begin
  FThread := TMyThread.Create(TRUE);
  FThread.FreeOnTerminate := TRUE;
  FThread.Start;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShowMessage(FThread.RefCount.ToString);
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  FThread …
Run Code Online (Sandbox Code Playgroud)

delphi ios automatic-ref-counting delphi-xe4

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

如何设置FMX.Panel颜色?

FMX控件没有颜色属性.什么是FMX相当于VCL.TColor?

FMX.Panel1.Color:= clBlack

delphi firemonkey delphi-xe4

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

什么是.vrc文件,如何生成,是否可以使用IDE将其删除?

我正在尝试安装一个名为JamShellBrowser的商业组件,但它不会安装.

我联系了开发人员,但同时我想知道:

  1. 什么是vrc文件?
  2. 它是如何产生的?
  3. 可以使用Delphi XE4 IDE进行控制或修改吗?

我检查了IDE的帮助,但是我找不到任何关于vrc文件的内容,我搜索了Delphi vrc并没有找到任何可以帮助我的东西.

错误消息是:

检查项目依赖性......

编译JamShellDelphiXE4.dproj(Release,Win32)

"JamShellDelphiXE4.vrc"的brcc32命令行

c:\ program files(x86)\ embarcadero\rad studio\11.0\bin\cgrc.exe -c65001 JamShellDelphiXE4.vrc -foJamShellDelphiXE4.res

[BRCC32错误] JamShellDelphiXE4.vrc(2):找不到文件:JamShellDelphiXE2_Icon.ico

失败

经过时间:00:00:00.1

我在组件文件夹中搜索了一个ico文件,但没有...因此消息,但即使我MAINICON ICON "JamShellDelphiXE2_Icon.ico"从vrc文件中删除该行甚至删除vrc文件,它在我尝试安装时自动生成.

几个月前我从Delphi 2010转移到了XE4并注意到了新的vrc文件,但我不知道它是什么或如何处理这些文件.

delphi delphi-xe4

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

Delphi Unicode字符串长度,以字节为单位

我正在努力将一些Delphi 7代码移植到XE4,因此,unicode就是这里的主题.

我有一个方法,其中一个字符串被写入TMemoryStream,所以根据这篇embarcadero文章,我应该将字符串的长度(以字符为单位)乘以Char类型的大小,以获得所需的字节长度. WriteBuffer的长度(以字节为单位)参数.

所以之前:

rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);
Run Code Online (Sandbox Code Playgroud)

后:

rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));
Run Code Online (Sandbox Code Playgroud)

我对Delphi的UnicodeString类型的理解是它内部是UTF-16.但我对Unicode的一般理解是,即使是2个字节也不能表示所有unicode字符,有些角落外壳字符将占用4个字节.embarcadero的另一篇文章似乎证实了我的怀疑,"事实上,一个Char等于两个字节甚至不总是这样!"

所以...这让我想知道是否Length(rawHtml)* SizeOf(Char)真的足够稳健以保持一致的准确性,或者是否有更好的方法来确定更准确的字符串大小?

delphi unicode delphi-xe4

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

Delphi XE - TObjectList排序

我有一个这样的列表:

FMyScheduleList: TObjectList<TMySchedule>;
Run Code Online (Sandbox Code Playgroud)

它有一个属性:

property ADate: TDate read FDate write FDate;
Run Code Online (Sandbox Code Playgroud)

如何通过此属性对列表进行排序?

delphi sorting delphi-xe4

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