AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Cursor einfangen

Ein Thema von wendelin · begonnen am 11. Mär 2021 · letzter Beitrag vom 30. Mai 2021
Antwort Antwort
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
902 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Cursor einfangen

  Alt 12. Mär 2021, 15:16
Ich denke, hier sollte nicht der Cursor "springen", sondern das Lineal. Also vielleicht so etwas in der Art?
Delphi-Quellcode:
// ein Bevel auf die Form packen
// OnMouseMove der Form:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Bevel1.Left := Round(x/50) * 50;
end;
In einigen Programmen hat man ja so eine Raster-Funktion. Da wird auch nicht der Mauscursor an sich so eingefangen, sondern nur die aktiven Objekte. Meistens aber in Form einer Drag&Drop-Methode, nicht direkt beim bloßen Bewegen der Maus.
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Cursor einfangen

  Alt 12. Mär 2021, 16:29
Hallo Kodezwerg,

vielen Dank für Deine ausführliche Antwort.
Ich denke, daß Deine Vorschläge mir weiter helfen werden.

Wendelin
Wolfgang
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Cursor einfangen

  Alt 7. Mai 2021, 22:56
Hallo,

nochmals vielen Dank für Eure Antworten.
Ich muß mich entschuldigen. Ich hatte geschrieben, daß in dem Beispielprogramm (Chartprogramm mit Candlesticks) der Cursor, wenn er weiter von
einer Position zur nächsten springt ( nur in x-Richtung) kurzzeitig verschwinden würde. Dies ist jedoch nicht der Fall. Es war eine optische
Täuschung. Es kam daher, da ich eine sehr geringe Auflösung ( sehr viele kurs-werte ) eingestellt hatte. Bei einer höheren Auflösung war der
Crosshair- Cursor immer zu sehen.
Noch eine Frage: warum brauche ich einen Timer und wie setzte ich ihn ein?

Wendelin (Wolfgang)
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Cursor einfangen

  Alt 8. Mai 2021, 00:20
Noch eine Frage: warum brauche ich einen Timer und wie setzte ich ihn ein?
Guten Abend,
bei meinen Vorschlägen ging es immer darum das die Anwendung zu jeder Zeit weiß wo sich der Maus-Cursor befindet.
Um dies zu erreichen benötigt man einen Timer der die Position/Koordinate abfragt und an die Anwendung weiterleitet um dann entsprechende Aktionen auszuführen oder eben keine.

-> TTimer Komponente aufs Formular ziehen, doppelklicken und Code einfügen.
-> TTimer Komponente einen Sinnvollen Interval geben und aktivieren.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 8. Mai 2021 um 00:22 Uhr)
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Cursor einfangen

  Alt 11. Mai 2021, 18:07
Danke KodeZwerg,

ich werde versuchen Deine Anregungen umzusetzen.
Falls es klappt werde ich Dich informieren (mit source-code).

Wendelin (Wolfgang)
Wolfgang
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Cursor einfangen

  Alt 30. Mai 2021, 10:48
Hallo Kodezwerg,

ich habe es gelöst. Ohne TTimer.
Allerdings anders als zunächst gedacht, aber genauso wie ich es wollte.
Stichwort: Trennung des vert. und horiz. Cursors.
Hier der vollständige Code.
Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, Math;


type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Panel1: TPanel;
    SpeedButton2: TSpeedButton;
    CheckBox1: TCheckBox;
    Label1: TLabel;
    Label2: TLabel;
    procedure SpeedButton2Click(Sender: TObject);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure MouseStart(x : Integer);
    procedure vertLinieZeichnen(X_Neu : integer);
    procedure vertLinieLoeschen(X_Alt : Integer);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Var
    xa,ya :integer;
    multi :integer;
    X_Koordinaten : Array of integer;
    diff : Array of Integer;
    X_Neu : Integer;
    X_ALT : Integer;
    aMin : integer;
    aMax : Integer;
    zz : Word = 0;

       (* EINE vert. Linie zeichnen *)

