• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Delphi-Kenner gesucht

Mitglied seit
29.03.2004
Beiträge
619
Reaktionen
0
Ich progge gerade ein bisserl in Delphi, aber ich stoße schnell an meine Grenzen. Ich will einen Ball bewegen lassen und mache das mit eine OnKeyDown procedure, jedoch schein mir das nicht gerade das optimalste, weil 1. wenn ich die Taste gedrückt halte, dass sich der Ball schneller bewegt, brauch es ein bisschen bis er diese "Einrastfunktion" macht und 2. wenn ich ihn nach Links/rechts bewegen lassen und dann die Springen Taste drücke, dann springt er nur, ohne das auf die Bewegung vorher eingegangen wird.
Habt ihr da eine Lösung, wie man das Problem lösen kann?

(dieser Thread ist nicht als "Wie-finde-ich-Delphi-Thread" zu verstehen, also Meinungen in der Richtung einfach stecken lassen)
 

4GT_DosX

Guest
Wie behandelst du denn die Eingaben bisher? In einer OnKeyDown Funktion fragst du ab welche Taste gedrückt wurde und startest eine passende Funktion?

Der Ball soll bei festgehaltener Taste immer schneller werden?

Poste am besten mal ein paar Codeschnippsel.
 
Mitglied seit
29.03.2004
Beiträge
619
Reaktionen
0
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=38 then begin
    Timer1.Enabled:=true;
  end;
  if Key=37 then begin
    if X1>0 then begin
      Image1.Canvas.Pen.Color:=clWhite;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
      X1:=X1-5; X2:=X2-5;
      Image1.Canvas.Pen.Color:=clBlack;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
    end;
  end;
  if Key=39 then begin
    if X2<600 then begin
      Image1.Canvas.Pen.Color:=clWhite;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
      X1:=X1+5; X2:=X2+5;
      Image1.Canvas.Pen.Color:=clBlack;
      Image1.Canvas.Ellipse(X1,Y1,X2,Y2);
    end;
  end;
end;

Das ist meine Ganze KeyDown-Prozedur
Kleine Erklärungen zum besseren Verständniss:
X1,Y1,X2,Y2 sind die Koordinaten für die Ellipse
Um die Bewegung darzustellen male ich einmal die Elipse weg und dann wieder hin
Der Timer sorgt dafür, dass der Ball hochfliegt und wieder runter kommt, wenn nötig kann ich den auch noch abbilden, aber ich glaube dass ich das nicht machen brauche.
 

4GT_DosX

Guest
Bei der Abfrage der Taste in der Keydown Funktion wird doch wahrscheinlich davon ausgegangen, dass der Nutzer nur eine Taste drücken wird (nehme ich einfach mal an). Insofern bringt deine IF Konstruktion nicht so sehr viel: KeyDown wird bei jedem Tasteneregnis neu aufgerufen. Alle Tastenabfragen werden in deinem Quellcode aber nacheinander abgearbeitet.
Deine IF Abfragen werden immer ALLE durchgearbeitet, einfacher und wesentlich effektiver wär hier eine CASE Anweisung - wie geschaffen für Tastaturabfragen, notfalls auch eine geschachtelte IF-Abfrage:

Code:
IF (TASTE1)
ELSE IF (TASTE2)
ELSE IF (TASTE3)

Ansonsten noch ein paar Kleinigkeiten:
Der Timer wird auch wieder beendet?

Aus
Code:
 if Key=37 then begin
    if X1>0 then begin
kann man auch eine einzelne IF Abfrage basteln.
 
Mitglied seit
29.03.2004
Beiträge
619
Reaktionen
0
Ja, stimmt, ich neige irgendwie noch ganz stark dazu, zu kleinkariert zu programmieren. Du hast selber schon mein Problem erkannt, dass KeyDown immer von neuen gestartet wird, wenn ich eine Tage betätige, nur das möchte ich ja weg haben. Weißt du eine andere Möglichkeit, wie ich das geschickt in Delphi anstelle? Falls du vllt nicht weißt, was ich meine, dann schreib mich einfach in ICQ an, ich glaube ich habe hier drin meine Nummer notiert. Wenn nicht, dann einfach hier die Lösung rein :angel:
 

The_Company

Guest
Normalerweise behandelt man Key events so, dass man ne Operation startet, wenn sie nochj nicht laeuft, und die Operation beendet, wenn das entsprechende KeyUp event kommt. Dann hat man auch den Stress mit den Key repeats nicht. Genau so, wie Du es bereits mit dem Timer1 machst. Machste Dir halt nen Timer2 fuer die X Bewegung.
 
Mitglied seit
29.03.2004
Beiträge
619
Reaktionen
0
Echt eine starke Idee, wäre ich so nie drauf gekommen. Danke für den Tip. Ich glaube damit kann der Thread gelöscht werden, weil mein Problem gelöst ist.
 
Oben