Autor Beitrag
oneP
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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) :D
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Mo 11.05.09 16:24 
irgendwie wird bei diesem code in der 3. Zeile die ganze zeile rot markiert:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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?

ausblenden Delphi-Quelltext
1:
2:
  if (image1.Top = Label1.Top) and (image1.Left = Label1.left) then
     showmessage('Ziel erreicht!');


weil dieser funktioniert irgendwie nicht...
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 11.05.09 17:38 
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: Mo 11.05.09 17:46 
@oneP & ffgorcky

Also mich hat der Tread interessiert, aber
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Mo 11.05.09 17:58 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Du machst eine Kollisionsabfrage die am besten in einem Timer stattfindet, kannst aber auch bei jedem Tastendruck abfragen.


...und wie mach ich das?
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 11.05.09 18:07 
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Erreicht :=
  ((Rect1.Right > Rect2.Left) or     // X-Achse
   (Rect2.Right > Rect1.Left)) and
  ((Rect1.Bottom > Rect2.Top) or     // Y-Achse
   (Rect2.Bottom > Rect1.Top));

Die Eigenschaften Right und Bottom kannst du aus Left bzw. Right und den Ausmaßen des Steuerelements herausbekommen.

user profile iconGeorg08 hat folgendes geschrieben Zum zitierten Posting springen:
[...] 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 :idea:
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 11.05.09 18:46 
Also ich denke, Du müsstest das eher so schreiben:
ausblenden 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))//Also wenn das Image unten an das Label "angedockt" hat...
 or ((Label1.Top = image1.Top+Label1.Height) and (image1.Left>Label1.left+image1.Width) and(Label1.Top>image1.Top+image1.Height))//Also wenn das Image oben an das Label "angedockt" hat...
 or ((image1.Left = Label1.left+Label1.Width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width))//Also wenn das Image rechts an das Label "angedockt" hat
 or ((Label1.left = image1.Left+image1.width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) then//Also wenn das Image links an das Label "angedockt" hat

Ich hoffe, dass ich mich da jetzt nirgendwo vertan habe, weil ich im Moment keine Möglichkeit habe, das zu überprüfen.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 :D
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Mo 11.05.09 19:13 
also mein Quellcode lautet jetzt:
ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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))//Also wenn das Image unten an das Label "angedockt" hat...
 or ((Label1.Top = image1.Top+Label1.Height) and (image1.Left>Label1.left+image1.Width) and(Label1.Top>image1.Top+image1.Height))//Also wenn das Image oben an das Label "angedockt" hat...
 or ((image1.Left = Label1.left+Label1.Width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width))//Also wenn das Image rechts an das Label "angedockt" hat
 or ((Label1.left = image1.Left+image1.width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) //Also wenn das Image links an das Label "angedockt" hat  then showmessage('Ziel erreicht!');
    then showmessage('Ziel erreicht!');
end;


end.

aber es wird schon "Ziel erreicht" wenn ich noch nicht mal am Label bin.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

und bei deinem, Yogu , wird schon kurz nach dem Start "Ziel erreicht" angezeigt.

---Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Di 12.05.09 16:55 
user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:

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 !

user profile icononeP hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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:
ausblenden 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))//Also wenn das Image unten an das Label "angedockt" hat...
 or ((Label1.Top = image1.Top+Label1.Height) and (image1.Left>Label1.left+image1.Width) and(Label1.Top>image1.Top+image1.Height))//Also wenn das Image oben an das Label "angedockt" hat...
 or ((image1.Left = Label1.left+Label1.Width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width))//Also wenn das Image rechts an das Label "angedockt" hat
 or ((Label1.left = image1.Left+image1.width) and (image1.Top > Label1.Top+Label1.Height) and (image1.Left < Label1.left+Label1.Width)) then//Also wenn das Image links an das Label "angedockt" hat


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.