Autor Beitrag
masterofswim
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 16.01.11 17:16 
Also Problem ist ein Auto aus der Klasse zu lesen!

Die Klasse UAuto :


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:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
unit UAuto;

interface

uses ExtCtrls,UStrasse,Forms;
type TAuto = Class(TImage)
 Protected

  kContainer: TForm;
  kStrasse : TStrasse;
  //kBall:     TBall;

public
 Constructor Create (x,y:integer;Container:TForm); Virtual;
  Destructor Destroy; Override;
  Procedure Kennt(Strasse : TStrasse); Virtual;
   procedure a(Sender: TObject; var Key: Char);
end;
implementation
uses ULevel1;
{ TAuto }
{$R Test.res}

procedure TAuto.a(Sender: TObject; var Key: Char);

begin
if Key = 'a' then
begin
Picture.Bitmap.LoadFromResourceName(Hinstance,'LINKS');
Left := Auto.Left -4;
//if Auto.Left = 20 then
  // FNacht.show;
   //FNacht.Auto.Picture.Bitmap.LoadFromResourceName(Hinstance,'Nachts_LINKS');


end
else
if Key = 'd' then
begin
Picture.Bitmap.LoadFromResourceName(Hinstance,'RECHTS');
Left := Left +4;
//if FLevel1.Auto.Left = 1150 then
  //   FNacht.show;

end
else
if Key = 'w' then
begin
Picture.Bitmap.LoadFromResourceName(Hinstance,'OBEN');
Top := Top -4;
//if FLevel1.Auto.Top = 1
     //then showmessage ('Hier ist die Welt leider vorbei!' );
end
else
if Key = 's' then
begin
Auto.Picture.Bitmap.LoadFromResourceName(Hinstance,'UNTEN');
Top :=Auto.Top +4;
//if FLevel1.Auto.Top = 700
   //  then showmessage ('Hier ist die Welt leider vorbei!' );
end;
end;


constructor TAuto.Create(x,y:integer;Container:TForm);
begin
inherited create(nil);

end;

destructor TAuto.Destroy;
begin

  inherited destroy;
end;

procedure TAuto.Kennt(Strasse: TStrasse);
begin
kStrasse:=Strasse;
end;

end.


Sie soll in ULevel1 den Aufruf machen. Nun weiß ich nicht wie ich ne Procedure Key außerhalb der Klasse aufrufen soll, sprich was da für Parameter reingehörn.


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:
60:
unit ULevel1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,UStrasse, ExtCtrls, StdCtrls, uAuto, UBaelle;

type
  TFLevel1 = class(TForm)
    Button1: TButton;
    Auto1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FLevel1: TFLevel1;
  Strasse: TStrasse;
  Auto:TAuto;
  Ball : array [1..20of TBall;
implementation

{$R *.dfm}

procedure TFLevel1.FormCreate(Sender: TObject);
begin

Strasse := TStrasse.Create(500,300,200,200,clgray,FLevel1);
Strasse.Strassezeichnen(200,200,200,200,clgray);
//Strasse.Parent:=FLevel1;

end;

procedure TFLevel1.Button1Click(Sender: TObject);
begin
Strasse := TStrasse.Create(1500,550,0,700,clgray,FLevel1);
Strasse.Strassezeichnen(100,100,100,100,clgray);
Auto := TAuto.Create(200,200,FLevel1);
Auto.a(nil,Key);
Ball[1] := TBall.create(100,565,30,clred,FLevel1);
Ball[1].BallZeichnen(104,520,20,clred);
Ball[2] := TBall.create(200,565,30,clred,FLevel1) ;
Ball[2].BallZeichnen(104,520,20,clred);
Ball[3] := TBall.create(300,565,30,clred,FLevel1);
Ball[3].BallZeichnen(104,520,20,clred);
Ball[4] := TBall.create(400,565,30,clred,FLevel1);
Ball[4].BallZeichnen(104,520,20,clred);
Ball[5] := TBall.create(500,565,30,clred,FLevel1);
Ball[5].BallZeichnen(104,520,20,clred);
Ball[6] := TBall.create(600,565,30,clred,FLevel1);
Ball[6].BallZeichnen(104,520,20,clred);

end;

end.


Das Problem liegt bei Zeile 33 & 34 im ULevel1.

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 16.01.11 23:27 
user profile iconmasterofswim hat folgendes geschrieben Zum zitierten Posting springen:

Die Klasse UAuto :

Falsch, es ist die Unit UAuto, die Klasse heißt TAuto :mahn:

user profile iconmasterofswim hat folgendes geschrieben Zum zitierten Posting springen:
Sie soll in ULevel1 den Aufruf machen. Nun weiß ich nicht wie ich ne Procedure Key außerhalb der Klasse aufrufen soll, sprich was da für Parameter reingehörn.
...
ausblenden Delphi-Quelltext
1:
Auto.a(nil,Key);					

Also den Aufruf hast du ja schon. So wie ich das sehe ist die Variable Key nicht deklariert. Ich vermute Key soll die gedrückte Taste sein. Dazu musst du vorher mit GetAsyncKeyState die Tasten abfragen. Such mal danach hier im Forum.

Du musst die Tasten a,d,w und s abfragen.

Alternativ kannst du auch eine Variable im "OnKeyDown" der Form setzen.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: masterofswim
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 17.01.11 11:56 
Ja und was ist nun die Varible?
Wie soll ich das deklarieren?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 17.01.11 15:34 
Key ist erstmal ein Char. Also ein einzelnes Zeichen.

In der Procedure wird Key ausgewertet. Dort wird auf 'a' (=links), 'd' (=rechts), 'w' (=oben) und 's' (=unten) getestet. Also eine normale WASD Steuerung.

Um den Parameter zu übergeben musst du nun einen Char mit übergeben. Dazu kannst du wiederum eine Variable vom Typ Char verwenden:

ausblenden Delphi-Quelltext
1:
var PressedKey: Char;					


Jetzt musst du der Variablen noch den gedrückten Knopf zuweisen.

Dazu kannst du z.B. "OnKeyPress" verwenden. Diese procedure wird immer aufgerufen, wenn der User eine Taste drückt (nicht bei jeder Taste, aber für WASD reichts). Die kannst du im ObjektInspektor hinzufügen. Dort kriegst du auch die gedrückte Taste gleich als Char übergeben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  PressedKey := Key;
end;


Dann kannst du schreiben

ausblenden Delphi-Quelltext
1:
Auto.a(nil,PressedKey);					


Du solltest dann noch im OnKeyUp die Variable PressedKey wieder auf #0 setzen, sonst bleibt die Taste solange "gedrückt" bis du eine andere drückst (je nachdem was du haben willst kann das auch gut sein)


Dein Code hat da allerdings ein Problem. Immer wenn du den Knopf (Button1) drückst, wird erst ein neues Auto erstellt (das alte ist damit weg) und dann wird einmalig die Taste ausgewertet. Also wird sich das Auto definitiv nicht steuern lassen ;) Nur so am Rande.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 17.01.11 16:10 
Und was haste da fürn Tip für mich wie ich das lösen könnte?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 17.01.11 22:20 
Hi,

du erstellst das Auto einmalig (im OnCreate, mit Auto als globale Variable).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TFLevel1.FormCreate(Sender: TObject);
begin
  Auto := TAuto.Create(200,200,FLevel1);
end;


Im OnKeyDown rufst du direkt die Funktion Auto.a auf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TFLevel1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  Auto.a(nil,Key);
end;

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)