我正在将一些代码移植到Delphi XE并注意到如果我使用Application.Handle来获取程序的句柄,Delphi会抛出一个错误并拒绝编译,说:
Undeclared identifier: 'Handle'
Run Code Online (Sandbox Code Playgroud)
当我尝试调用Application.ProcessMessages时会发生同样的行为.我认为必须转移一些未在Unicode迁移指南中列出的内容.
"应用程序"的功能和变量在哪里?
我有一个coclass检查注册表以确定是否安装了一个应用程序,但它做得很差,并没有找到更新版本的应用程序.如果已安装竞争应用程序,它将尝试打开该应用程序.如果已卸载竞争应用程序,程序将崩溃.这个coclass是在DLL文件中定义的,我没有库的源代码,所以我不能只改变它.我一直在研究使用钩子来替换有效的功能,但是当我查看使用SetWindowsHookEx的MSDN文档时,它似乎很复杂.有人可以提供一个如何使用SetWindowsHookEx或其他方法挂钩到Windows的示例吗?
谢谢
编辑:我想说明我接受了我的答案,因为它对我有用.在提出问题时我无法使用其他答案,但它看起来同样好.
您对此编程实践有何看法: - 我需要在第一个表单中执行一个事务,然后强制执行另一个表单中的某些更新(对于另一个表单中显示的每个项目).即就像显示表单并单击某个按钮一样.因为从第二种形式执行这些功能是强制性的,所以我想在没有显示第二种形式的情况下这样做.这是一个很好的编程实践还是你有其他建议吗?
另外,仅仅在ShowModal之前为第二个表单设置属性> Visible:= False还是我需要做一些其他操作?
我的项目(在Delphi 6上运行!)需要一个内存分配列表(TMemoryAllocation),它存储在一个对象中,该对象还包含有关分配大小(FSize)的信息,以及分配是否正在使用或是免费的(FUsed) .我基本上将它用作GarbageCollector,以及一种让我的应用程序始终分配/释放内存的方法(并且需要大量的分配/解除分配).
每当我的项目需要分配时,它会查找列表以找到符合所需大小的免费分配.为此,我使用一个简单的for循环:
for I := 0 to FAllocationList.Count - 1 do
begin
if MemoryAllocation.FUsed and (MemoryAllocation.FSize = Size) then
...
Run Code Online (Sandbox Code Playgroud)
我的应用程序运行的时间越长,这个列表会增加到几千个项目,并且当我非常频繁地运行它(每秒几次)时它会大大减慢.
我正试图找到一种方法来加速这个解决方案.我想过按分配大小排序TList.如果我这样做,我应该使用一些智能的方式来访问列表,以获得每次通话时所需的特定大小.有一些简单的方法来做到这一点?
我想到的另一种方式是拥有两个TList.一个用于未使用和一个已用分配.这意味着我必须从一个列表中提取TList.Items并一直添加到另一个列表中.我仍然需要使用for循环来浏览(现在)较小的列表.这是正确的方法吗?
其他建议也非常受欢迎!
目前,我们正在用Delphi编写的6因为,在这些项目中使用(成分也写在Delphi 6)特定组件的情侣项目不容易将其转换在新的版本.
由于我更喜欢.NET开发,而我们的新产品是用.NET开发的,我想使用这些技术开发新的功能.C#将是编程语言.
我的问题是:如何将C#开发的新功能与Delphi中的当前代码集成?这是一个好主意,可能会出现什么问题?如果有人有类似的经历,那么就会听到优点和缺点.
我听说集成了用C#开发.dll并从Delphi代码中使用它.
TnX提前!
维迪奇
我目前拥有的程序有多个组件编译为dll.在其中一个dll中,程序形成一个无限循环.有没有办法看到程序循环的位置?即使它当前正在运行.我分别在每个dll中执行此检查没有问题,我将错误仅限于6中的一个.
我在Windows 7上使用Delphi 6.
所以简而言之,我想要一些方法告诉我程序当前在哪里.通常你插入一个断点并等待程序到达那个位置.但我不知道循环在哪里或在哪个组件中.
三类:TTntMemo,TTntEdit并TEdit有一个共同的祖先- TCustomEdit,但我不能使用Color和ShowHint性能TCustomEdit,因为它们protected并再为public只在TTntMemo,TTntEdit和TEdit.我不允许更改任何这些类,因为它们属于VCL或广泛使用的控件库.
以下代码是PITA,因为它必须重复三次 - 每种类型一次:
class procedure TCommon.ValidateEdit(edit: TCustomEdit; condition: Boolean;
failHint: WideString);
var m: TTntMemo;
te: TTntEdit;
e: TEdit;
begin
if edit is TTntMemo then begin
m := edit as TTntMemo;
if condition then begin
m.Color := clWindow;
m.Hint := '';
m.ShowHint := False;
end
else begin
m.Color := $AAAAFF;
m.Hint := failHint;
m.ShowHint := True; …Run Code Online (Sandbox Code Playgroud) 在TThread类中有一个名为的类成员(属性)Terminated.
此外,还有一个procedure Terminate;它仅仅设置Terminated到True.
当我们继承时,TThread有一些情况我们检查终止.以下池/循环只是为了演示可能的情况:
while not Terminated do
begin
Work;
end;
Run Code Online (Sandbox Code Playgroud)
什么是终止的保证永远不会被处理器缓存?
我想有一个TMemo,它总是以字符串'SELECT c_name FROM'开头,我想锁定它,这样用户就无法删除或替换TMemo中的这个字符串,他们必须在这个字符串之后写下它们的文本.有人可以帮助我吗?我尝试了onChange事件,但问题是用户可以在TMemo的开头点击并在开始时进行编辑.
我正在使用Delphi 6.
我需要迁移到RAD Studio并将其安装在新工作站上.目前我还需要使用Delphi 6进行开发,直到我们获得所有必要的控制更新并整理出版本控制.
所以我的问题是,我可以在同一台机器上安装Delphi 6,对这两种产品没有任何负面影响吗?
提前致谢.
delphi ×10
delphi-6 ×10
.net ×1
breakpoints ×1
c# ×1
debugging ×1
delphi-2009 ×1
delphi-xe ×1
dll ×1
dry ×1
hook ×1
integration ×1
migration ×1
oop ×1
optimization ×1
tmemo ×1