procedure TForm1.vertLinieZeichnen(X_Neu : integer);
begin
   with Form1.PaintBox1.Canvas do
   begin
     pen.Color := clblack;
     pen.Mode := pmnotxor;
     moveto(X_Neu,0);
     LineTo(X_NEU,Form1.PaintBox1.ClientHeight); // vertical
   end;
   Form1.Label2.Caption := 'X_NEU : ' + intToStr(X_Neu); // ausgabe X-Koord. Lineal
   X_Alt := X_Neu;
end;



procedure TForm1.vertLinieLoeschen(X_Alt : Integer);
begin
  If ZZ > 1 then // nur das 1. Mal wird NICHT gelöscht
  begin // es gibt nichts zu löschen !!
    with Form1.PaintBox1.Canvas do
    begin
      pen.Color := clblack;
      pen.Mode := pmnotxor;
      moveto(X_Alt,0);
      LineTo(X_Alt,Form1.PaintBox1.ClientHeight); // vertical
    end;
  end;
end;

procedure TForm1.MouseStart(x : Integer);
var ii , M_1: Integer;
begin
  For ii := 0 To 12 do diff[ii] := ABS(x - X_Koordinaten[ii]);
  M_1 := MinIntValue(Diff); // geringste Entfernung bestimmen
  For ii := 0 to 12 do if diff[ii] = M_1 then X_NEU := X_Koordinaten[ii];
                                         // gibt es bei D7 wirklich KEINE Funktion dafür ??
  aMin := X_NEU - (multi DIV 2);
  aMax := X_NEU + (multi DIV 2);
  form1.vertLinieLoeschen(X_Alt);
  form1.vertLinieZeichnen(X_Neu);
end;

    (* mehrere vert. Linien zeichnen (12) *)

procedure TForm1.SpeedButton2Click(Sender: TObject);
var i: Integer;
begin
  with form1.PaintBox1 do
  begin
    For i := 0 to 12 do
    begin
      canvas.Pen.Style := psSolid;
      canvas.Pen.Color := clRed;
      canvas.MoveTo(i*multi,10);
      canvas.LineTo(i*multi,450);
      X_Koordinaten[i] := (i*multi); //x-Koordinaten in dyn.Array ==> Lineal
    end;
  end;
end;
           (* horizont. Linie zeichnen und koordinaten ausgeben *)

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
 
begin
  if Form1.CheckBox1.Checked then
  begin
    form1.Label1.Caption := 'Koordinaten :' + IntToStr(X) + ' ***** ' + IntToStr(Y);
    with PaintBox1.Canvas do
    begin
      pen.Color := clblack;
      pen.Mode := pmnotxor;
      MoveTo(0,ya); // horizont.
      LineTo(ClientWidth,ya); // horizont.
      MoveTo(0,y); // horizont.
      LineTo(ClientWidth,y); // horizont.
      xa := x;
      ya := y;
      pen.Mode := pmcopy;
    end;
  end;
  if InRange(X,aMin,aMax) = False then
  begin
    inc(zz); // oder boolean
    Form1.MouseStart(x);
  end;
end;

 (* Dyn. Array's und Var's initialisieren *)

procedure TForm1.FormCreate(Sender: TObject);
begin
  aMin := 1; aMax := 2;
  multi := 50;
  SetLength(X_Koordinaten,13); // Array beginnt bei '0' !!
  SetLength(Diff,13);
end;

end.
Falls Du es nachprogrammieren willst:
eine Form.
ein Label(Top)
Auf dem Label ein Panel. Darauf Speedbutton(Linienzeichnen), zwei Labels(für Koordinatenausgabe) und eine Checkbox.
Ferner noch eine Paintbox.
Ich habe noch ein Schönheitproblem.Vielleicht kennst Du ja ein Lösung.
Beim Zeichnen des vert. Cursors gibt es eine unschöne Farbveränderung,
welche nach dem Löschen der ALTEN Cursorpos. wieder verschwindet.
Noch eine Frage: Siehe TForm1.MouseStart !!

Wendelin (Wolfgang)
Wolfgang
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 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