小编Rob*_*ank的帖子

为什么Delphi会在将ShortString分配给字符串时发出警告?

我正在将一些遗留代码转换为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

delphi

20
推荐指数
3
解决办法
2万
查看次数

如何在现场调试Access违规?

该领域的应用程序间歇性地收到此消息:

替代文字

我无法在我的机器上重现这一点.我还跟踪了我认为的相关代码,无法找到任何未初始化对象的访问权限.

我从来没有处理过这种问题.

我使用madExcept进行了构建,不幸的是程序在捆绑后不会崩溃.

有关madExcept和EurekaLog的任何意见发现这种事情吗?我从未使用过FastMM.它会对他的情况有用吗?(Delphi 2010)在FastMM中设置的任何建议标志?还有其他建议吗?

delphi

15
推荐指数
2
解决办法
3837
查看次数

如何在Delphi 2010中为TSaveDialog添加一个复选框

我想在TSaveDialog中添加一个复选框或其他VCL组件.

坎图说,

新的Vista打开和保存对话框(由IFileOpenDialog和
IFileSaveDialog接口实现)由新的FileOpenDialog和
FileSaveDialog组件直接映射,而标准的OpenDialog和SaveDialog组件
在设置全局UseLatestCommonDialogs时使用新样式.

我不知道这意味着什么(我从未做过任何接口编程......)

而且我不想使用第三方工具.

我刚才在网络搜索中看到它建议我查看TOpenPictureDialog代码并复制它.

在尝试任何路径之前,我想我会在这里寻求一些指导.有关XP到Win7解决方案的任何建议,以独立于Windows版本的方式向现代文件,打开对话框添加复选框?

汤姆

delphi delphi-2010 tcheckbox tsavedialog

10
推荐指数
2
解决办法
2123
查看次数

如何使MessageDlg以所有者表单为中心

我希望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)

delphi delphi-2010

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

压缩文件夹

我正在尝试使用

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)

有两件事令我困惑:

  1. 它说无法打开文件.还没有test.pcf.我希望这会创造它.

  2. 它说无法访问文件.这是因为它还没有创建吗?我使用这个功能吗?如果是这样,我如何从文件夹位置创建一个zip文件?

delphi delphi-xe

9
推荐指数
1
解决办法
3050
查看次数

在任何VCL组件上单击鼠标,然后确定其.Tag值

我正在使用本土翻译工具.(下次我将使用其中一个库,如下所述: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)

delphi

8
推荐指数
1
解决办法
9825
查看次数

无法在RegEdit中看到某些HKEY_LOCAL_MACHINE条目

我正在使用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 ... ??

delphi registry

8
推荐指数
1
解决办法
9011
查看次数

初始化一个固定数组的动态数组常量?

我可以初始化一个恒定的动态数组吗?

如果:

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)

如果这是不可能的,除了代码中的硬连线分配之外的任何建议,坦率地说,这比我撰写这个问题花费的时间少!

delphi

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

如何显示动态文本和鼠标光标

当用户重新调整表单大小时,在XE2中我想在当前鼠标光标旁边显示当前表单大小.我会使用OnResize事件.

换句话说:我需要有关如何在用户移动鼠标时显示动态文本(例如x,y坐标,如下图中的300,250)以及鼠标光标的想法.

在此输入图像描述

一种方法是模拟.cur文件并将其分配给OnResize中的游标.这看起来很麻烦,可能会很慢(我还不知道文件的内容)

另一个想法是在OnResize事件中显示我设置的一些透明文本(哪个组件会这样做?).Top,.Left.

我有一个问题是如何检测重新调整大小操作的时间,以便我可以恢复到标准鼠标光标.

有什么建议可以继续吗?

delphi

8
推荐指数
1
解决办法
2602
查看次数

如何通过MSBuild将参数传递给编译器?

我正在使用下面的代码让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配置文件...

delphi msbuild

7
推荐指数
2
解决办法
3310
查看次数