Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zeichnen (https://www.delphipraxis.net/130271-zeichnen.html)

delphi-projekt 5. Mär 2009 20:20


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?

himitsu 5. Mär 2009 20:23

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.

delphi-projekt 5. Mär 2009 20:27

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.

himitsu 5. Mär 2009 20:31

Re: Zeichnen
 
üder das Delphi-Referenz durchsuchenCanvas der Komponente worauf zu zeichnen willst
und dann darin z.B. Delphi-Referenz durchsuchenCanvas.MoveTo und Delphi-Referenz durchsuchenCanvas.LineTo

delphi-projekt 5. Mär 2009 20:38

Re: Zeichnen
 
Ich finde einfach nichts dazu,
soll ich außerdem ein TImage nehmen? oder was sonst?

himitsu 5. Mär 2009 20:40

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 Hier im Forum suchenCanvas MoveTo


[add]
ok, ich dachte TPanel hätte ein TCanvas :oops:

Namenloser 5. Mär 2009 22:09

Re: Zeichnen
 
Zitat:

Zitat von himitsu
im Notfall ginge auch ein TPanel ... sehr viele Komponenten bieten ein Canvas an.

An das Canvas eines TPanel kommt man aber nur über die WinAPI!

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.

mkinzler 5. Mär 2009 22:19

Re: Zeichnen
 
Zitat:

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.
Und das gilt für jeden Canvas

delphi-projekt 6. Mär 2009 20:04

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

Noedel 6. Mär 2009 20:32

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

delphi-projekt 6. Mär 2009 20:43

Re: Zeichnen
 
Vielen Dank
und ausgeben tu ich das über image oder?

mkinzler 6. Mär 2009 20:46

Re: Zeichnen
 
Besser eine TPaintBox. Und Zeichenoperationen nur in der Paint-Methode durchführen, da der Canvas sonst beim Redraw überschrieben wird

delphi-projekt 6. Mär 2009 20:55

Re: Zeichnen
 
Ich hab das jetzt so geschrieben
Delphi-Quellcode:
image1.Canvas.Linieto(X+LinieHorizontal,Y+LinieVertikal);
wie mach ich das mit einer Painbox?

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]

delphi-projekt 6. Mär 2009 21:04

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:
 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;
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 6. Mär 2009 21:05

Re: Zeichnen
 
Wie gesagt Zeichnen nur in der dafür zuständigen Methode

delphi-projekt 6. Mär 2009 21:23

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?

mkinzler 6. Mär 2009 21:26

Re: Zeichnen
 
Den Code, den du jeweils bei Ablauf des Intervalls ausführen willst

Noedel 6. Mär 2009 21:33

Re: Zeichnen
 
also die abfrage, welcher key grade aktuell ist und der code s.o.das wärs auch schon

mkinzler 6. Mär 2009 21:40

Re: Zeichnen
 
Die Berechnung der Position ja, das Zeichnen aber nicht.

delphi-projekt 6. Mär 2009 21:59

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?

Noedel 6. Mär 2009 22:09

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

delphi-projekt 7. Mär 2009 16:53

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.

delphi-projekt 7. Mär 2009 22:07

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:
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.
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

rob60 15. Mai 2009 16:35

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