Entwickler-Ecke
Multimedia / Grafik - Koordinaten vom Canvas einlesen und Gerade zeichnen?
Ottchen - Sa 08.03.03 19:46
Titel: Koordinaten vom Canvas einlesen und Gerade zeichnen?
Mit meinem Linienprogramm komme ich einfach nicht weiter.
Es soll folgendes können:
- Beim ersten Klick auf die Zeichenoberfläche soll ein Punkt
mit seinen Koordinaten angezeigt werden (das habe ich ja noch hinbekommen...).
- Nach dem zweiten Klick soll ein zweiter Punkt gesetzt und die Gerade zwischen den beiden Punkten
gezeichnet werden (z.B. mit LineTo)
Um das zu realisieren nimmt man also das OnMouseDown-Ereignis der Image-Komponente.
Wie verklickere ich aber Delphi, wann der zweite Klick erfolgt ist? Das mit einer
Boolean-Variable als Schalter ist mir nicht geglückt. Man muss sich ja auch die Koordinaten des ersten Punktes mittels
Varaiablen merken (vx1,vx2,vy1,vy2).
Aber wie klappt das mit der Boolean-Variable?
Danke! Ottchen :--((
Hier mein wieder stark gekürzter Quelltext...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var vx1, vx2, //x-Koordinaten vy1, vy2 : integer; //y-Koordinaten
begin with Image1.Canvas do begin vx1:=x; vy1:=y; TextOut(vx1,vy1,' '+IntToStr(vx1)+','+IntToStr(vy1)); //Koordinaten ausgeben Pixels[x,y]:=clNavy; //Punkt setzen end;
end; |
Aya - Sa 08.03.03 19:49
Hi,
(Wer is Liste?) So geht es:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var Click2nd: Boolean = false;
procedure TImage.OnMouseDown(...); begin if not Click2nd then Image1.Canvas.MoveTo(X,Y) else Image1.Canvas.LineTo(X,Y); Click2nd:=NOT Click2nd; end; |
Au'revoir,
Aya
Ottchen - Sa 08.03.03 20:32
Titel: Funktioniert nicht, AYA
Hier mein Quelltext:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Image1: TImage; BitBtn_Ende: TBitBtn; procedure BitBtn_EndeClick(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
var schalter :boolean=false; //entscheidet, ob linke Maustaste gedrückt wurde oder nicht
{$R *.dfm}
procedure TForm1.BitBtn_EndeClick(Sender: TObject); begin close end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var vx1, vx2, //x-Koordinaten vy1, vy2 : integer; //y-Koordinaten
begin if NOT schalter then begin with Image1.Canvas do begin vx1:=x; vy1:=y; TextOut(vx1,vy1,' '+IntToStr(vx1)+','+IntToStr(vy1)); //Koordinaten ausgeben Pixels[vx1,vy1]:=clNavy; //Punkte setzen MoveTo(vx1,vy1); end; end else begin with Image1.Canvas do begin vx2:=x; vy2:=y; TextOut(vx2,vy2,' '+IntToStr(vx2)+','+IntToStr(vy2)); //Koordinaten ausgeben Pixels[vx2,vy2]:=clNavy; //Punkte setzen LineTo(vx2,vy2); schalter:=NOT schalter; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Image1.Canvas end;
end. |
Aya - Sa 08.03.03 20:40
Titel: Re: Funktioniert nicht, AYA
| Ottchen hat folgendes geschrieben: |
| Hier mein Quelltext: |
mhh... ja, soll ich damit jetzt irgendwas machen, oder willst du damit nur sagen das alles funktioniert? :roll:
Raphael O. - Sa 08.03.03 23:12
hinter dem
muss auch noch ein
Quelltext
1:
| schalter:=not schalter |
Ottchen - So 09.03.03 19:38
Titel: klappt nicht...
Aya, das Programm funktioniert nicht.
Fiji-Fighter,
wenn ich hinter den Code deinen Vorschlag setze, zeichnet das Programm nicht eine Linie
zwischen den gesetzten Punkten, sondern eine waagerechte Linie über den zuletzt gesetzten Punkt.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| begin if NOT schalter then begin schalter:=not schalter with Image1.Canvas do . . . |
Und welche Bewandnis hat das mit der Boolean-Variable?
Habt ihr noch eine Idee?
PS: Einfach mal ein Image auf das Formular bringen und auf das OnMouseDown-Ereignis des Images reagieren
und "meinen" fehlerhaften Quelltext hineinkopieren. Das Ergebnis ist echt merkwürdig...
Ottchen
Aya - So 09.03.03 20:40
Hi,
so geht es..:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) Image1: TImage; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; schalter :boolean=false; vx1, vx2, //x-Koordinaten vy1, vy2 : integer; //y-Koordinaten
implementation
{$R *.dfm}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if NOT schalter then begin with Image1.Canvas do begin vx1:=x; vy1:=y; TextOut(vx1,vy1,' '+IntToStr(vx1)+','+IntToStr(vy1)); //Koordinaten ausgeben Pixels[vx1,vy1]:=clNavy; //Punkte setzen MoveTo(vx1,vy1); end; end else begin with Image1.Canvas do begin vx2:=x; vy2:=y; TextOut(vx2,vy2,' '+IntToStr(vx2)+','+IntToStr(vy2)); //Koordinaten ausgeben Pixels[vx2,vy2]:=clNavy; //Punkte setzen MoveTo(vx1,vy1); LineTo(vx2,vy2); end; end; schalter:=NOT schalter; end;
procedure TForm1.FormCreate(Sender: TObject); begin DoubleBuffered:=True; end;
end. |
Au'revoir,
Aya
Ottchen - Do 13.03.03 22:01
Titel: Es klappt!!
Hallo Aya,
vielen Dank für deine Mühe. Das Programm läuft 1a!!
Aber das mit dem Schalter und NOT Schalter kapiere ich noch nicht so richtig. Kannste mir da mal noch einen Tipp geben?
Oben definierst du den Schalter auf false. So müsste NOT schalter doch true bedeuten, oder? Wenn ich aber dann statt if NOT schalter setzte: if schalter:=true funktioniert es nicht...
Ottchen
Aya - Fr 14.03.03 18:50
Hi,
war seit Montag weg, deswegen meine antwort erst jetzt... :)
Also...
Quelltext
1:
| MyBool: Boolean = false |
Heißt, das der "Schalter" MyBool nicht gesetzt ist.
Bei der IF-Abfrage:
ist es so.. "Wenn MyBool True ist..." oder "Wenn der Schalter gesetzt ist..."
Bei:
halt "Wenn mein Schalter NICHT gesetzt ist..." also wenn MyBool = false
und mit:
Wird einfach aus true ein false, und aus false ein true :)
Au'revoir,
Aya
Ottchen - Sa 15.03.03 09:00
Titel: Einfach nur Logik
Ja das ist einfach nur Logik. Man kann also auch mit true und false arbeiten statt mit NOT.
Super. Vielen Dank!
Jetzt bin ich ein ganzes Stück weiter.
Vielen Dank!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!