标签: delphi-2010

Delphi预构建事件未执行BEFORE编译

我正忙着自动化我们的构建以包含svn修订版号.我们正在使用Delphi 2010.我添加了一个预构建事件,调用批处理文件,该文件将svn修订号(从.svn目录中的条目文件中读取)和指定的版本号注入到编译的aVersionInfo.rc中.我的项目.预构建事件如下所示:

call SetVersionInfo.bat 6 5 4
Run Code Online (Sandbox Code Playgroud)

...和批处理文件(希望有人发现这个有用)...

@ECHO OFF
SETLOCAL
setLocal EnableDelayedExpansion

SET _myVar=0
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G
)

ECHO 1 VERSIONINFO > aVersionInfo.rc
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev%   >> aVersionInfo.rc
ECHO. PRODUCTVERSION 1   >> aVersionInfo.rc
ECHO. FILEOS VOS__WINDOWS32   >> aVersionInfo.rc
ECHO. FILETYPE VFT_APP   >> aVersionInfo.rc
ECHO. BEGIN   >> aVersionInfo.rc
ECHO.   BLOCK "StringFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     BLOCK "080904b0"   >> aVersionInfo.rc
ECHO.     BEGIN   >> aVersionInfo.rc …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 pre-build-event

12
推荐指数
1
解决办法
4631
查看次数

什么是TExternalThread?终止基于线程的计时器时"无法终止外部创建的线程"

这种情况发生在关闭我的应用程序的一半时间,在该应用程序中,我在设计时将TLMDHiTimer放置在我的表单上,Enabled设置为true.在我的OnFormClose事件中,我调用MyLMDHiTimer.Enabled:= false.当这个被调用时,我有时(大约一半的时间)得到这个例外.

我调试并进入调用,发现它是LMDTimer.pas中的第246行,它给出了这个错误.

FThread.Terminate;
Run Code Online (Sandbox Code Playgroud)

我使用的是最新版本的LMDTools.我在周末之前完成了LMD工具的重新安装,并且已经将组件移除并重新添加到表单中.

根据我的发现,这与TExternalThread有关,但Embarcadero没有关于它的文档,我没有在LMDTools源代码中找到任何引用它的文档.

使用完全更新的RAD Studio 2010,Delphi 2010.

让我感到不安的是,没有任何文件.谷歌实际上谈到了一个结果,其中有人说错误是由于试图终止TExternalThread造成的.但是看看这个LMDHiTimer的源代码,不是一次它的目的是做任何事情,而是创建一个常规的TThread.我可以找到一个google结果,Thread:无法终止外部创建的线程?在Embarcadero上提到使用GetCurrentThread()和GetCurrentThreadId()来获取挂钩到现有线程所需的数据,但TLMDHiTimer没有这样做.它只是创建自己的TThread后代,它有自己的Create()构造函数(当然是重写,并且在构造函数的开头继承了调用)

那么......这个TExternalThread到底是什么?还有其他人遇到过这种例外吗?也许找出了解决方案或解决方法?我已经向LMDTools自己的支持提出了几乎完全相同的问题,但在多个地方提问并不会有什么问题.

提前感谢您的任何帮助.

delphi multithreading external delphi-2010

12
推荐指数
2
解决办法
6566
查看次数

Delphi 2010线程

有人可以发布Delphi 2010最简单的线程示例,例如,当点击按钮时将一些文本放入备忘录中吗?随着实施和所有.谢谢.

更新:好的,只是一个做某事的简单线程.不需要备忘录.谢谢.

delphi multithreading delphi-2010

12
推荐指数
2
解决办法
4414
查看次数

GUID的高效数据结构

我正在寻找一种数据结构,这使我能够快速(优先O(1) - 快速)确定给定的GUID是否是GUID集合的成员.

我目前的方法是使用带有0作为值的TDictionary.

虽然这很快就能起作用,但使用Hashmap来重新定义GUID似乎是一种浪费,GUID通过定义被认为是唯一的,并且使Dictionary处理不需要的值.

必须有一个更好的解决方案,但我找不到一个.你能?

delphi guid unique delphi-2010 data-structures

12
推荐指数
2
解决办法
1130
查看次数

delphi - 从字符串中删除所有非标准文本characers

我需要从字符串中删除所有非标准文本characers.我需要删除所有非ascii和控制字符(换行/回车除外).

delphi parsing ascii delphi-7 delphi-2010

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

Delphi 2010 - 属性向导或类似的东西,以避免手动编码getter/setter

