![]() |
Scrollbox und Buttons -> Beim Scrollen nicht OnClick auslösen
Hallo!
Ich habe eine TScrollbox-Komponente und generiere darauf dynamisch TButtons. Problem ist das beim Scrollen (wenn ich am gleichen Button bleide) der OnClick-Event ausgelöst wird. Was ist die "beste" Vorgehensweise dies zu vermeiden? Beispiel: Mein Scrollbereich umfasst 3 Zeilen (also Buttons 1-9). Um hochzuscrollen drücke ich auf die Position wo Button 8 liegt und schiebe diesen auf Position 2. Beim Auslassen des Buttons 8 wird auch OnClick Button8 ausgelöst. 123 456 789 ABC DEF GHI Grüße, Werner |
AW: Scrollbox und Buttons -> Beim Scrollen nicht OnClick auslösen
Eventuell mit einer Globalen Variable die prüft ob du vorher gescrollt hast.
Wenn ja diese nach dem scrollen auf True setzen im OnClick Event vom jeweiligen Button gegenprüfen ob diese den Status True hat dann aus dem OnClick Event rausspringen ohne darauf zu reagieren. Du könntest allerdings auch schon in MouseDown darauf reagieren. if Dragging then bla.. bla.. Das Click Event entfernen natürlich. Und anstelle dessen OnMouseDown verwenden. Ich konnte mich mit OnClick noch nie so recht anfreunden. Alternativ mbRight zum verschiebend der Button verwenden.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } OldPos: TPoint ; Pos: TPoint ; Dragging: Boolean ; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage( 'Clicked' ) ; end; procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if( Button=mbRight ) then begin Dragging := True ; end ; end; procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if( Dragging and ((X - Pos.X <> OldPos.X) or (Y - Pos.Y <> OldPos.Y)) ) then begin Pos.X := OldPos.X-X ; Pos.Y := OldPos.Y-Y ; Button1.Left := Button1.Left - Pos.X ; Button1.Top := Button1.Top - Pos.Y ; end ; OldPos.X := X ; OldPos.Y := Y ; end; procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Dragging := False ; end; procedure TForm1.FormCreate(Sender: TObject); begin Dragging := False ; end; end. gruss |
AW: Scrollbox und Buttons -> Beim Scrollen nicht OnClick auslösen
Ich habe das Problem bei einer Android-App gerade mit dem OnViewPortPositionChange-Event der TVertScrollBox so gelöst:
Ich merke mir die aktuelle Zeit wann der Viewport sich ändert ...
Delphi-Quellcode:
... und der Button reagiert erst, wenn seit dem letzten Verschieben des Viewports mindestens eine halbe Sekunde vergangen ist:Var ZuletztGescrolltUm: TDateTime; procedure TZeiterfassung.VertScrollBox2ViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); begin inherited; ZuletztGescrolltUm:= now; end;
Delphi-Quellcode:
Habe es gerade erst programmiert. Mal sehen, ob es sich bewährt.
Const EineSekunde = 1.0 / 24 / 60 / 60;
procedure TZeiterfassung.btnAuftragGeklickt (Sender: TObject); begin inherited; if (now - ZuletztGescrolltUm) > (EineSekunde * 0.5) then begin ... end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz