我刚刚获得Delphi 2009并且之前已经阅读了一些关于由于切换到Unicode字符串而可能需要的修改的文章.大多数情况下,提到sizeof(char)不再保证为1.但是为什么这对于字符串操作会有趣呢?
例如,如果我使用AnsiString:='Test'并对String(现在是unicode)执行相同操作,那么我得到Length()= 4,这对于两种情况都是正确的.没有测试它,我确信所有其他字符串操作函数的行为方式相同,并在内部决定参数是unicode字符串还是其他任何东西.
如果我进行字符串操作,为什么我会对char的实际大小感兴趣呢?(当然,如果我使用字符串作为字符串而不存储任何其他数据)
谢谢你的帮助!霍尔格
我正在使用Delphi 2009 Pro,并试图找出为什么代码完成在我的设置中如此之慢.无论何时调用代码完成,IDE都会锁定最多30秒,这实际上会中断任何工作流程.
使用BDS 2006时,与Delphi 2009相比,代码完成速度非常快.
阅读本文之后,Delphi 2009 似乎是正常的,但只是关闭自动代码完成并不是我想做的任何事情.
我的问题是:
如果我切换到Delphi 2010,我是否会有相同的低速代码完成,或者它是否已经改进到可以使用的程度?
编辑:
我发现了为什么我的IDE没有响应的主要问题.我使用了一个文件MSHTML_TLB.pas,它是通过"Import a typelibrary"函数创建的,这是16MB的代码.扫描此代码完成的文件冻结了IDE最多30秒.如果没有该文件在项目中,我会说代码完成速度与以前的版本一样快.
当我构建我的项目并且主窗体是开放的(相当大,各种类型的几十个组件)时,构建过程在项目文件夹中创建一个名为"c"的文件.
该文件为空.
如果我在IDE中关闭主窗体,则构建过程不会创建该文件.
我怎样才能找出导致这种情况的原因以及为什么编译器会在构建开始时关注哪些文件在IDE中打开?
我想开始使用泛型和匿名方法,主要是为了了解这是什么以及为什么我想要使用它们.
有了Delphi 2009,我经常读到泛型和匿名方法没有完全实现或有缺陷,这在Delphi 2010中得到了修复.
我想避免不得不怀疑这是我的错,还是Delphi 2009中的一个错误,每次有些东西不能按照我的预期运行.
我的问题是:
在Delphi 2009中使用泛型和匿名方法时,我会遇到什么问题?
我应该避免什么?
我的Delphi 2009今天已停止在Editor窗口中显示提示.鼠标悬停在任何标识符上时没有任何反应.仍显示IDE按钮的工具提示.
我也不能再CTRL点击任何东西了.
据我记忆,我最近没有改变任何事情.
什么可能导致这个?
编辑:
我找到了设置,请参阅下面的答案.
我正在尝试使用带有COM接口的第三方库.提供了一个C++示例应用程序,它使用声明为:
HRESULT __stdcall IMyInterface::DoSomething (BSTR id, long State)
Run Code Online (Sandbox Code Playgroud)
导入类型库后,生成的Delphi代码为:
procedure DoSomething (const id: WideString; State: Integer); safecall;
Run Code Online (Sandbox Code Playgroud)
在C++示例应用程序中,结果(HRESULT)用于确定函数是否正确执行.
为什么Delphi会将此声明转换为程序,以至于我无法获得结果?
我该怎么做才能解决这个问题?
我有一个包含文件名的ListView.这些文件名需要可拖动到TreeView,这是应用程序内部的拖放操作,并使用Delphi的内置拖放支持 - 没问题.但我还必须能够将ListView项目拖放到另一个应用程序,例如Windows资源管理器.这也有效,例如使用Anders Melander的Component Suite(http://melander.dk)的DragFileSource组件,它在ListView.MouseDown事件中开始工作,因此实际上没有启动拖放操作.
基本上,我需要在Windows资源管理器中看到的相同行为:您可以将项目拖动到应用程序内部的另一个文件夹以及另一个应用程序.
如何在Delphi中完成?我想应该启动一个"拖动",但当鼠标移动到应用程序窗口之外时,它需要"切换"到其他功能,如果鼠标移回应用程序窗口,再次回到标准拖放.
谢谢你的帮助!
霍尔格
如果您在Windows资源管理器中查看文件,则DOC文件会显示图标,PDF等.即如果应用程序安装在计算机上.
这些图标受版权保护还是可以在应用程序中使用?
原因是:我想向用户显示.doc文件的标准"Word文档"图标,即使当前计算机上未安装Word也是如此.
我正在创建一个访问数据库的应用程序.在每次访问数据库时,应用程序都会等待作业完成.为了保持UI响应,我想将所有数据库内容放在一个单独的线程中.
这是我的想法:
听起来不错吗?
将数据库结果从db-thread导入主线程的最佳方法是什么?
到目前为止,我对线程做的并不多,因此我想知道db-thread是否可以创建一个查询组件,主线程读取结果.主线程和数据库线程永远不会同时访问查询.这还会导致问题吗?
我有一个需要使用COM调用的过程,在C#中声明如下:
void DoSomething (string param1, string[] param2, Object[] param3)
Run Code Online (Sandbox Code Playgroud)
导入的TypeLibrary中的Delphi声明是:
procedure DoSomething (param1: System.Widestring,
param2: ActiveX.PSafeArray,
param3: ActiveX.PSafeArray);
Run Code Online (Sandbox Code Playgroud)
param1只是一个字符串.
param2是一个参数名称数组,比方说:['arg1','arg2'].
param3是这些参数的相应值.
示例:arg1:Double = 1.23,arg2:integer = 10.
这将导致:
- param2:['arg1','arg2']
- param3:[1.23,10]
到目前为止,我有这个代码将param2 []转换为PSafeArray:
var param2: array of string;
i: integer;
va_param2: Variant;
psa_param2: Activex.PSafeArray;
begin
SetLength (param2, 2);
param2 [0] := 'arg1';
param2 [1] := 'arg2';
// Create VariantArray, copy data
va_param2 := VarArrayCreate ([0, Length(param2)-1], varOleStr);
for i := 0 to Length(param2)-1 do
va_param2 [i] := param2 [i];
// …Run Code Online (Sandbox Code Playgroud)