小编Mar*_*ner的帖子

是否可以一次为多个指令定义{$ IFDEF}?

是否可以在一个{$ IFDEF}指令中定义多个条件?
我想有这样的语法:

{$IFDEF Condition1 OR Condition2} DoSomething; {$ENDIF}
{$IFDEF Condition1 AND Condition2} DoSomethingElse; {$ENDIF}
Run Code Online (Sandbox Code Playgroud)

谢谢

delphi conditional-compilation logical-operators

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

有没有简单的方法将TDictionary内容复制到另一个?

有一种方法或简单方法如何将一个TDictionary内容复制到另一个中?假设我有以下声明

type
  TItemKey = record
    ItemID: Integer;
    ItemType: Integer;
  end;
  TItemData = record
    Name: string;
    Surname: string;
  end;
  TItems = TDictionary<TItemKey, TItemData>;

var
  // the Source and Target have the same types
  Source, Target: TItems;
begin
  // I can't find the way how to copy source to target
end;
Run Code Online (Sandbox Code Playgroud)

我想将源1:1复制到目标.有这样的方法吗?

谢谢!

delphi generics deep-copy tdictionary delphi-xe2

14
推荐指数
1
解决办法
2815
查看次数

具有AND运算符的语句中的成员是否始终按给定顺序进行检查?

我想知道以下代码是否可能因访问冲突而失败或是否安全.具有AND运算符的语句的第一个成员是否始终作为第一个检查,或者可能(通过某些编译器优化或其他东西)检查第二个作为第一个?

var
  Item: TSomething;

procedure DoSomething;
begin
  if Assigned(Item) and (Item.SomeProperty) then
    DoSomethingElse;
end;
Run Code Online (Sandbox Code Playgroud)

上面的代码绝对安全吗?

谢谢!

delphi logical-operators

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

从另一个线程中设置线程中的布尔值是否安全?

我想知道以下(伪)代码是否可以安全使用.我知道Terminated标志但我需要在主线程的递归搜索操作中设置某种取消标志并保持工作线程运行.我将在那里检查Terminated属性,这个伪代码中缺少什么.

type
  TMyThread = class(TThread)
  private
    FCancel: Boolean;
    procedure RecursiveSearch(const ItemID: Integer);
  protected
    procedure Execute; override;
  public
    procedure Cancel;
end;

procedure TMyThread.Cancel;
begin
  FCancel := True;
end;

procedure TMyThread.Execute;
begin
  RecursiveSearch(0);
end;

procedure TMyThread.RecursiveSearch(const ItemID: Integer);
begin
  if not FCancel then
    RecursiveSearch(ItemID);  
end;

procedure TMainForm.ButtonCancelClick(Sender: TObject);
begin
  MyThread.Cancel;
end;
Run Code Online (Sandbox Code Playgroud)

以这种方式在线程内部设置布尔属性FCancel是否安全?当按下主窗体(主线程)中的按钮时,这不会与RecursiveSearch过程中读取此标志相冲突吗?或者我是否必须添加例如关键部分来读取和写入此值?

非常感谢

delphi multithreading thread-safety

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

是否可以将Build Configuration配置为自动为目标平台添加后缀?

是否可以Build Configuration根据目标平台设置(理想情况下从GUI)自动添加后缀到输出文件?

我的意思是,我将为例如库项目命名Project,我想得到

Project.dll - when I build the project for 32-bit platform
Project64.dll - when I build the project for 64-bit platform
Run Code Online (Sandbox Code Playgroud)

谢谢

delphi build-automation file-io platform delphi-xe2

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

是否可以在Delphi XE2中使用选定的构建配置运行命令行编译器?

我想从命令行进行构建,我想知道如何使用选定的构建配置执行命令行编译器?

我知道有选项--no-config,它不会加载默认的dcc32.cfg文件,但我想设置我在项目中准备的构建配置.

我想运行类似的东西

dcc32.exe --some-option RELEASE Win32 PLATFORM
Run Code Online (Sandbox Code Playgroud)

是否有一些选择构建配置的选项?

谢谢

delphi build buildconfiguration delphi-xe2

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

如何检测表单何时最大化?

我想检测表单何时最大化以保存某些设置(与大小和位置无关)并稍微修改大小和位置.有通用的方法吗?我试图像本文中那样捕获WM_SYSCOMMAND消息.通过最大化按钮,它可以很好地从菜单中最大化,但是当我按下WIN + UP按键时它不会被触发.有没有人知道如何捕捉最大化事件的通用方法,包括WIN + UP击键的情况?

谢谢

windows delphi winapi event-handling delphi-xe2

8
推荐指数
3
解决办法
4844
查看次数

{$ C PRELOAD}指令的含义是什么?

我发现在Controls.pas(以及其他单位)中声明了这个指令,我很高兴知道这是什么意思.

{$C PRELOAD}
Run Code Online (Sandbox Code Playgroud)

据我所知,$ C表示断言控制,但PRELOAD关键字是什么?这是"在预加载时断言我"吗?

我在Delphi 2009中发现了这一点

谢谢

delphi directive compiler-directives

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

如何使用GDI按像素强度将位图转换为灰度?

我正在寻找如何使用GDI(而不是GDI +)将32位位图转换为灰度的简单解决方案.是否有可能通过更改位图的托盘或其他东西?

当然Delphi中有很多像这样的例子,但是我正在寻找一个WinAPI函数,它可以在没有迭代的情况下完成这个.

delphi winapi gdi bitmap grayscale

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

获取shell图标的最快方法

我正在使用此代码获取shell图标(Windows资源管理器中显示的图标).
有没有人有更快获取这些图标的经验?这SHGetFileInfo似乎很慢.

procedure TForm2.Button1Click(Sender: TObject);
var
  FileInfo: TSHFileInfo;
begin
  FillChar(FileInfo, SizeOf(FileInfo), 0);
  if SHGetFileInfo(PChar('c:\windows\'), 0, FileInfo, SizeOf(FileInfo),
    SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX) <> 0 then 
    DrawIconEx(Canvas.Handle, 10, 10, FileInfo.hIcon, 0, 16, 16, 0, DI_IMAGE or 
      DI_MASK);
end;
Run Code Online (Sandbox Code Playgroud)

谢谢!

windows delphi shell winapi icons

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