Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Maus klick abfragen - verständnis Problem (https://www.delphipraxis.net/127443-maus-klick-abfragen-verstaendnis-problem.html)

ryLIX 13. Jan 2009 13:36


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;

himitsu 13. Jan 2009 13:40

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.

nahpets 13. Jan 2009 13:53

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.

ryLIX 13. Jan 2009 13:55

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 :(

toms 13. Jan 2009 14:03

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;

SirThornberry 13. Jan 2009 14:03

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.

himitsu 13. Jan 2009 14:06

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:
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;
[edit] RedBox einfach ma ignoriert ._.

ryLIX 13. Jan 2009 15:01

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;

SirThornberry 13. Jan 2009 15:03

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.

ryLIX 13. Jan 2009 15:07

Re: Maus klick abfragen - verständnis Problem
 
Stimmt habs nicht beachtet. :oops:
Danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz