在Delphi 2009中,我发现无论何时在应用程序中使用TThread.CurrentThread,我都会在应用程序关闭时收到如下错误消息:
Exception EAccessViolation in module ntdll.dll at 0003DBBA.
Access violation at address 7799DBBA in module 'ntdll.dll'. Write of
address 00000014.
Run Code Online (Sandbox Code Playgroud)
除非它只是我的机器,你可以在几秒钟内复制它:创建一个新的Delphi Forms Application,在表单中添加一个按钮,并使用类似下面的按钮的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
begin
TThread.CurrentThread;
end;
Run Code Online (Sandbox Code Playgroud)
在我的Vista的机器和我的XP的机器都我发现,如果我不按一下按钮一切都很好,但如果我做的点击按钮,我得到上面的错误消息,当我关闭应用程序.
所以...我想知道这是不是一个错误,但与此同时我认为我很可能根本不理解你应该如何在Delphi中使用TThreads.我有点像德尔福新手,我很害怕.
使用TThread.CurrentThread有什么明显错误吗?
如果没有,并且你有Delphi 2009,如果你实现我的简单示例项目,你会遇到同样的问题吗?
我有无约束的泛型类型Atomic,它实现了一个初始化器(我之前的问题中的细节).
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
Run Code Online (Sandbox Code Playgroud)
现在我想编写简化的Initialize函数,该函数将从T获取类型信息(假设typeof(T)是tkClass)并使用默认构造函数创建新实例(必要时).
可悲的是,这失败了:
class function Atomic<T>.Initialize(var storage: T): T;
begin
if not assigned(PPointer(@storage)^) then begin
if PTypeInfo(TypeInfo(T))^.Kind <> tkClass then
raise Exception.Create('Atomic<T>.Initialize: Unsupported type');
Result := Atomic<T>.Initialize(storage,
function: T
begin
Result := TClass(T).Create; // <-- E2571
end);
end;
end;
Run Code Online (Sandbox Code Playgroud)
编译器报告错误E2571 Type parameter 'T' doesn't have class or interface constraint.
如何欺骗编译器创建类T的实例?
我注意到,任务栏上显示的应用程序标题与主窗体标题中显示的应用程序标题重复,与Application.Title无关.我的主要表单标题是使用Caption:='xxxx'以编程方式设置的,如下所示:
My Fantastic Application V1.2.3.4 [Power User]
Run Code Online (Sandbox Code Playgroud)
这是在任务栏上忠实再现(截断).我真的很想在任务栏上看到"我的神奇应用程序".这可能吗?我已经尝试将Application.Title等设置为无效.
在某些安装中,Delphi无法在OS X上调试FireMonkey应用程序.症状:Delphi开始加载Debug桌面然后锁定.在PAServer中按Ctrl + C会停止PAServer并解除Delphi的解冻.使用Delphi XE2 Update 4和OS X 10.7.3观察到了这个问题.
下面附有更长的描述.
我有一个全新的Mac Mini(mc815z/a型号 - i5 2.3 GHz/2GB/500GB/Nvidia Intel HD Graphics 3000).它附带OS X Lion(10.7),我升级到10.7.3.
在我的主计算机上(Windows 7 64位)运行Delphi XE2 Update 4.我已经从setup_paserver.zip(15.656.945字节)安装了平台助手.它首先安装了Java(适用于Mac OS X 10.7 Update 1的Java).我通过paserver.command启动PAServer,它似乎工作正常.PAServer称它是版本1.0.2.
然后我设置了一个远程配置文件,它工作正常(Test Connection报告成功).
当我运行(通过调试)一个FireMonkey项目(我尝试了各种Sample项目以及新的,最小的FireMonkey应用程序)时,Delphi开始切换到Debug布局然后冻结.PAServer报道:
Process Control Server启动pid 343 exe build 2012年1月15日
sentinelFunc 345
[每次尝试调试程序时,第二行中的数字都不同.]当时没有任何事情发生.我可以用Ctrl-C杀死PAServer并解冻Delphi.然后Delphi报告错误:
调试器断言失败:第663行的..\win32src\rproxy.cpp中的"obj"
包文件对我来说似乎很好:

