Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Image bewegen (https://www.delphipraxis.net/144048-image-bewegen.html)

Jonski 28. Nov 2009 20:33


Image bewegen
 
Hallo Leute;

Meine Frage heute, wie bringe ich ein Image dazu sich per Tastendruck zu bewegen?

Danke schonmal für eure Antworten.

DeddyH 28. Nov 2009 20:37

Re: Image bewegen
 
Zur Änderung der Position musst Du Left bzw. Top des Image neu setzen. Und für Tastendrücke gibt es die Ereignisse OnKeyPress bzw. OnKeyDown. Falls Du noch weitere Komponenten auf dem Formular hast, solltest Du ggf. dessen Eigenschaft KeyPreview auf true setzen.

Wolfgang Mix 28. Nov 2009 20:39

Re: Image bewegen
 
hier im Feld "Search" Move Image eingeben.

Die Adresse würde ich bookmarken.

[Edit] zu spät ? [/Edit]

Gruß

Wolfgang

Namenloser 28. Nov 2009 20:42

Re: Image bewegen
 
Dein Formular hat ein Event namens OnKeyDown. Dieses Event wird immer dann ausgelöst, wenn der Nutzer eine Taste drückt und das Formular den Fokus hat. Damit du weißt, in welche Richtung das Image bewegt werden soll, musst du natürlich noch abfragen, welche Tastae gedrückt wurde. Die Taste ist im Parameter "Key" angegeben, für die Pfeiltasten gibt es die Konstanten VK_LEFT, VK_RIGHT, VK_UP und VK_DOWN.

Lange Rede, kurzer Sinn:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(..., const Key: integer, ...);
begin
  case Key of
    VK_LEFT: Image1.Left := Image1.Left - 10;
    VK_RIGHT: Image1.Left := Image1.Left + 10;
    VK_UP:   Image1.Top := Image1.Top - 10;
    VK_DOWN: Image1.Top := Image1.Top + 10;
  end;
end;
Eine andere Möglichkeit wäre ein Timer/eine Schleife, in dem/der du den Zustand (Gedrückt/Nicht gedrückt) der Tasten selbst abfragst. Das ginge dann mit Delphi-Referenz durchsuchenGetAsncKeyState.

Jonski 28. Nov 2009 21:01

Re: Image bewegen
 
Ich hab jetzt mal wieder ne Frage!

Ich habe diesen Quellcode geschrieben:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);

var Bitmap:TBitmap;

begin
Bitmap:=TBitmap.Create;
Bitmap.Width:=Image1.Width;
Bitmap.Height:=Image1.Height;
Image1.Picture.Graphic:=Bitmap;
with Image1.Canvas do
  begin
  pen.color:=clGreen;
  pen.width:=10;
  MoveTo(500,500);
  end
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_LEFT: Image1.Left := Image1.Left - 10;
  VK_RIGHT: Image1.Left := Image1.Left + 10;
  VK_UP:   Image1.Top := Image1.Top - 10;
  VK_DOWN: Image1.Top := Image1.Top + 10;
end;
end;

end.
Und jetzt habe ich das Problem ,dass sich das Image bewegt und der grüne Punkt erst garnicht erscheint. :cry:

DeddyH 28. Nov 2009 21:06

Re: Image bewegen
 
Du erzeugst ein Bitmap, das Du aber nie benutzt. Zeichne statt auf den Canvas des Image lieber auf den der Bitmap und weise diese erst im Anschluss dem Image zu.

Jonski 28. Nov 2009 21:15

Re: Image bewegen
 
Und wie soll ich das machen?

Ich hab wirklich bis jetzt fast nur Ahnung von Rechenprogrammen und ein bisschen von Grafiken!

DeddyH 28. Nov 2009 21:20

Re: Image bewegen
 
Versuch es mal so (ungetestet):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  try
    Bitmap.Width:=Image1.Width;
    Bitmap.Height:=Image1.Height;
    Bitmap.Canvas.pen.color:=clGreen;
    Bitmap.Canvas.pen.width:=10;
    Bitmap.Canvas.Ellipse(0,0,Bitmap.Width,Bitmap.Height);
    Image1.Picture.Graphic.Assign(Bitmap);
  finally
    Bitmap.Free;
  end
end;

Jonski 28. Nov 2009 21:25

Re: Image bewegen
 
Danke alles ist gut bis auf diese Zeile:

Image1.Picture.Graphic.Assign(Bitmap);

Die funktioniert nicht ich weiß nicht warum :wiejetzt: .

DeddyH 28. Nov 2009 21:27

Re: Image bewegen
 
Das mach ich jedesmal falsch :wall:. Lass das "Graphic." einfach weg.

