![]() |
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:
Das Problem liegt wahrscheinlich an Windows selbst :gruebel:
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. |
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:
oder besser
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;
Delphi-Quellcode:
ansonsten ... deine Codeformatierung (speziell die Einrückung) ist grauenhaft.
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; 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 ... |
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) |
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. |
Re: Eine Orthogonale Linie zeichnen ohne zickzack
Ausgezeichnet :thumb:
Danke und gute Nacht |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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