小编Ala*_*inD的帖子

Delphi - 与TButton相比,点击TImage的速度较慢

我有一个包含TImage和TButton控件的表单.我注意到响应OnClick事件的速度对于TImage来说似乎有点慢(快速点击!)所以我测量了它.对于100多次点击(并尽可能快地点击,保持每个控件的速率尽可能一致)我得到了指标:TButton:平均~105-116ms图像:平均~220-235ms

我重复了几次,结果相似.为什么TImage处理点击率大约是TButton的一半?处理从WM_LBUTTON_DOWN到OnClick事件的Windows消息队列会更慢吗?如果它们在前一次点击的N ms之内,它可能正在吞咽Clicks?

TImage的属性似乎没有任何影响这一点的东西.

注意:如果相关,请使用Delphi 7和标准VCL控件.

编辑:这是一些示例代码,演示我如何计时:

// Define variables (in class definition)
m_dwBtnClicks, m_dwImgClicks: DWORD;
m_dwLastBtnClickTicks, m_dwLastImgClickTicks: DWORD;
m_fTotalBtnClicksTicks, m_fTotalImgClicksTicks: Single;

// Initialise variables (in form's OnCreate event)
m_dwBtnClicks := 0;
m_dwImgClicks := 0;

m_dwLastBtnClickTicks := 0;
m_dwLastImgClickTicks := 0;

m_fTotalImgClicksTicks := 0.0;
m_fTotalImgClicksTicks := 0.0;

// OnClick events
procedure TfrmQwerty.btnClick(Sender: TObject);
var
    dwTime: DWORD;
begin
    // TButton click!
    Inc(m_dwBtnClicks);
    dwTime := GetTickCount();
    if (m_dwLastBtnClickTicks > 0) then
        m_fTotalBtnClicksTicks := (m_fTotalBtnClicksTicks + (dwTime - m_dwLastBtnClickTicks));

    m_dwLastBtnClickTicks := dwTime;
end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

5
推荐指数
1
解决办法
449
查看次数

比整个结构更快地复制个人成员?

我有一个小结构,并发现复制单个成员要比一次复制结构快得多.有这么好的理由吗?

我的节目:

// Some random structure
private struct PackStats
{
    public int nGoodPacks, nBadPacks, nTotalPacks;
}

// ...
PackStats stats1 = new PackStats();
PackStats stats2 = new PackStats();

// Set some random statistics
stats1.nGoodPacks = 55;
stats1.nBadPacks = 3;
stats1.nTotalPacks = (stats1.nGoodPacks + stats1.nBadPacks);

// Now assign stats2 from stats1

// This single line consumes ~190ns...
stats2 = stats1;

// ...but these three lines consume ~100ns (in total)
stats2.nGoodPacks = stats1.nGoodPacks;
stats2.nBadPacks = stats1.nBadPacks;
stats2.nTotalPacks = stats1.nTotalPacks;
Run Code Online (Sandbox Code Playgroud)

为了测量纳秒范围内的时间,我做了数百万次的分配:

uint uStart …
Run Code Online (Sandbox Code Playgroud)

c#

5
推荐指数
1
解决办法
95
查看次数

根据条件定义包含不同的表单(.dfm)文件

我们为两个略有不同版本的机器生产两个版本的软件.两台机器上使用的硬件完全不同,我们维护了两个项目Project1和Project2.某些代码(.pas和.dfm,视情况而定)在两个项目之间共享,但大多数代码目前对Project1或Project2是唯一的.

最初从Project1克隆了Project2以使新机器正常运行,但现在我正在重构代码,因此可以在两个项目之间共享表单和单元以减少开发工作.{$IFDEF PROJ1}如果需要,可以使用条件定义.

我们有一个表单在项目之间几乎相同,除了一个TCheckBox,它在Project1中而不是Project2.让我们Masking用单元文件Masking.pas(和Masking.dfm)调用这个表单.

脚步:

  • 将.pas和.dfm从Project1移动到公共共享文件夹中
  • 将Masking.dfm重命名为MaskingProj1.dfm
  • 将Project2中的Masking.dfm复制到公共共享文件夹中,并重命名为MaskingProj2.dfm
  • 手动编辑每个项目的项目(.dpr)文件以反映更改
  • 在Masking.pas中,改为{$R *.dfm}:

    {$IFDEF PROJECT1} {$R MaskingProj1.dfm} {$ELSE} {$R MaskingProj2.dfm} {$ENDIF}

  • 同样在Masking.pas中,使用{$IFDEF PROJECT1}条件定义来编译TCheckBox 控件和Project2的相关代码.

最后,重新打开两个项目并重新编译.嘿presto!有用.现在Project1使用Masking.pas和MaskingProj1.dfm.Project2使用Masking.pas和MaskingProj2.dfm.

这一切看起来都很好......除了当我尝试在IDE中查看表单时,通过在表单和单元之间切换(F12),不会显示任何内容.我可以手动编辑.dfm文件,重新编译后更改会反映在应用程序中......但IDE不会显示该表单.

我究竟做错了什么?是否有可能以{$R *.dfm}这种方式更改以使.pas文件使用不同的表单文件,具体取决于条件定义?

delphi delphi-7 dfm

4
推荐指数
1
解决办法
407
查看次数

STL容器相当于Delphi的设置?

是否存在功能类似于Delphi"set"的STL容器,以下代码取自DelphiBasics:

type
    TDigits = set of '1'..'9';       // Set of numeric digit characters
var
    digits : TDigits;                // Set variable
    myChar : char;
