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
Seite 2 von 2     12   
wendelin

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

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
Seite 2 von 2     12   


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 08:30 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