Wolfgang Mix 28. Nov 2009 21:30

Re: Image bewegen
 
Du machst auch 'mal Fehler? Hätte ich nicht erwartet. :mrgreen:

DeddyH 28. Nov 2009 21:34

Re: Image bewegen
 
Natürlich, ich halte mich ja nicht für unfehlbar, da ich weiß, dass ich das nicht bin.

Jonski 28. Nov 2009 21:36

Re: Image bewegen
 
So und jetzt wo ich das hätte will ich wissen wie ich den weißen Rand unsichtbar machen kann?

DeddyH 28. Nov 2009 21:37

Re: Image bewegen
 
Stichwort transparent

Jonski 28. Nov 2009 21:41

Re: Image bewegen
 
Ja das hab ich auch gewusst aber wo baue ich es ein?

DeddyH 28. Nov 2009 21:44

Re: Image bewegen
 
Schau mal beim Image im Objektinspektor oder in der Referenz.

Jonski 28. Nov 2009 21:48

Re: Image bewegen
 
Ich habs selber herausgefunden juchu
Delphi-Quellcode:
with Image1 do
  begin
  transparent:=true;
  end
Danke jetzt soll mein Objekt an einer Wand stehen bleiben wie geht das?

DeddyH 28. Nov 2009 21:50

Re: Image bewegen
 
Du meinst ein Hindernis? Dazu musst Du vor dem Verschieben nachrechnen, ob sich Image und Wand berühren und erst dann ggf. Verschieben.

Jonski 28. Nov 2009 21:56

Re: Image bewegen
 
Soweit bin ich jetzt:
Delphi-Quellcode:
if Image1       then
begin

end
else begin
case Key of
  VK_LEFT: Image1.Left := Image1.Left - 10;
  VK_RIGHT: Image1.Left := Image1.Left + 10;
  VK_UP:   Image1.Top := Image1.Top - 10;
  VK_DOWN: Image1.Top := Image1.Top + 10;
end;
nur ich weiß nicht wie man eine Berührung erkennt.

DeddyH 28. Nov 2009 22:00

Re: Image bewegen
 
Nunja, z.B. für die Bewegung nach links:
Delphi-Quellcode:
if Image1.Left - 10 > Mauer.Left then
  Image1.Left := Image1.Left - 10;

Jonski 28. Nov 2009 22:21

Re: Image bewegen
 
Also ich habe folgendes Problem, dass Delphi sagt Undefinierter Bezeichner Image1 und so weiter und sofort:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

var Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  try
    Bitmap.Width:=Image1.Width;
    Bitmap.Height:=Image1.Height;
    Bitmap.Canvas.pen.color:=clGreen;
    Bitmap.Canvas.pen.width:=10;
    Bitmap.Canvas.Ellipse(5,5,50,50);
    Image1.Picture.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;

Bitmap:=TBitmap.Create;
  try
    Bitmap.Width:=Image2.Width;
    Bitmap.Height:=Image2.Height;
    Bitmap.Canvas.pen.color:=clBlue;
    Bitmap.Canvas.pen.width:=10;
    Bitmap.Canvas.Ellipse(5,5,50,50);
    Image1.Picture.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;

  with Image1 do
  begin
  transparent:=true;
  end
end;

procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin

if Image1.Left - 10 > Image2.Left then
  begin
  Image1.Left := Image1.Left - 10;
  end
else begin
  case Key of
    VK_LEFT: Image1.Left := Image1.Left - 10;
  end
end

if Image1.Left + 10 > Image2.Left then
  begin
  Image1.Left := Image1.Left + 10;
  end
else begin
  case Key of
    VK_RIGHT: Image1.Left := Image1.Left + 10;
  end
end

if Image1.Top - 10 > Image.Top then
  begin
  Image1.Top := Image1.Top - 10;
  end
else begin
  case Key of
    VK_DOWN: Image1.Top := Image1.Top - 10;
  end
end

if Image1.Top + 10 > Image2.Top then
  begin
  Image1.Top := Image1.Top + 10;
  end
else begin
  case Key of
    VK_UP: Image1.Top := Image1.Top + 10;
  end
end
end;

end.
Bitte helft mir.

Namenloser 28. Nov 2009 22:30

Re: Image bewegen
 
Zitat:

Zitat von Jonski
Also ich habe folgendes Problem, dass Delphi sagt Undefinierter Bezeichner Image1 und so weiter und sofort:
Delphi-Quellcode:
...
procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
...

Du kannst das nicht einfach so in den Code schreiben. Mach einen Doppelklick im Objectinspektor auf das Feld neben "OnKeyDown" (im Reiter "Ereignisse"). Dann kopier den Code dort hinein und lösche die alte procedure.

