Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Eine Orthogonale Linie zeichnen ohne zickzack (https://www.delphipraxis.net/132136-eine-orthogonale-linie-zeichnen-ohne-zickzack.html)

thomas2009 6. Apr 2009 22:56


Eine Orthogonale Linie zeichnen ohne zickzack
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Mein Code zeichnet zwar eine orthogonale Linie mit gedrückter Maustaste
aber nur wenn ich die Hand nicht zittere, sonst erhalte ich eine zick zack siehe Anhang

Der Code komplett :
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
    strgpressed,keypressed:Boolean ;
  Ortho_korrdinate:Integer ;


implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if strgpressed=False then begin
   strgpressed:= Shift=[ssCtrl] ;
   Ortho_korrdinate:=Mouse.CursorPos.X ;
end ;
end;


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if (strgpressed) and (keypressed) then begin SetCursorpos(Ortho_korrdinate,Mouse.CursorPos.Y);
Canvas.LineTo(X, Y); end;
end;


procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
strgpressed:=False ;
end;



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if keypressed=False then begin
   keypressed:=True ;
   Ortho_korrdinate:=Mouse.CursorPos.X ;
   Canvas.MoveTo(X, Y);
end ;

end;


procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
keypressed:=False ;
end;


end.
Das Problem liegt wahrscheinlich an Windows selbst :gruebel:

himitsu 6. Apr 2009 23:07

Re: Eine Orthogonale Linie zeichnen ohne zickzack
 
in FormMouseMove verwendest du zum Zeichnen dennoch alten X und Y der Ereignisprozedur und nicht die neuen Zurückgesetzen :zwinker:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if strgpressed and keypressed then begin
    SetCursorPos(Ortho_korrdinate, Mouse.CursorPos.Y);
    Canvas.LineTo(Ortho_korrdinate, Mouse.CursorPos.Y);
  end;
end;
oder besser
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if strgpressed and keypressed then begin
    SetCursorPos(Ortho_korrdinate, Y);
    Canvas.LineTo(Ortho_korrdinate, Y);
  end;
end;
ansonsten ... deine Codeformatierung (speziell die Einrückung) ist grauenhaft.

und globale Variablen sind nicht sonderlich gut.
Tipp: verschieb strgpressed, keypressed und Ortho_korrdinate nach Private von TForm1

[add]
bezüglich strgpressed:
schau dir mal FormMouseDown > Shift an
da kannst du es direkt prüfen und mußt nicht FormKeyDown damit behelligen :zwinker:

=False bzw =True würde ich an deiner Stelle auch besser weglassen ... das kann nette Fehler ergeben, was schon zu oft im Forum erklärt wurde, warum ...

thomas2009 6. Apr 2009 23:55

Re: Eine Orthogonale Linie zeichnen ohne zickzack
 
Liste der Anhänge anzeigen (Anzahl: 1)
mit deinem Vorschlag wird zwar eine saubere Linie orthogonal gezeichnet
aber es stimmt mit der Mouse Position was nicht
Die Line wird soweit von dem Cursor gezeichnet
Das 2. Problem, beim zeichnen springt der Cursor außerhalb des Formulars ganz oben (siehe Anhang)

himitsu 7. Apr 2009 00:04

Re: Eine Orthogonale Linie zeichnen ohne zickzack
 
ups, ganz vergessen ... X und Y sind relativ zur Form

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    keypressed: Boolean ;
    Ortho_korrdinate: Integer ;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  P: TPoint;
begin
  if keypressed then begin
    P.X := Ortho_korrdinate;
    P.Y := Y;
    P := Self.ClientToScreen(P);
    SetCursorpos(P.X, P.Y);
    Canvas.LineTo(Ortho_korrdinate, Y);
  end;
end;


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  keypressed := ssCtrl in Shift;
  //if keypressed then begin // braucht man hier nicht unbedingt
    Ortho_korrdinate := X;
    Canvas.MoveTo(X, Y);
  //end;
end;


procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  keypressed := False;
end;

end.

thomas2009 7. Apr 2009 00:22

Re: Eine Orthogonale Linie zeichnen ohne zickzack
 
Ausgezeichnet :thumb:

Danke und gute Nacht


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 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