我已在本地以Admin组中的用户身份登录.
我可以从中启动应用程序/Users/primoz/Applications/Embarcadero/PAServer/scratch-dir.没有问题.Run without debugging在Delphi中也有效.只有在我尝试调试我的应用程序时才会出现此问题.
编辑:这似乎是我的Delphi安装的问题.我从我的笔记本(也运行XE2 Update 4)尝试了同样的功能,它运行得很好.
编辑:这似乎与我的调试桌面有关.当我将调试桌面更改为与编辑桌面相同时,问题就消失了.
编辑:只有在调试桌面上显示"线程状态"窗口时才会出现此问题.此外,这与我的Delphi安装有关 - 我测试的另一台计算机工作正常,可以看到'Thread Status'窗口.
我们有一个使用Windows Ribbon Framework进行UI 的应用程序.该应用程序本身是用Delphi编写的,并使用Windows Ribbon Framework for Delphi与功能区API进行交互.
我们的功能区XML将很少的命令放入快速访问工具栏.然后,使用可以通过使用内置功能区机制(选择下拉/下拉按钮并单击命令名称)或选择More commands打开配置对话框的命令来删除/添加命令.
我遇到的问题是我无法找到一种方法来获取QA集合中的当前命令状态(无论它们是否可见).
在上面的示例(图片)中,我想检测前五个命令是否被检查,而最后一个命令不是这样,我可以相应地准备配置对话框.
枚举IUICollection和访问存储在里面的项目我没有问题.我也可以获得UI_PKEY_CommandId每个项目.但是,我无法找到读取已检查/未检查状态的方法.我尝试阅读UI_PKEY_BooleanValue和UI_PKEY_Enabled集合中的所有项目,但他们没有返回该状态.
我也尝试过监视,IUICommandHandler.UpdateProperty但是当选中/取消选中此项时,它不会被调用(除了用UI_PKEY_Label键调用它).
Ribbon API甚至支持此功能吗?
我的应用程序有几个线程:1)主线程2)2个子主线程(每个都有消息循环,如下所示),由TFQM使用3)n工作线程(简单循环,包含Sleep())
我的问题是,当我关闭我的应用程序时,工作线程设法正常退出,但当我发出WM_QUIT关闭它们时,2个子主线程中的一个挂起(从不退出).
procedure ThreadProcFQM(P: Integer); stdcall;
var
Msg: TMsg;
_FQM: TFQM;
begin
_FQM := Ptr(P);
try
_FQM.fHandle := AllocateHwnd(_FQM.WndProc);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
finally
DeallocateHWnd(_FQM.fHandle);
SetEvent(_FQM.hTerminated);
end;
end;
Run Code Online (Sandbox Code Playgroud)
procedure TFQM.Stop;
begin
PostMessage(fHandle, WM_QUIT, 0, 0);
WaitForSingleObject(hTerminated, INFINITE);
if hThread <> INVALID_HANDLE_VALUE then
begin
CloseHandle(hThread);
hThread := INVALID_HANDLE_VALUE;
end;
end;
Run Code Online (Sandbox Code Playgroud) 我需要扩展TFileStream,以便它可以使用不是0偏移量的文件,而是来自用户定义的偏移量.我的意思是它必须将用户定义的偏移解释为流开始.我的代码是:
type
TSuFileStream = class(TFileStream)
protected
FOffset : int64;
procedure SetOffset(Offset : int64);
procedure SetSize(NewSize: Longint); override;
procedure SetSize(const NewSize: Int64); override;
public
constructor Create(const AFileName: string; Mode: Word); overload;
constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal); overload;
function Seek(Offset: Longint; Origin: Word): Longint; override;
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
property Offset : int64 read FOffset write SetOffset;
end;
...
constructor TSuFileStream.Create(const AFileName: string; Mode: Word);
begin
inherited Create(AFileName, Mode);
FOffset := 0;
end;
constructor TSuFileStream.Create(const …Run Code Online (Sandbox Code Playgroud) 在程序在调试器中运行时按F12应该会中断执行并打开调试器.这在Windows XP上正常工作(使用D2007和XE2测试)但在Windows 7和8上失败(也在D2007和XE2上测试;在三台计算机上测试).
注册表已正确设置(Windows 7):
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]"UserDebuggerHotKey"= dword:00000000"Debugger"="\"C:\ Windows\system32\vsjitdebugger.exe \" - p%ld -e%ld"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList]"DWM.exe"= dword:00000001
XP安装还设置"Auto"="1"并省略AutoExclusionList,但在Windows 7计算机上复制这些更改不会完成任何操作.
奇怪的是,德尔福似乎意识到F12被压了.当我在Windows 7机器上的调试器中运行程序并按F12时,Delphi中的事件日志窗口显示
线程开始:线程ID:4080.处理Project73.exe(7108)
线程退出:线程ID:4080.处理Project73.exe(7108)
只是没有触发断点并且应用程序继续运行.
有谁知道如何在Windows 7/8中恢复此功能?
(我该怎么办呢?)
如果我在VCL中创建两个标签并设置一个使用Arial和另一个Arial Narrow,我会看到预期的结果.

如果我在Firemonkey中执行相同操作,则第二个标签不会显示在Arial Narrow中.它甚至没有显示在Arial中(我的圆点是圆的,'s'的形状都是错的等等).

有谁知道为什么FM(我用Delphi XE4测试这个)没有正确显示字体?我能做些什么吗?
VCL表格的来源:
object Form3: TForm3
Left = 0
Top = 0
Caption = 'Form3'
ClientHeight = 198
ClientWidth = 475
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 32
Width = 134
Height = 14
Caption = 'This label is using Arial @11'
Font.Charset = DEFAULT_CHARSET
Font.Color …Run Code Online (Sandbox Code Playgroud) 在样式为csOwnerDrawFixed的TComboBox后代组件上实现"在键入时查找"行为的正确方法是什么?