Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Hilfe bei Klassenentwicklung!!


masterofswim - So 16.01.11 17:16
Titel: Hilfe bei Klassenentwicklung!!
Also Problem ist ein Auto aus der Klasse zu lesen!

Die Klasse UAuto :



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.



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..20] of 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 - 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.
...

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.


masterofswim - Mo 17.01.11 11:56

Ja und was ist nun die Varible?
Wie soll ich das deklarieren?


Xion - 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:


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:


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


Dann kannst du schreiben


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.


masterofswim - Mo 17.01.11 16:10

Und was haste da fürn Tip für mich wie ich das lösen könnte?


Xion - Mo 17.01.11 22:20

Hi,

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


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:

Delphi-Quelltext
1:
2:
3:
4:
procedure TFLevel1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  Auto.a(nil,Key);
end;