是否有内置或外部工具(向导)可以轻松添加具有getter/setter的类成员(已发布字段)?

添加每个字段需要我编写很多代码.我们假设我需要添加Foo: Bar;属性.

我需要写

FFoo: TBar;
procedure SetFoo(const AValue: TBar);
function GetFoo: TBar;

...

property Foo: TBar read GetFoo write SetFoo
Run Code Online (Sandbox Code Playgroud)

任何使它快速简便的工具?

delphi code-generation delphi-2010

12
推荐指数
3
解决办法
693
查看次数

如何测试连接到FTP服务器的类?

我正在为我的应用程序开发实时更新.到目前为止,我已经创建了几乎所有单元测试,但我不知道如何测试连接到FTP服务器并下载新版本的特定类.

要测试这个类,我应该创建一个FTP测试服务器并在我的单元测试中使用它吗?如果是这样,我如何确保此FTP服务器始终与我的测试保持一致?我应该在测试开始之前手动创建我需要的每个文件,还是应该在我的测试类中自动执行此操作(拆除和设置方法)?

这个问题也适用于连接任何类型服务器的单元测试类.

编辑

我已经在模拟我的ftp类,所以我不需要在其他测试中连接到ftp服务器.

让我看看沃伦在评论中所说的话我是否正确:

我认为,一旦你通过TCP/IP与一个单独的应用程序交谈,我们就应该称之为"集成测试".一个是不再测试一个单元或方法,而是一个系统.

当单元测试需要与另一个应用程序(可以是HTTP服务器或FTP服务器)通信时,这不再是单元测试而是集成服务器吗?如果是这样,我是否通过尝试使用单元测试技术来创建此测试?说我不应该对这个班级进行单元测试是否正确?这对我来说很有意义,因为单元测试似乎需要做很多工作.

delphi ftp unit-testing delphi-2010

12
推荐指数
2
解决办法
4806
查看次数

Delphi XE2 RTTI坏了吗?

我最近从D2010迁移到了DXE2,并在XE2和XE3(在我的朋友XE3中测试)中发现了与类内TBytes字段的RTTI生成相关的showstopper bug(或功能?).

我发现从不生成类中TBytes变量的RTTI信息.

以下代码在D2010中运行良好,但在XE2/XE3中显示消息"Error"

有没有人有任何线索?这将彻底打破我们所有的软件数据序列化实现

要测试代码,请将Rtti单位添加到使用声明中

type

  TMyClass = class
  public
    Field1: Integer;
    Field2: TBytes;
  end;


procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  Data: TMyClass;
  Rtti: TRttiContext;
  RttiClassType: TRttiInstanceType;
begin

  Data := TMyClass.Create;
  try

    // Get the context
    Rtti := TRttiContext.Create;
    try

      // Get the type for the class
      RttiClassType := TRttiInstanceType(Rtti.GetType(Data.ClassInfo));

      // Check the fields
      for i := 0 to High(RttiClassType.GetFields) do
      begin

        // Check the field type
        if not Assigned(RttiClassType.GetFields[i].FieldType) then
          ShowMessage('Error');

      end;

    finally
      Rtti.Free;
    end;

  finally
    Data.Free;
  end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 delphi-xe2 delphi-xe3

12
推荐指数
2
解决办法
1270
查看次数

在Windows中存储密码的安全方式

我正在尝试保护包含敏感信息的本地数据库(类似于这个问题,仅适用于delphi 2010)

我正在使用DISQLite组件,它支持AES加密,但我仍然需要保护我用来解密和读取数据库的密码.

我最初的想法是生成一个随机密码,使用像DPAPI(CryptProtectDataCryptUnprotectDataCrypt32.dll中找到的函数)之类的东西存储它,但我找不到任何关于Delphi的例子

我的问题是:如何安全地存储随机生成的密码?或者,假设DPAPI之路是安全的,我如何在Delphi中实现这个DPAPI?

delphi encryption password-protection delphi-2010

12
推荐指数
2
解决办法
7833
查看次数

为什么Delphi说"无法解析单位名称xxx"?

我正在使用Delphi2010 Enterprise Update 4.
当我在IDE中打开我的项目并显示mainform代码时,有2个单元名称以红色下划线.

xxx http://img268.imageshack.us/img268/6475/unitnameunresolved.png.

我已经验证了单位源的路径在Library path和中Browsing path.

令人惊讶的是,当我右键单击该单元并选择时Open file at cursor,它可以工作(即delphi打开正确的单元).

有什么想法吗?

ide delphi delphi-2010

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