我有一个包含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) 我有一个小结构,并发现复制单个成员要比一次复制结构快得多.有这么好的理由吗?
我的节目:
// 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) 我们为两个略有不同版本的机器生产两个版本的软件.两台机器上使用的硬件完全不同,我们维护了两个项目Project1和Project2.某些代码(.pas和.dfm,视情况而定)在两个项目之间共享,但大多数代码目前对Project1或Project2是唯一的.
最初从Project1克隆了Project2以使新机器正常运行,但现在我正在重构代码,因此可以在两个项目之间共享表单和单元以减少开发工作.{$IFDEF PROJ1}如果需要,可以使用条件定义.
我们有一个表单在项目之间几乎相同,除了一个TCheckBox,它在Project1中而不是Project2.让我们Masking用单元文件Masking.pas(和Masking.dfm)调用这个表单.
脚步:
在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"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) 我有一个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秒左右一步.
我能做些什么吗?设计师中没有任何暴露的属性似乎有所帮助.如果这解决了问题,我很乐意给控件发送消息.例如,我在其他地方使用此代码在运行时更改进度条的颜色:
SendMessage(pbBin1.Handle, PBM_SETBARCOLOR, 0, clLime);
Run Code Online (Sandbox Code Playgroud) Java和Eclipse的新手(但在Visual Studio和Delphi方面经验丰富).使用Eclipse Mars(4.5)并且无法找到如何设置构建配置(DEBUG或RELEASE).几个相关问题:
{$IFDEF DBG} CallDebugFunction(); {$ELSE} CallReleaseFunction(); {$ENDIF};我正在尝试将数组初始化为非零值:
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使用多字节类型强制非零值,或者可能有替代库函数?
在 Visual Studio 2019 中,右键单击工具栏区域并选择Customize。然后在Commands选项卡上,选择Toolbar收音机并选择您可见的工具栏之一(例如Build)。您可以在此处添加或更改命令的顺序。
在旧版本的 Visual Studio(例如 Visual Studio 2003)中,在Customize模式下您可以抓取并拖动按钮以插入分隔符。
如何在 Visual Studio 2019 中添加工具栏分隔符?在Customize模式下,您无法抓取并拖动按钮,并且Separator在单击 时找不到任何选项Add Command...。
我有一个带有一堆标志的表格(静态图像),每个标志下面都是一个勾选框.用户选择复选框以允许他们使用特定语言.在设计时,我为其本地化的等效语言设置了每种语言的复选框标题,在本例中为"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,也不知道如何解决问题).
在 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找了几圈后,没找到这个设置……它在哪里?