DeddyH 28. Nov 2009 22:30

Re: Image bewegen
 
:pale: Du solltest vielleicht erst einmal ein Grundlagentutorial durcharbeiten. Du hast doppelten Code im FormCreate(die Bitmap wird 2 mal erzeugt) und für das KeyDown-Ereignis musst Du im Objektinspektor auf dem Reiter "Ereignisse" einen Doppelklick bei "OnKeyDown" machen. Daraufhin erzeugt Dir Delphi das Codegerüst automatisch, Du musst nur noch den Code zwischen begin und end einfügen sowie evtl. Variablen.

Namenloser 28. Nov 2009 22:35

Re: Image bewegen
 
Zitat:

Zitat von DeddyH
:pale: Du solltest vielleicht erst einmal ein Grundlagentutorial durcharbeiten. Du hast doppelten Code im FormCreate(die Bitmap wird 2 mal erzeugt)

Naja, sie wird aber jedesmal auch wieder freigegeben. Wenn du genau hinsiehst, wirst du außerdem bemerken, dass der Code nicht identisch ist. Beim ersten Mal ist es Image1, beim zweiten Mal Image2. Allerdings hat er es in der letzten Zeile (mit Assign) vergessen zu ändern. Grundlagentutorials könnten natürlich nicht schaden...

DeddyH 28. Nov 2009 22:38

Re: Image bewegen
 
Er weist die Bitmap beide Male Image1 zu, das macht ja keinen Sinn.

Jonski 28. Nov 2009 22:41

Re: Image bewegen
 
Jaja ich weiß was ich falsch gemacht habe.
Hier nochmal eine verbesserte Variante nur bewegt sich der Kreis nicht mehr:
Delphi-Quellcode:
nit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

var Bitmap1,Bitmap2:TBitmap;
begin
Bitmap1:=TBitmap.Create;
  try
    Bitmap1.Width:=Image1.Width;
    Bitmap1.Height:=Image1.Height;
    Bitmap1.Canvas.pen.color:=clGreen;
    Bitmap1.Canvas.pen.width:=10;
    Bitmap1.Canvas.Ellipse(5,5,50,50);
    Image1.Picture.Assign(Bitmap1);
  finally
    Bitmap1.Free;
  end;

Bitmap2:=TBitmap.Create;
  try
    Bitmap2.Width:=Image2.Width;
    Bitmap2.Height:=Image2.Height;
    Bitmap2.Canvas.pen.color:=clBlue;
    Bitmap2.Canvas.pen.width:=10;
    Bitmap2.Canvas.Rectangle(10,10,1000,15);
    Image2.Picture.Assign(Bitmap2);
  finally
    Bitmap2.Free;
  end;

  with Image1 do
  begin
  transparent:=true;
  end;

  with Image2 do
  begin
  transparent:=true;
  end;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

if Image1.Left - 10 > Image2.Left then
  begin
  Image1.Left := Image1.Left - 10;
  end
else begin
  case Key of
    VK_LEFT: Image1.Left := Image1.Left - 10;
  end;
end;

if Image1.Left + 10 > Image2.Left then
  begin
  Image1.Left := Image1.Left + 10;
  end
else begin
  case Key of
    VK_RIGHT: Image1.Left := Image1.Left + 10;
  end;
end;

if Image1.Top - 10 > Image2.Top then
  begin
  Image1.Top := Image1.Top - 10;
  end
else begin
  case Key of
    VK_DOWN: Image1.Top := Image1.Top - 10;
  end;
end;

if Image1.Top + 10 > Image2.Top then
  begin
  Image1.Top := Image1.Top + 10;
  end
else begin
  case Key of
    VK_UP: Image1.Top := Image1.Top + 10;
  end;
end;
end;

end.

DeddyH 28. Nov 2009 22:43

Re: Image bewegen
 
Hol tief Luft, schau Dir Deinen Code nochmal in Ruhe an und dann überlege, was Du eigentlich erreichen willst. Als Tipp: erst die Taste ermitteln, dann erst prüfen, ob sich das Image bewegen darf/soll.

Jonski 28. Nov 2009 22:47

Re: Image bewegen
 
Ich hab den ganzen Teil mit den Tasten nochmal gelöscht und überlege nochmal.

Jonski 28. Nov 2009 22:53

Re: Image bewegen
 
Ich komme hier nicht weiter:

Delphi-Quellcode:
case Key of
  VK_LEFT:
  if Image1.Left -10  Image2.Left then
    begin
    Image1.Left := Image1.Left - 10;
    end
  end
