Hem TImage hem de TButton denetimi olan bir formum var. OnClick olayına yanıt verme hızının TImage için biraz yavaş olduğunu fark ettim (hızlı tıklama!), Böylece ölçtüm. 100+ tıklama (ve her denetim için geldiğince tutarlı oranı tutarak kadar hızlı geldiğince tıklayarak) ben ölçümlerini var: Ortalama ~ 105-116ms TImage: TButton Ortalama ~Delphi - TImage tıklama hızı, TButton ile karşılaştırıldığında yavaş yavaş
220-235ms Bunu benzer sonuçlarla birkaç kez tekrarladım. TImage işlemi neden TButton'un oranının yaklaşık yarısını tıklıyor? Windows ileti kuyruğunu WM_LBUTTON_DOWN adresinden OnClick olayına işlemek daha yavaş olabilir mi? Belki önceki tıklamaların N ms'sindeyse tıklamaları yutuyor mu?
Bu durumu etkileyen TImage özelliklerinde hiçbir şey görünmüyor.
Not: İlgili ise, burada Delphi 7 ve standart VCL denetimlerini kullanma.
DÜZENLEME:
// 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;
procedure TfrmQwerty.imgClick(Sender: TObject);
var
dwTime: DWORD;
begin
// TImage click!
Inc(m_dwImgClicks);
dwTime := GetTickCount();
if (m_dwLastImgClickTicks > 0) then
m_fTotalImgClicksTicks := (m_fTotalImgClicksTicks + (dwTime - m_dwLastImgClickTicks));
m_dwLastImgClickTicks := dwTime;
end;
// Some TTimer::OnTimer event to update the results on-screen
procedure TfrmQwerty.OnTextEntryTimer(Sender: TObject);
var
fTime: Single;
begin
// Stop the timer
TextEntryTimer.Enabled := False;
if (m_dwBtnClicks > 1) then
begin
fTime := m_fTotalBtnClicksTicks/m_dwBtnClicks;
lblButtonClicks.Caption := Format('BtnClicks = %d [Avg = %.3fms]', [
m_dwBtnClicks, fTime]);
end;
if (m_dwImgClicks > 1) then
begin
fTime := m_fTotalImgClicksTicks/m_dwImgClicks;
lblImageClicks.Caption := Format('ImgClicks = %d [Avg = %.3fms]', [
m_dwImgClicks, fTime]);
end;
// Restart the timer
TextEntryTimer.Enabled := True;
end;
Zamanlama nedir? Lütfen aynı zamanlamayı yapmamızı sağlayan kısa bir demo programı gösteriniz. –
'TButton' 'OnClick''i tetiklemek için [' BN_CLICKED'] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb761825%28v=vs.85%29.aspx) sistem bildirimini kullanır TImage sadece fare aşağı/fare up olay çiftini izler iken olay, bu yüzden fark olabilir sürpriz olmamalı. – TLama
@DavidHeffernan: Tamam, bazı şeylerin nasıl zamanlandığını göstermek için kod eklendi. Hiçbir şey fantezi değil. Büyük farkı fark ettiğimde, TButton'u QWERTY stili bir ekran klavyesinde bir TImage ile değiştiriyordum. – AlainD