Ich habe ein Formular mit einem TImage- und einem TButton-Steuerelement. Ich bemerkte, dass die Geschwindigkeit, mit der auf das OnClick-Ereignis reagiert wurde, für die TImage ein wenig langsam war (schnelles Klicken!), Also habe ich es gemessen. Für mehr als 100 Klicks Ich habe die Metriken (und so schnell wie ich konnte, hält die Raten so konsequent wie ich kann, für jeden Steuer klicken): TButton: Durchschnittlich ~ 105-116ms TImage: Durchschnitt ~ 220-235msDelphi - Klickrate TImage langsam im Vergleich zu TButton
Ich wiederholte dies einige Male mit ähnlichen Ergebnissen. Warum klickt die TImage-Verarbeitung ungefähr halb so schnell wie TButton? Könnte es langsamer sein, die Windows-Nachrichtenwarteschlange von WM_LBUTTON_DOWN zum OnClick-Ereignis zu verarbeiten? Vielleicht schluckt es Klicks, wenn sie innerhalb von N ms des vorherigen Klicks liegen?
Es scheint nichts in den Eigenschaften von TImage zu sein, das dies beeinflusst.
Hinweis: Verwenden Sie hier Delphi 7 und die VCL-Standardsteuerelemente, falls dies relevant ist.
EDIT: Hier ist ein Beispiel-Code demonstriert, wie ich die Dinge timed:
// 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;
Was haben Sie Timing? Bitte zeigen Sie ein kurzes Demo-Programm, das uns genau das gleiche Timing ermöglicht. –
'TButton' verwendet [' BN_CLICKED'] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb761825%28v=vs.85%29.aspx) Systembenachrichtigung zum Auslösen von 'OnClick' Ereignis, während 'TImage' nur Mouse-Down-/Mouse-Up-Ereignispaare verfolgt, also wäre ich nicht überrascht, dass es Unterschiede geben kann. – TLama
@DavidHeffernan: OK, einige Beispielcode hinzugefügt, um zu zeigen, wie die Dinge zeitlich festgelegt wurden. Nichts Außergewöhnliches. Ich habe den TButton durch eine TImage auf einer QWERTY-ähnlichen Bildschirmtastatur ersetzt, als ich den großen Unterschied bemerkte. – AlainD