![]() |
Maus klick abfragen - verständnis Problem
Moin,
folgendes habe ich vor: Ich möchte, solang einButton gedrückt ist, eine Schleife durchlaufen. Diese soll verlassen werden wenn der Button nicht mehr gedrückt ist. Ich hab das ganze nun im OnMouseDown Event. Nur irgendwie bleibt die Anwendung stehen bzw in der Schleife hängen. Aber ich weiß grad nich was ich falsch mache.
Delphi-Quellcode:
procedure TForm4.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin while ssleft in shift do begin 'Tu was end; end; |
Re: Maus klick abfragen - verständnis Problem
Delphi arbeitet die Nachrichtenschleife sequentiell ab, also alle Nachrichten nacheinander.
Also wenn du jetzt verhinderst, daß die OnMouseDown-Nachticht zuende verarbeitet wird, indem zu z.B. eine (Endlos)Schleife da reinbaust, wirst du Probleme bekommen, da dann natürlich alles im Hauptthread an dieser Stelle stoppt. Lösungen: du könntest z.B. einen Timer, oder einen weiteren Thread in OnMouseDown starten und diesen in OnMouseUp wieder beenden. |
Re: Maus klick abfragen - verständnis Problem
Hallo,
eine Lösung hab' ich nicht, aber mir ist schon häufiger aufgefallen, wenn man in einem Programm eine Maustaste drückt und die Maus festhält, bleibt das Programm solange stehen. Das dürfte also kein delphitypisches Problem sein. |
Re: Maus klick abfragen - verständnis Problem
Hmm ich mag keine Timer ^^
Hatte gerade an Application.ProcessMessages gedacht. Aber der Aufruf von Application.ProcessMessages bewirkt nur das die Anwendung nicht stehen bleibt aber die Schleife wird nicht unterbrochen :( |
Re: Maus klick abfragen - verständnis Problem
Hallo
Am einfachsten geht es mit einem TTimer:
Delphi-Quellcode:
procedure TForm1.SpeedButton1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Timer starten if Button = mbLeft then Timer1.Enabled; end; procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // Timer anhalten Timer1.Enabled:= False; end; procedure TForm1.Timer1Timer(Sender: TObject); begin // Zur Sicherheit abfragen, ob die Maustaste noch gedrückt wird if not GetKeyState(VK_LBUTTON) < 0 then Timer1.Enabled:= False; // Code ausführen... Caption := Caption + '%'; end; |
Re: Maus klick abfragen - verständnis Problem
wie auch, der Parameter kann sich ja nicht durch Zauberhand plötzlich zu einem anderen Wert ändern. Der Wert liegt bei betreten der Mousedownfunktion auf dem Stack und bleibt da bist zum zurückkehren des Events.
|
Re: Maus klick abfragen - verständnis Problem
natürlich wird die Schleife nicht unterbrochen :angel2:
Shift ist eine Variable, welche kurz vor Aufruf dieser Funktion gesetzt wurde ... du mußt da schon etwas entsprechend in OnMouseUp machen :zwinker:
Delphi-Quellcode:
[edit] RedBox einfach ma ignoriert ._.
type TForm4 = Class(TForm)
private IstNochGeklickt: Boolean; end; procedure TForm4.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin IstNochGeklickt := True; while IstNochGeklickt do begin 'Tu was end; end; procedure TForm4.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin IstNochGeklickt := False; end; {***** oder ***************************} type TForm4 = Class(TForm) private IstNochGeklickt: Boolean; end; procedure TForm4.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled := True; end; procedure TForm4.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled := False; end; procedure TForm4.Timer1Timer(Sender: TObject); begin 'Tu was end; |
Re: Maus klick abfragen - verständnis Problem
Sag ich doch verständnis Problem.
Ich hatte nun im Kopp das die Variable nur für die Zeit wie der state vorhanden ist auch dessen Wert hat. Danke für die Hinweise. Möchte hier noch kurz meinen test Code posten fall jemand ein ähnliches Problem hat. Wollte möglichst auf Timer verzichten deswegen diese Lösung.
Delphi-Quellcode:
implementation
{$R *.dfm} var go : boolean; procedure TForm4.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var num : Integer; begin num := 1; go := true; if ssleft in shift then begin repeat Inc(num); Edit1.Text := IntToStr(num); Application.ProcessMessages; until not (go); end; end; procedure TForm4.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if go then begin go := false; end; end; |
Re: Maus klick abfragen - verständnis Problem
Da du objetorientert programmierst ist es sinnvoller die Variable "go" aus dem globen Bereich in die Klasse zu verschieben (nach private, etc.). Denn sonst bekommst du unter Umständen schöne Effekte wenn du mehrere Instanzen deiner Klasse (TForm4) erzeugst.
|
Re: Maus klick abfragen - verständnis Problem
Stimmt habs nicht beachtet. :oops:
Danke :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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