begin
    digits := ['2', '4'..'7'];

    // Now we can test to see what we have set on:
    for myChar := '1' to '9' do
        begin
        if (myChar In digits) then
            DoSomething()
        else
            DoSomethingElse();
        end;
end;
Run Code Online (Sandbox Code Playgroud)

c++ delphi stl

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

改变TProgressBar的视觉步长?

我有一个TProgressBar的表单设置如下:

myProgressBar.Step := 1;
myProgressBar.Min := 0;
myProgressBar.Max := 60;
myProgressBar.Position := 0;
Run Code Online (Sandbox Code Playgroud)

在表格开始时启动一个间隔为1000毫秒的计时器,每个计时器勾选进度条.60秒后,条形图几乎已满(参见图片,调试标签显示已经过去的时间)但是条形图中只有~19.5块,而不是我预期的60块.这意味着您只能看到每3秒左右一步.

TProgressBar步骤过于庞大

我能做些什么吗?设计师中没有任何暴露的属性似乎有所帮助.如果这解决了问题,我很乐意给控件发送消息.例如,我在其他地方使用此代码在运行时更改进度条的颜色:

SendMessage(pbBin1.Handle, PBM_SETBARCOLOR, 0, clLime);
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7 progress-bar

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

DEBUG和RELEASE用Java(Eclipse)构建?

Java和Eclipse的新手(但在Visual Studio和Delphi方面经验丰富).使用Eclipse Mars(4.5)并且无法找到如何设置构建配置(DEBUG或RELEASE).几个相关问题:

  • Java中是否支持DEBUG/RELEASE?
  • 如何在两种配置之间切换?
  • 你能在构建时检测配置并运行这样的条件代码(以Delphi为例): {$IFDEF DBG} CallDebugFunction(); {$ELSE} CallReleaseFunction(); {$ENDIF};

java debugging conditional-compilation

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

memset 可以用于多字节类型和非零值吗

我正在尝试将数组初始化为非零值:

BYTE byteArray[50];
memset(byteArray, 20, sizeof(byteArray));   // Works fine

int intArray[50];
memset(intArray, 20, sizeof(intArray));     // Does not work
Run Code Online (Sandbox Code Playgroud)

目前,我只是手动初始化数组:

// Initialise array manually
for (int pos = 0; pos < 50; pos++)
    intArray[pos] = 20;
Run Code Online (Sandbox Code Playgroud)

我确实很欣赏memset设置内存范围中的每个字节,因此这不能按照我需要的多字节类型的方式工作(除了请求值为 的特殊情况0)。有没有办法memset使用多字节类型强制非零值,或者可能有替代库函数?

c c++ arrays

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

在 Visual Studio 2019 的工具栏中添加分隔符

在 Visual Studio 2019 中,右键单击工具栏区域并选择Customize。然后在Commands选项卡上,选择Toolbar收音机并选择您可见的工具栏之一(例如Build)。您可以在此处添加或更改命令的顺序。

在旧版本的 Visual Studio(例如 Visual Studio 2003)中,在Customize模式下您可以抓取并拖动按钮以插入分隔符。

如何在 Visual Studio 2019 中添加工具栏分隔符?在Customize模式下,您无法抓取并拖动按钮,并且Separator在单击 时找不到任何选项Add Command...

visual-studio-2019

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

扩展的ASCII字符显示为?(问号)

我有一个带有一堆标志的表格(静态图像),每个标志下面都是一个勾选框.用户选择复选框以允许他们使用特定语言.在设计时,我为其本地化的等效语言设置了每种语言的复选框标题,在本例中为"Español"(西班牙语).

设计时西班牙语图像和复选框

对于几乎所有语言,这在运行时都可以正常显示,但对于几种语言,这会改为"Espa?ol".具体来说,当我选择立陶宛语时使用:

// Note: 1063 = ((SUBLANG_DEFAULT shl 10) or LANG_LITHUANIAN)
SetThreadLocale(1063);
Run Code Online (Sandbox Code Playgroud)

运行时的西班牙文本(无需修改)

奇怪的是,如果我只是在表单的OnShow处理程序中使用以下行重新应用标题,那么它将正确显示为"Español".

tbLangSpanish.Caption := 'Español';  // Strange, it now corrects itself!
Run Code Online (Sandbox Code Playgroud)

通过检查运行时标题是否有"?",可以稍微改进上面的代码.其中的字符然后才重新应用标题.应用程序的其余部分完美地显示立陶宛语(标签在运行时设置).

请注意,"ñ"是扩展的ASCII码241.此问题会影响其他一些扩展字符,例如"Français"中的"ç"(字符231).有趣的是,某些扩展的ASCII字符正确显示,例如."¾"(角色190).

这是IDE中的错误(使用Delphi 7)还是遗留ASCII(即非UNICODE)字符的事实?是否有一种首选方法可以在运行时检测不兼容的设计时扩展ASCII字符(可能基于区域设置)?

我执行的搜索都没有给出关于角色为什么显示为"?"的任何解释.我假设这是因为当前Windows代码页中必须缺少所请求的字符,但没有明确说明发生这种情况时显示的内容(如果不能使用UNICODE,也不知道如何解决问题).

delphi delphi-7

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

设置 C# 的 C 样式注释格式

在 Visual Studio 2019 中编写 C#。使用以下结构:

/* My comment
*/
Run Code Online (Sandbox Code Playgroud)

将光标置于 右侧comment并按Enter。这将转换为:

/* My comment
 *
*/
Run Code Online (Sandbox Code Playgroud)

我更喜欢:

/* My comment

*/
Run Code Online (Sandbox Code Playgroud)

Tools > Options找了几圈后,没找到这个设置……它在哪里?

c# visual-studio-2019

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