小编sma*_*ins的帖子

有没有办法检测驱动器是否是SSD?

我准备发布一个只对常规硬盘有效的工具,而不是SSD(固态硬盘).实际上,它不应该与SSD一起使用,因为它会导致大量读/写而没有实际效果.

任何人都知道检测给定驱动器是否为固态的方法?

solid-state-drive disk hard-drive

35
推荐指数
4
解决办法
4万
查看次数

在Delphi 2009中将字符串转换为PAnsiChar

我正在将我的应用程序转换为Delphi 2009,并且遇到了一些需要将字符串(宽)转换为AnsiString的调用的有趣问题.

这是一个展示我遇到的问题的例子:

var
  s: PAnsiChar;

...

s := PAnsiChar(Application.ExeName);
Run Code Online (Sandbox Code Playgroud)

使用Delphi 2007和以前的版本,s:= PChar(Application.ExeName)将返回应用程序exe路径.

使用Delphi 2009,s:= PAnsiChar(Application.ExeName)仅返回'E'.

我的猜测是因为我正在将unicode字符串转换为ansi字符串,但是如何将其转换为PAnsiChar获取完整字符串?

delphi delphi-2009

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

是否可以找到给定域名的所有DNS子域名?

这个问题之所以存在是因为它具有历史意义,但它不被认为是本网站的一个好的,主题上的问题,所以请不要将它作为证据,你可以在这里提出类似的问题.

更多信息:https://stackoverflow.com/faq

任何人都知道是否可以找到为域名配置的所有A记录,CNAME或子区域记录?

例如,domain.com:

www IN CNAME domain.com.
subdomain1 IN CNAME domain.com.
subdomain2 IN CNAME domain.com. 

subdomain1 IN A 123.4.56.78.
subdomain2 IN A 123.4.56.79. 
Run Code Online (Sandbox Code Playgroud)

我想保留一个子域私有我将运行一个管理应用程序(它将受密码保护,并在一个特殊的端口,但我宁愿保持尽可能私密).

dns

19
推荐指数
1
解决办法
7万
查看次数

在多个应用程序之间共享图像的最佳方式

我正在开发一个由几个已编译的Delphi应用程序(超过20个exe和dll)组成的项目,我将需要在它们之间共享60多个图像(16x16,24x24,32x32,...).

我有两种不同的方式在所有应用程序之间共享图像,但我不确定哪个更好:


想法1:

创建仅资源DLL项目,其中包含对包含所有图像的.res文件的资源链接引用.每个应用程序将依次加载dll并根据需要将其可能需要的图像读入TImageList或TImage.

优点:允许以原生格式将图像保留在存储库中.

缺点:我无法在设计时看到图像,因为它们只会在运行时加载.我还必须创建与图像相同数量的常量,或者使用具有与图像相同数量的值的集合,以便可以独立于资源文件上的名称引用每个图像.


想法2:

创建一个编译为bpl的数据模块,并将其作为所有应用程序的运行时包.我会将图像添加到几个TImageList(取决于图像大小)或TPngImageList(允许单个组件上的几个大小的图像).

优点:我将能够将此数据模块添加到我需要的所有应用程序中,并在设计时查看我可能需要使用的所有图像.

缺点:即使我只需要使用一个图像,所有图像都将被加载到内存中.在将图像添加/修改到TImageList/TPngImageList时,我需要确保图像的顺序永远不会改变.所有图像都将存储在单个.dfm中.


想法3 :(新)

在查看了还需要在编译的exe之间共享图像的其他应用程序之后,我还有另一个想法.将所有共享映像保存为普通的png/ico文件,放在编译文件所在的子文件夹中(例如,数据).

优点:无需将所有图像加载到内存中,我可以获得所需的图像.如果图像的总数相当大,则这可能是特别重要的(使用该方法的一个应用程序在数据子文件夹上具有1400个图像).

缺点:任何人都可以看到/可以使用图像.可能会在用户计算机上占用更多磁盘空间.


我想就这两个想法提出意见或就如何更好地实现这一点提出任何其他建议.

谢谢!

delphi

17
推荐指数
2
解决办法
808
查看次数

是否可以从32位应用程序访问64位DLL?

我有一个类似于Taskbar Shuffle的Delphi应用程序,它包含一个hook dll.

编辑:此挂钩DLL通过发送Windows消息与主应用程序通信.

我想添加对XP和Vista x64的支持,我最初的想法是将dll转换为64位(用FreePascal编译它)但是现在将应用程序保持为32位(Delphi).

32位应用程序是否可以访问64位dll?

EDIT2:我正在通过LoadLibrary加载DLL,所以我想我已经卡住了,因为32位进程无法加载64位dll,根据我在Lars Truijens指出的链接上读到的内容以下答案.

delphi 64-bit

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

Projects文件夹结构建议

我正准备实现一个源代码控制系统(颠覆),但我对如何构建我的文件夹面临一些疑问.

我使用Delphi进行所有开发,并在IDE中编译项目.

我当前的项目文件夹结构如下:

