Autor |
Beitrag |
oneP
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 15:31
Tach zusammen!
Ich lern seit ein paar Monaten Delphi und kann schon so ziehmlich die Grundlagen und will jetz auch die Grafischen Sachen lernen.
Was mich da zB interresieren würde, ist, wie man ganz einfach einen kleinen Punkt (oder eine kleine Grafik) mit den Pfeiltasten über das Formular steuert.
Wäre dankbar für ne erklärung (...und für codes) 
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 11.05.09 15:49
Also ich meine, es müsste mit AktuellesForm.OnKeyPress gehen.
So in etwa mit der Abfrage (vorausgesetzt, Du hast eine solche Komponente drauf):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Procedure TForm1.KeyPress(Key) if Key=VK_Right then GesteuerterButton.Left:=GesteuerterButton.Left+1; if Key=VK_Left then GesteuerterButton.Left:=GesteuerterButton.Left-1; if Key=VK_Up then GesteuerterButton.Top:=GesteuerterButton.Top-1; if Key=VK_Down then GesteuerterButton.Top:=GesteuerterButton.Top+1; |
Wie das jetzt genau mit OnKeyPress geht weiß ich gerade leider nicht so auf Anhieb.
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 16:24
irgendwie wird bei diesem code in der 3. Zeile die ganze zeile rot markiert:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = vk_up then Image1.Top := Image1.Top + 1; |
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Mo 11.05.09 16:59
So, wie du es angegeben hat, gehört es in OnKeyDown, dann funktioniert es auch 
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 17:16
jap jetz hab ichs auch!
und wenn ich will, dass eine Meldung gezeigt wird wenn ich mit dem Button ein Label als ziel erreiche, dann müsste der code so irgendwie ähnlich lauten - oder?
Delphi-Quelltext 1: 2:
| if (image1.Top = Label1.Top) and (image1.Left = Label1.left) then showmessage('Ziel erreicht!'); |
weil dieser funktioniert irgendwie nicht...
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 11.05.09 17:38
oneP hat folgendes geschrieben : | weil dieser funktioniert irgendwie nicht... |
Er funktioniert irgendwie nicht - ich liebe diese präzise Art, Fehler zu beschreiben
Was geht denn nicht? Das sieht eigentlich ganz gut aus. Bedenke, dass die Meldung nur kommt, wenn sich die beiden linken oberen Ecken überlappen - denn schließlich ist der Ursprung des Koordinatensystems in Delphi ja links oben.
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Mo 11.05.09 17:44
Du fragst jetzt nur ab, ob sich die beiden oberen Ecken (und zwar die linken) überlappen, du musst aber ja die ganze Fläche abfragen ...
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
Georg08
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 17:46
@oneP & ffgorcky
Also mich hat der Tread interessiert, aber
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_Right then GesteuerterButton.Left:=GesteuerterButton.Left+1; if Key=VK_Left then GesteuerterButton.Left:=GesteuerterButton.Left-1; if Key=VK_Up then GesteuerterButton.Top:=GesteuerterButton.Top-1; if Key=VK_Down then GesteuerterButton.Top:=GesteuerterButton.Top+1; end; |
macht bei mir nichts, mein button bleibt da wo er ist...
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 17:51
@ffgorcky:
sorry für diese unpräzise beschreibung.
ich bin mit dem button einfach nicht genau auf den Pixel gekommen. Aber es funktioniert.
Es gibt aber bestimmt eine möglichkeit, das eine meldung gezeigt wird sobald der Button das label erreicht, oder?
@Georg08:
war bei mir genauso. Ich hab einfach ein TImage genommen und ein bild rein gemacht. Der Button muss weg.
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mo 11.05.09 17:53
Du machst eine Kollisionsabfrage die am besten in einem Timer stattfindet, kannst aber auch bei jedem Tastendruck abfragen.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 17:58
Dude566 hat folgendes geschrieben : | Du machst eine Kollisionsabfrage die am besten in einem Timer stattfindet, kannst aber auch bei jedem Tastendruck abfragen. |
...und wie mach ich das?
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mo 11.05.09 18:04
Ich dachte du könntest die Grundlagen, dann wirst du ja wohl im Stande sein eine If-Abfrage zu machen mit der überprüft wird ob die beiden Koordinaten sich bereits berühren.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 11.05.09 18:07
oneP hat folgendes geschrieben : | Es gibt aber bestimmt eine möglichkeit, das eine meldung gezeigt wird sobald der Button das label erreicht, oder? |
Ja, die gibt es. Und zwar musst du prüfen, ob sich Rechteck 1 (Button) und Rechteck 2 (Label) überlappen. Ich schreibe dir jetzt keinen fertigen Quelltext, aber eine Anregung:
Delphi-Quelltext 1: 2: 3: 4: 5:
| Erreicht := ((Rect1.Right > Rect2.Left) or (Rect2.Right > Rect1.Left)) and ((Rect1.Bottom > Rect2.Top) or (Rect2.Bottom > Rect1.Top)); |
Die Eigenschaften Right und Bottom kannst du aus Left bzw. Right und den Ausmaßen des Steuerelements herausbekommen.
Georg08 hat folgendes geschrieben : | [...] macht bei mir nichts, mein button bleibt da wo er ist... |
Das Problem ist, dass OnKeyDown nur reagiert, wenn das Formular den Fokus hat, d.h. wenn kein Control, das einen Fokus bekommen kann, vorhanden ist. Da der Button sofort fokusiert ist, müsstest du das Ereignis des Buttons verwenden 
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mo 11.05.09 18:17
Dann muss er es halt mit GetASyncKeyState machen.
Hier z.B.: forum.delphi-treff.d...owthread.php?t=20917
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 18:42
Yogu,
könntest du mir das mal vielleicht bissel genauer erklären?
ich blick im moment gar nichts durch mit diesen Rechtecken und Bottom und Right...
und wie man "Erreicht" Deklarieren muss usw.
wäre dir sehr dankbar!!
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 11.05.09 18:46
Also ich denke, Du müsstest das eher so schreiben:
Delphi-Quelltext 1: 2: 3: 4:
| if ((image1.Top = Label1.Top+Label1.Height) and (image1.Left>Label1.left+Label1.Width) and(image1.Top>Label1.Top+Label1.Height)) or ((Label1.Top = image1.Top+Label1.Height) and (image1.Left>Label1.left+image1.Width) and(Label1.Top>image1.Top+image1.Height)) or ((image1.Left = Label1.left+Label1.Width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) or ((Label1.left = image1.Left+image1.width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) then |
Ich hoffe, dass ich mich da jetzt nirgendwo vertan habe, weil ich im Moment keine Möglichkeit habe, das zu überprüfen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 11.05.09 18:52
Das von mir war nur ein kleiner Pseudo-Code, natürlich gibt es kein Right und Bottom. Das kann man ganz einfach durch Left+Width bzw. Top+Height ersetzen, hätte aber meinen Code unübersichtlicher gemacht.
Und dann ersetze noch Rect1 durch deinen Button und Rect2 durch das Label - fertig 
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 11.05.09 19:13
also mein Quellcode lautet jetzt:
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:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm2 = class(TForm) Image1: TImage; Label1: TLabel; procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private public end;
var Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject); begin Image1.Picture.loadfromfile ('Kegel.bmp'); end;
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_left then image1.Left := image1.Left - 1; if key = vk_right then image1.Left := image1.Left +1; if key = vk_up then image1.Top := image1.Top - 1; if key = vk_Down then image1.Top := Image1.Top + 1;
if ((image1.Top = Label1.Top+Label1.Height) and (image1.Left>Label1.left+Label1.Width) and(image1.Top>Label1.Top+Label1.Height)) or ((Label1.Top = image1.Top+Label1.Height) and (image1.Left>Label1.left+image1.Width) and(Label1.Top>image1.Top+image1.Height)) or ((image1.Left = Label1.left+Label1.Width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) or ((Label1.left = image1.Left+image1.width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) then showmessage('Ziel erreicht!'); end;
end. |
aber es wird schon "Ziel erreicht" wenn ich noch nicht mal am Label bin.
--- Moderiert von Narses: Beiträge zusammengefasst---
und bei deinem, Yogu , wird schon kurz nach dem Start "Ziel erreicht" angezeigt.
--- Moderiert von Narses: Beiträge zusammengefasst---
..und noch ne Frage:
wenn ich mit den Pfeiltasten den Punkt zB nach links steuern will und die links-taste gedrückt halte bleibt der Punkt erst einen kurzen Moment stehen und bewegt sich dann erst. (genauso wie ein Cursor im Text)
kann man das irgendwie im Quellcode abschalten sodass sich der Punkt gleich nach links bewegt?
und wie kann man den Punkt quer steuern?
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Di 12.05.09 16:55
oneP hat folgendes geschrieben : |
wenn ich mit den Pfeiltasten den Punkt zB nach links steuern will und die links-taste gedrückt halte bleibt der Punkt erst einen kurzen Moment stehen und bewegt sich dann erst. |
Das ist die automatische Eingabeverzögerung, damit man bei Texten nicht ausversehen mehrere Buchstaben hat !
oneP hat folgendes geschrieben : | und wie kann man den Punkt quer steuern? |
Wenn du es gleich richtig "quer" steuern willst, also auch diagonal und beliebige Richtungen, solltest du dich mal mit Sinus/Cosinus befassem, darüber könntest du das hinbekommen. Da du aber ja zum Bewegen ständig die Tasten drückst, wird nur das Diagonale gehen ... (vllt lässt du das "laufen" des Punktes über nen Timer laufen und lenkst nur die Richtung mit den Tasten ? )
Grüße
Webo
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 12.05.09 17:29
Zitat: | Das ist die automatische Eingabeverzögerung, damit man bei Texten nicht ausversehen mehrere Buchstaben hat ! |
Genau aus diesem Grund sollte man lieber auf Timer + GetAsyncKeystate umsteigen.
Zitat: | Delphi-Quelltext 1: 2: 3: 4:
| if ((image1.Top = Label1.Top+Label1.Height) and (image1.Left>Label1.left+Label1.Width) and(image1.Top>Label1.Top+Label1.Height)) or ((Label1.Top = image1.Top+Label1.Height) and (image1.Left>Label1.left+image1.Width) and(Label1.Top>image1.Top+image1.Height)) or ((image1.Left = Label1.left+Label1.Width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) or ((Label1.left = image1.Left+image1.width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) then | |
Noch umständlicher geht's nicht? Der Code wurde doch schon von Yogu gepostet. Als kleine Anregung noch die Eigenschaften Width und Height.
edit: Eventuell sollte man auch noch TForm.DoubleBuffered auf True stellen.
|
|