我正在将一些遗留代码转换为Delphi 2010.
有很多旧的ShortStrings,比如字符串[25]
为什么下面的作业:
type
S: String;
ShortS: String[25];
...
S := ShortS;
Run Code Online (Sandbox Code Playgroud)
导致编译器生成此警告:
W1057 Implicit string cast from 'ShortString' to 'string'.
Run Code Online (Sandbox Code Playgroud)
这里没有数据丢失.在什么情况下这个警告对我有用?
谢谢!
Tomw
该领域的应用程序间歇性地收到此消息:

我无法在我的机器上重现这一点.我还跟踪了我认为的相关代码,无法找到任何未初始化对象的访问权限.
我从来没有处理过这种问题.
我使用madExcept进行了构建,不幸的是程序在捆绑后不会崩溃.
有关madExcept和EurekaLog的任何意见发现这种事情吗?我从未使用过FastMM.它会对他的情况有用吗?(Delphi 2010)在FastMM中设置的任何建议标志?还有其他建议吗?
我想在TSaveDialog中添加一个复选框或其他VCL组件.
坎图说,
新的Vista打开和保存对话框(由IFileOpenDialog和
IFileSaveDialog接口实现)由新的FileOpenDialog和
FileSaveDialog组件直接映射,而标准的OpenDialog和SaveDialog组件
在设置全局UseLatestCommonDialogs时使用新样式.
我不知道这意味着什么(我从未做过任何接口编程......)
而且我不想使用第三方工具.
我刚才在网络搜索中看到它建议我查看TOpenPictureDialog代码并复制它.
在尝试任何路径之前,我想我会在这里寻求一些指导.有关XP到Win7解决方案的任何建议,以独立于Windows版本的方式向现代文件,打开对话框添加复选框?
汤姆
我希望MessageDlg显示在其父窗体的中心.有关如何在Delphi 2010中完成此任务的任何建议?
我在这里找到了以下代码:http://delphi.about.com/od/formsdialogs/l/aa010304a.htm但它对我不起作用.弹出窗口仍然不以所有者表单为中心.(我不清楚该方法实际上如何知道所有者形式......)
function TForm1.MessageDlg(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Integer): Integer;
begin
with CreateMessageDialog(Msg, DlgType, Buttons) do
try
Position := poOwnerFormCenter;
Result := ShowModal
finally
Free
end
end;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用
TZipFile.ZipDirectoryContents()
Run Code Online (Sandbox Code Playgroud)
像这样:
TZipFile.ZipDirectoryContents('Test.PCF', WorkingDir);
Run Code Online (Sandbox Code Playgroud)
如果我正确读取它,它应该将文件夹"workingdir"的内容保存到名为Test.pcf的文件中.
现在,当我这样做时,我得到错误::
Raised exception class EFOpenError with message Cannot open file
...test.pcf. The process cannot access the file because its being used by another process."
Run Code Online (Sandbox Code Playgroud)
有两件事令我困惑:
它说无法打开文件.还没有test.pcf.我希望这会创造它.
它说无法访问文件.这是因为它还没有创建吗?我使用这个功能吗?如果是这样,我如何从文件夹位置创建一个zip文件?
我正在使用本土翻译工具.(下次我将使用其中一个库,如下所述:delphi翻译工具.)
我的译者抱怨翻译一长串字符串很困难,因为他们没有在上下文中看到它们(在它们出现的屏幕上).
一位译者提出了一个很好的建议,即他应该能够点击一个组件来改变它的文本.我可以实现这个,如果我能找到一种方法来挂钩程序范围,一个事件,这样当用户在按住CTRL键的同时点击一个组件时,就会调用一个事件处理程序.事件处理程序将确定组件是否具有.Caption属性,如果是,则获取Tag组件的值(然后允许一些用户输入.)
(每个可翻译组件在其Tag中都有唯一的整数,我用它来查找组件的.Caption.)
关于如何解决这个问题的任何建议?这是我的头脑.我需要类似于表单的KeyPreview,但是对于鼠标点击可以找出点击的VCL组件,并确定它的.Tag值.
汤姆
编辑:
使用David H.的建议,我得到的唯一事件是当应用程序获得焦点或失去它时.我做错了什么?
function TForm1.AppHookFunc(var Message : TMessage) : Boolean;
begin
Result := FALSE;
inc(i); outputdebugstring(Pchar(inttostr(i) + ': ' + IntTostr(Message.msg)));
if Message.Msg = WM_MBUTTONDOWN then
begin Beep;
//...DoSomething...
//Result := True;
end;
end;
procedure TForm1.FormCreate( Sender: TObject);
begin
Application.HookMainWindow(AppHookFunc);
end;
procedure TForm1.FormDestroy(
Sender: TObject);
begin
Application.UnHookMainWindow(AppHookFunc);
end;
Run Code Online (Sandbox Code Playgroud)
编辑2
我快到了!但FindDragTarget很少返回任何东西,只有零.如果我制作一个覆盖大部分控件的巨大按钮,我有时可以让它工作.收到的tagMSG中的X,Y坐标是相对于对照的.虽然他们相对于表格我会的.我还在使用不同的事件钩子吗?有什么建议:
procedure TForm1.ApplicationEvents1Message( var Msg: tagMSG;
var Handled: Boolean);
var
Target: TControl;
Point: TPoint;
begin
Handled := FALSE;
if (Msg.Message = …Run Code Online (Sandbox Code Playgroud) 我正在使用HKEY_LOCAL_MACHINE在安装时设置变量.这些需要由机器上的所有用户查看,并且只能由他们阅读.
我使用Inno来创建条目.它以管理员身份运行,因此它应该具有足够的权利,虚拟化不会启动...或者我是误解?
我的应用程序可以读取条目(即使作为Win7中的受限用户)但我在RegEdit或RegEditX 3.0中看不到它们.我可以在RegEditX 2.0中看到它们.奇怪的.
我不明白为什么我的Delphi应用程序可以看到该条目,但上面的RegEdit程序不能.
我相信这可能与虚拟化有关(这里的第一个答案是:无法从Vista上的HKEY_LOCAL_MACHINE读取配置数据).
但是,我甚至无法在HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE下看到有问题的注册表项.
HKEY_LOCAL_MACHINE是否已被弃用,我应该完全避免它?现在开发人员如何为所有用户保存数据 - 只需在{commomappdata}中,通常是C:\ Program Data ... ??
我可以初始化一个恒定的动态数组吗?
如果:
type
tNamePair = array[1..2] of String;
tPairList = array of tNamePair;
Run Code Online (Sandbox Code Playgroud)
如何创建初始化常量?我无法得到以下代码编译:
const
PairList: tPairList = ( ('One', '1'),
('Two', '2'),
('Three', '3'));
Run Code Online (Sandbox Code Playgroud)
如果那是不可能的,可以用固定数组初始化一个固定的固定数组:
type
tPairList: array[1..3] of tNamePair;
Run Code Online (Sandbox Code Playgroud)
如果这不可能,可以使用记录初始化常量动态数组:
tNamePair = record
English: String;
Number: String;
end;
tPairList = array of tNamePair;
Run Code Online (Sandbox Code Playgroud)
如果不可能,可以使用记录初始化常量固定数组:
tNamePair = record
English: String;
Number: String;
end;
tPairList = array[1..3] of tNamePair;
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,除了代码中的硬连线分配之外的任何建议,坦率地说,这比我撰写这个问题花费的时间少!
当用户重新调整表单大小时,在XE2中我想在当前鼠标光标旁边显示当前表单大小.我会使用OnResize事件.
换句话说:我需要有关如何在用户移动鼠标时显示动态文本(例如x,y坐标,如下图中的300,250)以及鼠标光标的想法.

一种方法是模拟.cur文件并将其分配给OnResize中的游标.这看起来很麻烦,可能会很慢(我还不知道文件的内容)
另一个想法是在OnResize事件中显示我设置的一些透明文本(哪个组件会这样做?).Top,.Left.
我有一个问题是如何检测重新调整大小操作的时间,以便我可以恢复到标准鼠标光标.
有什么建议可以继续吗?
我正在使用下面的代码让MSBuild构建一个Delphi 2010 groupproj:
MSBuild C:\src\myprojgroup.groupproj /target:Build /p:config=Release
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何修改上面的行,以便我可以传递这个参数
-EC:\mypath
Run Code Online (Sandbox Code Playgroud)
到编译器(bcc32.exe).
我花了相当多的时间试图在网上找到这个./ property:name = value似乎可能是我需要的,但到目前为止还没有.
这是否可能,或者我现在必须了解MSBUILD配置文件...