-E:\Work\1. Shared
--Forms (shared forms across all projects)
--Units (shared units/classes across all projects including 3rd party like JCL)

-E:\Work\2. Company Name
--Admin (stuff related with admin work like a license keys generator, Windows CGI to handle order processing automatically, all developed in Delphi)
--Projects
----ProjectA
-----5.x (version 5.x)
------BIN (where all the binaries for this project go)
------Build Manager (where the FinalBuilder project lives)
-------Install (NSIS file that create the setup.exe)
-------Protection (Project files to protect …

directory project-management

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

如何确定鼠标光标是否在控件内

我正在添加对鼠标滚轮移动的支持到TScrollBox(使用FormMouseWheel过程),我需要确定鼠标是否在组件内.

基本上我需要确定鼠标是否在TScrollBox中,以便我随后处理滚动代码.

有关如何做到这一点的任何想法?

编辑:这是代码(包括这个问题的答案),因为它可能会帮助其他人:

   procedure TForm1.FormMouseWheel(Sender: TObject;
  Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
var
  Msg: Cardinal;
  Code: Cardinal;
  I, ScrollLines: Integer;

  ScrollBoxCursosPos: TPoint;
begin
  //position of the mouse cursor related to TScrollBox
  ScrollBoxCursosPos := ScrollBox1.ScreenToClient(Mouse.CursorPos);

  if (PtInRect(ScrollBox1.ClientRect, ScrollBoxCursosPos)) then
  begin
    Handled := True;
    If ssShift In Shift Then
      msg := WM_HSCROLL
    Else
      msg := WM_VSCROLL;

    If WheelDelta < 0 Then
      code := SB_LINEDOWN
    Else
      code := SB_LINEUP;

    ScrollLines:= Mouse.WheelScrollLines * 3;
    for I:= 1 to ScrollLines do …
Run Code Online (Sandbox Code Playgroud)

delphi

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

不区分大小写的Pos

在D2010(unicode)中是否有类似Pos的类似功能不区分大小写?

我知道我可以使用Pos(AnsiUpperCase(FindString),AnsiUpperCase(SourceString))但是每次调用函数时都会通过将字符串转换为大写来增加处理时间.

例如,在1000000循环上,Pos需要78ms而转换为大写需要764ms.

str1 := 'dfkfkL%&/s"#<.676505';
  for i := 0 to 1000000 do
    PosEx('#<.', str1, 1); // Takes 78ms

  for i := 0 to 1000000 do
    PosEx(AnsiUpperCase('#<.'), AnsiUpperCase(str1), 1); // Takes 764ms
Run Code Online (Sandbox Code Playgroud)

我知道为了提高这个特定示例的性能,我可以在循环之前将字符串首先转换为大写,但我之所以想要具有不区分大小写的Pos函数的原因是从FastStrings中替换一个.我将使用Pos的所有字符串都将不同,因此我需要将每个字符串转换为大写字母.

是否有任何其他功能可能比Pos +将字符串转换为大写更快?

delphi delphi-2010

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

任何内置的Delphi函数,如PosEx,从字符串后面找到一个子字符串?

有没有像PosEx这样的Delphi D2010函数,从字符串末尾开始在字符串中找到一个子字符串?

我正在删除对FastStrings库的所有调用,我使用的其中一个函数是FastPosBack:

function FastPosBack(const aSourceString, aFindString : AnsiString; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
Run Code Online (Sandbox Code Playgroud)

我找到了LastDelimiter,但它不是一回事,因为它只找到最后一个分隔符而我无法指定起始位置.

谢谢!

更新:在DR评论之后,我创建了这个函数:

function FastPosBack(const aSourceString, aFindString : String; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
var
  RevSourceString, RevFindString: string;
begin
  RevSourceString := AnsiReverseString(aSourceString);
  RevFindString := AnsiReverseString(aFindString);

  Result := Length(aSourceString) - PosEx(RevFindString, RevSourceString, StartPos) + 1;
end;
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法呢?在1000000循环周期中,Pos需要47ms而FastPosBack需要234ms才能完成.

delphi delphi-2009 delphi-2010

9
推荐指数
2
解决办法
7430
查看次数

TToolButton高度随Style = tbsDropdown增长

我注意到当你将按钮的样式设置为tbsDropdown时,TToolButton的高度会增加.我可以理解宽度增加,所以按钮有空间绘制向下箭头,但我不确定高度增加是否必要.

重现问题的步骤(Delphi 2010,Windows 7 x64):

  • 将TToolbar添加到表单,ShowCaptions = True
  • 右键单击以向工具栏添加按钮
  • 设置按钮Style = tbsDropDown并注意按钮的高度增长

当分配给工具栏的图像时,会发生相同的高度增加,在这种情况下,按钮中已有足够多的垂直空间可用于绘制下拉列表.

这是一个可视化示例: alt text http://img440.imageshack.us/img440/1462/ttoolbar02.png alt text http://img291.imageshack.us/img291/966/ttoolbar01.png

是否有一个解决方法,没有黑客攻击VCL,或者这是硬编码到Windows控件?

delphi

7
推荐指数
1
解决办法
2415
查看次数