Zeichnen
Hallo,
wie funktioniert das, wenn ich eine Strecke von Delphi zeichnen lassen möchte. Also, das heißt folgendes: Ich drücke die Taste "W" und Delphi soll eine Linie nach oben zeichnen, drücke ich die Taste "A" soll es die Linie vom letzten Punkt bei W nach Links zeichnen. Was benötige ich nun also alles? Bzw. Hat jemand einen Quelltext? |
Re: Zeichnen
du brauchst eine/mehrere Variable(n) um die Position zu speichern
und dann zeichnest du einfach von dieser Position aus und speicherst die neue Position. |
Re: Zeichnen
Ähm, ja,
und wie geht das :gruebel: ? Ich habe was das angeht echt keinen Plan, ich habe noch nie etwas mit zeichnen gemacht. |
Re: Zeichnen
üder das Canvas der Komponente worauf zu zeichnen willst
und dann darin z.B. Canvas.MoveTo und Canvas.LineTo |
Re: Zeichnen
Ich finde einfach nichts dazu,
soll ich außerdem ein TImage nehmen? oder was sonst? |
Re: Zeichnen
du kannst direkt auf die Form zeichnen (Form1.Canvas)
oder TPaintBox, oder TImage ... im Notfall ginge auch ein TPanel ... sehr viele Komponenten bieten ein Canvas an. oder such einfach mal nach Canvas MoveTo [add] ok, ich dachte TPanel hätte ein TCanvas :oops: |
Re: Zeichnen
Zitat:
Am besten ist IMO die TPaintbox, da diese speziell für diesen Zweck gedacht ist. Allerdings muss beachtet werden, dass Zeichnungen verschwinden, sobald man mit einem anderen Fenster darüber fährt. Um das zu verhindern muss das Bild im OnPaint-Ereignis dann jedes mal neu gezeichnet werden. Beim TImage muss man sich darum nicht kümmern, weil alle Zeichenvorgänge auf das Bitmap im Speicher (Image.Picture.Bitmap) übertragen werden, und automatisch wieder auf das canvas kopiert werden, wenn teile neu gezeichnet werden müssen. |
Re: Zeichnen
Zitat:
|
Re: Zeichnen
Danke für die Infos,
jetzt ist folgendes Problem aufgetreten: Ich möchte mit Hilfe der Tastatur zeichnen. Das soll wie folgt aussehen. Z.B. so lange wie ich die Taste "A" gedrückt halte, soll er mir einen Strich malen z.B. nach rechts. und wenn ich die Taste "W" gedrückt halte, soll er mir einen strich nach oben malen. Leider habe ich keine Ahnung wie ich das machen soll? Bitte helft mir nochmal |
Re: Zeichnen
mit nem Timer liest du aus, ob eine Taste gedrückt ist (--> getansikeystate), dann malst du mit lineto eine Linie in die gewünschte Richtung.
also sähe dann im pseudocode so aus
Delphi-Quellcode:
Anweisung Zeichnen(Zeichen:Char; JetztX,JetztY:Integer)
Variable LinieVertikal, LinieHorizontal: byte; beginne Wenn zeichen='W' dann Beginne LinieHorizontal:=0; LinieVertikal:=-5; Ende Wenn zeichen='S' dann Beginne LinieHorizontal:=0; LinieVertikal:=5; Ende Wenn zeichen='A' dann Beginne LinieHorizontal:=-5; LinieVertikal:=0; Ende Wenn zeichen='D' dann Beginne LinieHorizontal:=5; LinieVertikal:=0; Ende Bild.Zeichenfläche.LinieZu(JetztX+LinieHorizontal,JetztY+LinieVertikal) Ende |
Re: Zeichnen
Vielen Dank
und ausgeben tu ich das über image oder? |
Re: Zeichnen
Besser eine TPaintBox. Und Zeichenoperationen nur in der Paint-Methode durchführen, da der Canvas sonst beim Redraw überschrieben wird
|
Re: Zeichnen
Ich hab das jetzt so geschrieben
Delphi-Quellcode:
wie mach ich das mit einer Painbox?
image1.Canvas.Linieto(X+LinieHorizontal,Y+LinieVertikal);
und es ist noch folgender Fehler aufgetreten damit meint er die -5 [Fehler] uWinIOTest.pas(454): E1012 Konstantenausdruck verletzt untere Grenzen MfG Delphi-Projekt [edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit] |
Re: Zeichnen
Ich hab euch mal meinen Quelltext reingestellt. Eine Sache ist noch wenn "W" gedrückt wird soll er eine Line nach oben malen. Wenn "A" gedrückt wird soll er eine Line nach links malen.Wenn "S" gedrückt wird soll er eine Line nach unten malen. Wenn "D" gedrückt wird soll er eine Line nach rechts malen. Und er soll nur solange die line malen bis ich von der Taste runter bin.
Delphi-Quellcode:
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]
if GetAsyncKeyState(ord('W'))<0
then begin cbData1.checked:=false; cbStrobe.checked:=false; LinieHorizontal:=0; LinieVertikal:=-5; end else begin cbData1.checked:=true; end; if GetAsyncKeyState(ord('D'))<0 then begin cbData5.checked:=false; cbStrobe.checked:=false; LinieHorizontal:=5; LinieVertikal:=0; end else begin cbData5.checked:=true; end; if GetAsyncKeyState(ord('A'))<0 then begin cbData7.checked:=false; cbStrobe.checked:=false; LinieHorizontal:=-5; LinieVertikal:=0; end else begin cbData7.checked:=true; end; Paintbox1.Canvas.LineTo(X+LinieHorizontal,Y+LinieVertikal); end; |
Re: Zeichnen
Wie gesagt Zeichnen nur in der dafür zuständigen Methode
|
Re: Zeichnen
Wenn ich jetzt einen Timer erstelle. Und ich einen doppelclick auf den Timer mache.
Was schreib ich denn da in die Procedure rein? |
Re: Zeichnen
Den Code, den du jeweils bei Ablauf des Intervalls ausführen willst
|
Re: Zeichnen
also die abfrage, welcher key grade aktuell ist und der code s.o.das wärs auch schon
|
Re: Zeichnen
Die Berechnung der Position ja, das Zeichnen aber nicht.
|
Re: Zeichnen
Scheiße das klappt nicht so wie ich mir das vorstelle.
Geht das überhaupt, wenn ich "D" drücke das der dann langsam eine line zieht und wenn ich von "D" los lasse das er dann automatisch aufhört die line zu zeichnen. Ich hab echt keine Ahnung mehr wie ich weiter machen soll. Muss ich so was wirklich in einem Timer machen? |
Re: Zeichnen
stell dir mal vor, du machst alles immer nur, wenn du einen button drückst. De Timer macht das für dich in regelmäßigen abständen "selber" ....
also im timer fragst du ab welcher key grade gedrückt ist und die procedure zeichnen kommt extra und wrid nur dann aufgerufen, wenn der timer sagt key ist W A S oder D |
Re: Zeichnen
Also meinst du das so:
procedure TForm1.Timer2Timer(Sender: TObject); var b:byte; begin if GetAsyncKeyState(ord('S')) or GetAsyncKeyState(ord('W')) or GetAsyncKeyState(ord('D')) or GetAsyncKeyState(ord('A')) then begin Ab jetzt weiß ich aber nicht wie ich da weiter schreiben soll. Kannst du mir nochmal helfen. |
Re: Zeichnen
Mit dem Quelltext stimmt was nicht aber ich hab keine ahnung was.
Der tut einfach nicht in diesen vorgegebenen Zeiträumen makieren. Was muss ich dort ändern?
Delphi-Quellcode:
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]
procedure TForm1.btgoClick(Sender: TObject);
var b : byte; var Phase,Zeit: integer; begin case Phase of 1: begin {gerade} GetPortVal(port+2,@b,1); cbStrobe.checked:=false; GetPortVal(port,@b,1); cbData3.checked:=true; GetPortVal(port,@b,1); cbData5.checked:=true; GetPortVal(port,@b,1); cbData7.checked:=true; Phase:= Phase + 1; end; 2:begin{links} GetPortVal(port+2,@b,1); cbStrobe.checked:=false; GetPortVal(port,@b,1); cbData1.checked:=true; GetPortVal(port,@b,1); cbData3.checked:=true; GetPortVal(port,@b,1); cbData5.checked:=true; Phase:= Phase + 1; end; 3:begin{rechts} GetPortVal(port+2,@b,1); cbStrobe.checked:=false; GetPortVal(port,@b,1); cbData1.checked:=true; GetPortVal(port,@b,1); cbData3.checked:=true; GetPortVal(port,@b,1); cbData7.checked:=true; Phase:= Phase + 1; end; 4:begin {rückw.} GetPortVal(port+2,@b,1); cbStrobe.checked:=false; GetPortVal(port,@b,1); cbData1.checked:=true; GetPortVal(port,@b,1); cbData5.checked:=true; GetPortVal(port,@b,1); cbData7.checked:=true; Phase:= Phase + 1; end; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin Zeit:= Zeit + 1; case Zeit of 1..5 : Phase:= 1; 6 : Phase:= 2; 7..11: Phase:= 3; 12 : begin Phase:= 4; Zeit:= 0; end; end; btgoClick(Sender); end; end. |
Re: Zeichnen
weiss jemand wie man die farbe der linie verändern kann
:xmas: :xmas: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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