Entwickler-Ecke
Multimedia / Grafik - Zeichnen Mit Delphi
DonDonat - Di 28.12.10 15:46
Titel: Zeichnen Mit Delphi
Hi Community :D
Und zwar bevor ihr ich runter macht ich bin noch delphi anfänger ^.^
Ich arbeite mit delphi 7 seit ende august......
So und jetzt zu meinem problem: Ich muss ein programm schreiben mit dem ich zeichnen kann also:-->beim klick auf die zeichenflache wird eine linie gezogen beim nächsten klick ist die linie zuende, beim nächsten wird vom endpunkt der ersten linie eine zweite gezeichnet....... und zum schluss soll dan beim klick auf einen button das vieleck geschlossen werden
Also ich hab mir natürlich von meinem infolehrer erst mal ein paar tipps geholt aber er gab mir nur einen zettel mit den seiner meinung nach wichtigsten komponennten
(Zuerst über die Canvas eigenschaft-->.Pen, .PenPos, MoveTo, LineTo)
Und ich wollte nur mal nachfragen wie ich das anstellen soll.
(hab mir gedacht das er erst mal beim ersten klick einen Punkt auf der Leinwand festleagt, vom dem aus dan LineTo zum nächsten mausklick usw...... weiß aber net ob das stimmt hab zwar gegoogelt bin aber net schlau draus geworden)
Bitte um anfängerverständliche antworten
Danke im vorraus und MFG DonDonat :D
jaenicke - Di 28.12.10 15:54
Hallo und :welcome:
DonDonat hat folgendes geschrieben : |
(hab mir gedacht das er erst mal beim ersten klick einen Punkt auf der Leinwand festleagt, vom dem aus dan LineTo zum nächsten mausklick usw...... |
Dann mach das doch. MoveTo setzt die Zeichenposition und LineTo kennst du ja schon.
Bergmann89 - Di 28.12.10 21:59
Hey,
is einfacher als es aussieht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| beim Klick auf die Paintbox: prüfen ob das der 1. Punkt ist (am besstem mit variable, die die Anzahl der Punkte pürft) wenn es der 1. Punkt is, dann... den Punkt zischenspeichern (ich glau das war TPoint) dann den Zeichenstift der Canvas auf den Punkt verschieben (MoveTo) wenn nich der 1. Punktt, dann... Linie zeichnen (LineTo)
baim Klick auf deinen Button: Linie zum 1. (gespeicherten) Punkt zeichnen (LineTo) Variable zum zählen der Punkte zurücksetzen |
wenn du das jetzt so der Reihe nach in Code umwandelst sollte das funktionieren.
MfG Bergmann
DonDonat - Do 30.12.10 11:22
Danke ich werds glei mal ausprobieren.
PS: Danke für die schnelle und anfänger freundliche antwort :-)
DonDonat - Fr 31.12.10 12:10
Bergmann89 hat folgendes geschrieben : |
Hey,
is einfacher als es aussieht:
Quelltext 1: 2:
| beim Klick auf die Paintbox: prüfen ob das der 1. Punkt ist (am besstem mit variable, die die Anzahl der Punkte pürft) |
MfG Bergmann |
Also ich bekomm das irgendwie net hin O.o
Ich hab versucht:
Delphi-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:
| procedure TForm1.Image1Click(Sender: TObject); var p:integer; begin
p:=......... if p=1 then begin p:=TPoint; Image1.Canvas.MoveTo:=p; end;
else
begin
Image1.Canvas.LineTo:=p; end;
procedure TForm1.Button1Click(Sender: TObject); begin Image1.Canvas.LineTo:=TPoint; p:=0; end; |
Kann mir wer helfen xD ?
Danke im Vorraus und MFG DonDonat
Moderiert von
Martok: Delphi-Tags gesetzt
jaenicke - Fr 31.12.10 12:21
Naja, du packst die Variable als Feld unter private und zählt die bei jedem Klick hoch. Dann kannst du die Variable abfragen.
Fertig gezählt gibt es das natürlich nicht. :lol:
der organist - Fr 31.12.10 12:27
ich würde das mit dem Zählen nicht mit ner Integervariablen machen. Da du nur zwei Möglichkeiten hast (erster oder zweiter Klick..) eignet sich doch ne Booleanvariable.
Mit der prüfst du, ob es der erste Klick ist, wenn es dieser nicht ist, dann ist es der zweite. Und bevor irgendwelche Merkwürdigkeiten kommen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| if Firstklick then begin ... end else begin ... end;
Firstklick:=NOT Firstklick; |
DonDonat - Fr 31.12.10 17:19
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Danke für den tipp aber ich habs versucht :X und bin gescheitert...
Delphi-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:
| procedure TForm1.Image1Click(Sender: TObject); var p:TPoint; firstklick:boolean; begin if firstklick then begin p:=TPoint Image1.Canvas.MoveTo:=p; end else begin
Image1.Canvas.LineTo:=p; end; p:= NOT p;
end;
procedure TForm1.Button1Click(Sender: TObject); var p: TPoint; begin
Image1.Canvas.LineTo:=p;
end; |
Hab da extrem viele Fehler drinne weiß aber nicht wie ich sie lösen kann :X
Wenn mir wer helfen könnte danke im vorraus :D
Moderiert von
Martok: Delphi-Tags repariert
jaenicke - Fr 31.12.10 17:20
Vor allem musst du die Variable wie gesagt als Feld unter private schreiben. Denn wenn du die lokal deklarierst, ist der Wert beim nächsten Klick logischerweise weg. ;-)
DonDonat - Sa 01.01.11 16:49
Sorry das ich frage aber:
Wo soll das private hin und was bringt ne privat variable ?.? (die hatten wir bis jtzt nämlich net :X)
Bergmann89 - Sa 01.01.11 18:01
Hey,
scoll mal ganz hoch in der Unit, da steht irgendwo
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TForm1 = class(TForm) private public end; |
wenn du da unter das private jetzt deine Variable deklarierst, dann "gehört" die sozusagen der Form1. Und kann auch nur von Methoden in der Unit oder von Methoden der Form1 gelesen und geschrieben werden. Das macht das ganze übersichtlicher, weil man bei zig. Tausend globalen Variablen schnell durcheinander kommt.
MfG Bergmann.
p.s.: Frohes Neues
DonDonat - Mo 03.01.11 19:32
Ok hab die Private variable vereinbart aber trotzdem meine Frage:
Wie kann ich einer variablen den ersten punkt (erste prosition des mausklicks) zuweisen =?
Wenn mir irgendwer das erklären könnte wäre ich fast wunschlos glücklich xD
MFG DonDonat :D
Marc. - Mo 03.01.11 20:42
DonDonat hat folgendes geschrieben : |
Wie kann ich einer variablen den ersten punkt (erste prosition des mausklicks) zuweisen =? |
Allgemein kannst Du so die Maus-Koordinaten relativ zur Form bestimmen:
Delphi-Quelltext
1:
| mausKoordinate := Form1.ScreenToClient(Mouse.CursorPos); |
Die Funktion ScreenToClient und die Klasse TMouse befinden sich in der Unit Controls.
Grüße
DonDonat - Di 04.01.11 17:52
Könnte ich mir das auch irgendwie einfacher machen indem ich irgendwie .Polyline benutze ?.?
(Sorry das ich frage weiß aber net was .Polyline bringt....)
jaenicke - Di 04.01.11 18:07
DonDonat hat folgendes geschrieben : |
Könnte ich mir das auch irgendwie einfacher machen indem ich irgendwie .Polyline benutze ?.? |
So stimmt es...
Mit Polyline musst du dir halt alle Punkte in einem Array merken. Das hat den Vorteil, dass du die auch noch weißt und ggf. korrigieren kannst wie bessere Zeichenprogramme. Ob du das brauchst...
DonDonat - Do 06.01.11 15:40
Das mit dem Polyline war ja nur ne idee wußte ja net was das bringt^^
An Marc. --> ScreenClient(Mouse.CursPos) nimmt wenn ich nicht irre nur die Position des Cursers das bringt mir im dem fall aber nix
weil ich ja die Position des Mausklicks habe will......
Also ich habe jetzt mal versucht mir als anfangsprosition ein Shape zu nehmen:
Delphi-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:
| procedure TForm1.Image1Click(Sender: TObject); var p:TPoint; firstklick:boolean; M:TPoint; begin p:=Shape1.ClientOrigin; if firstklick then begin m:=Form1.ScreenToClient(Mouse.CursPos); Image1.Canvas.MoveTo:=p; end else begin
Image1.Canvas.LineTo:=m; end; m:= NOT m;
end;
procedure TForm1.Button1Click(Sender: TObject); var p: TPoint; begin
Image1.Canvas.LineTo:=p;
end; |
So das funktioniert aber nicht daher meine Frage an Marc. --> ScreenClient(Mouse.CursPos) nimmt wenn ich nicht irre nur die Position des Cursers oder ?.?
Bitte Hilft mir wer bei meinem Programm und sagt mir was ich falsch gemacht hab?^^
Danke :D
MFG DonDonat
Moderiert von
Narses: Delphi-Tag repariert.
jaenicke - Do 06.01.11 16:00
DonDonat hat folgendes geschrieben : |
So das funktioniert aber nicht |
Was mich das wundert, wenn ich da nur mal schnell nen Auge draufwerfe... :roll:
DonDonat hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Image1Click(Sender: TObject); var p:TPoint; firstklick:boolean; M:TPoint; begin [..] m:= NOT m;
end; | |
Voxe - Do 06.01.11 17:10
Hallo,
mit:
Delphi-Quelltext
1: 2:
| procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); |
hast du in X und Y die Mausposition beim Clicken.
Gruß Voxe
Moderiert von
Narses: Delphi-Tags hinzugefügt
DonDonat - Do 06.01.11 17:31
Erst mal danke für die schnelle Antwort^^ Und ja kla m:= NOT m kann ja net gehn xD
Und Voxe eine frage an dich : wenn ich das einsetzte hab ich da die position des mausklicks nur wenn ich den Button drücke oder wie soll ich die beiden zeilen verstehen ?^^
Wäre nett wenn du mir mal ne kurtze erklärung zu den 2 zeilen gibst binn noch anfänger :-/
jaenicke - Do 06.01.11 17:34
Schreib einmal einen Punkt hinter p und schau was Delphi dir anbietet... :roll:
Oder drück F1...
Voxe - Do 06.01.11 17:38
Das ist der procedure-Kopf von dem Ereignis, das eintritt, wenn du auf das Image clickst.
Mit anderen Worten die Mauskoordinaten im Image.
LG Voxe
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!