Ich habe keine Ahnung wie ich mit Tasten umgehe!!!

DeddyH 28. Nov 2009 22:54

Re: Image bewegen
 
Da kommt eine Nachricht an "Taste gedrückt". Nun musst Du ermitten, ob das eine der Pfeiltasten ist, damit Du weißt, in welche Richtung sich das Image denn überhaupt ggf. bewegen soll(das war der case-Block). Innerhalb dieses Blocks musst Du nun je Taste schauen, ob die Bewegung in diese Richtung überhaupt ohne Kollision möglich ist. Daher musst Du den Code von oben nur anders verschachteln, dann passt das schon.

[edit] Das ist ja fast schon richtig, Du hast nur das "<" vergessen. [/edit]

Jonski 28. Nov 2009 23:05

Re: Image bewegen
 
Ich weiß das ist irgendwie verschwunden, aber es bewegt sich nichts!

DeddyH 28. Nov 2009 23:08

Re: Image bewegen
 
Das Ereignis OnKeyDown ist zugewiesen, das war der Code daraus und Du hast zum Testen die Pfeiltaste links gedrückt?

Jonski 28. Nov 2009 23:11

Re: Image bewegen
 
Ja nichts passiert alles bleibt wie es ist.

Hier ist der Text:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

var Bitmap1,Bitmap2:TBitmap;
begin
Bitmap1:=TBitmap.Create;
  try
    Bitmap1.Width:=Image1.Width;
    Bitmap1.Height:=Image1.Height;
    Bitmap1.Canvas.pen.color:=clGreen;
    Bitmap1.Canvas.pen.width:=10;
    Bitmap1.Canvas.Ellipse(5,5,50,50);
    Image1.Picture.Assign(Bitmap1);
  finally
    Bitmap1.Free;
  end;

Bitmap2:=TBitmap.Create;
  try
    Bitmap2.Width:=Image2.Width;
    Bitmap2.Height:=Image2.Height;
    Bitmap2.Canvas.pen.color:=clBlue;
    Bitmap2.Canvas.pen.width:=10;
    Bitmap2.Canvas.Rectangle(10,10,1000,15);
    Image2.Picture.Assign(Bitmap2);
  finally
    Bitmap2.Free;
  end;

  with Image1 do
  begin
  transparent:=true;
  end;

  with Image2 do
  begin
  transparent:=true;
  end;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_LEFT:
  if Image1.Left -10 < Image2.Left then
    begin
    Image1.Left := Image1.Left -10;
    end;
  end;
end;

end.

DeddyH 28. Nov 2009 23:12

Re: Image bewegen
 
Wenn die Unit nicht allzu groß ist, poste sie mal komplett hier, ansonsten häng sie mal an.

Namenloser 28. Nov 2009 23:13

Re: Image bewegen
 
Zitat:

Zitat von Jonski
Ja nichts passiert alles bleibt wie es ist.

Versuche, deinen Code zu verstehen. Wenn dir das nicht gelingt, setze am Anfang der procedure einen Breakpoint und steppe dann mit dem Debugger durch.

DeddyH 28. Nov 2009 23:17

Re: Image bewegen
 
Zitat:

Delphi-Quellcode:
if Image1.Left -10 < Image2.Left then

Du willst nach links. Muss Image1.Left dann größer oder kleiner sein als Image2.Left?

Jonski 28. Nov 2009 23:23

Re: Image bewegen
 
Ich hab es umgeändert und es passiert immer noch nichts!

DeddyH 28. Nov 2009 23:25

Re: Image bewegen
 
Setz mal im OnKeyDown den Cursor auf die erste Zeile hinter dem begin und drücke F5. Wenn Du nun das Programm ausführst, bleibt es dann bei dieser Zeile stehen?

Lumpiluk 28. Nov 2009 23:29

Re: Image bewegen
 
Du könntest auch testen, ob OnKeyDown überhaupt ausgeführt wird (z.B. indem du einfach ein ShowMessage einbaust). Falls nicht, solltest du mal überprüfen, ob in den Eigenschaften der Form KeyPreview auf True ist. Es könnte nämlich sein, dass gerade irgendein Edit oder ein Button aktiv ist...

[edit]Tut mir Leid; dachte, ich hätte schon alle Beiträge hier durchgelesen...[/edit]

DeddyH 28. Nov 2009 23:31

Re: Image bewegen
 
Zitat:

Zitat von DeddyH
Falls Du noch weitere Komponenten auf dem Formular hast, solltest Du ggf. dessen Eigenschaft KeyPreview auf true setzen.

Nicht, dass das nicht schon gesagt wurde :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 1 von 3  1 23      

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