AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Eine Orthogonale Linie zeichnen ohne zickzack
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Orthogonale Linie zeichnen ohne zickzack

Ein Thema von thomas2009 · begonnen am 6. Apr 2009 · letzter Beitrag vom 7. Apr 2009
Antwort Antwort
thomas2009
(Gast)

n/a Beiträge
 
#1

Eine Orthogonale Linie zeichnen ohne zickzack

  Alt 6. Apr 2009, 22:56
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
Miniaturansicht angehängter Grafiken
linie_ortho_171.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

Re: Eine Orthogonale Linie zeichnen ohne zickzack

  Alt 6. Apr 2009, 23:07
in FormMouseMove verwendest du zum Zeichnen dennoch alten X und Y der Ereignisprozedur und nicht die neuen Zurückgesetzen

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

=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 ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#3

Re: Eine Orthogonale Linie zeichnen ohne zickzack

  Alt 6. Apr 2009, 23:55
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)
Miniaturansicht angehängter Grafiken
linie_ortho2_463.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#4

Re: Eine Orthogonale Linie zeichnen ohne zickzack

  Alt 7. Apr 2009, 00:04
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#5

Re: Eine Orthogonale Linie zeichnen ohne zickzack

  Alt 7. Apr 2009, 00:22
Ausgezeichnet

Danke und gute Nacht
  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 16:02 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