Entwickler-Ecke

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


masterofswim - Fr 14.01.11 00:05
Titel: Bräuchte Hilfe bei einer Klassenentwicklung!
Wollte wissen wie ich die Klasse UBaelle auf die Klasse UStrasse zeichne?


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 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 integer;
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(Strasse);
Ball[1] := TBall.create(100,50,30,clred,Strasse);
Ball[1].BallZeichnen(104,520,20,clred);
Ball[2] := TBall.create(200,50,30,clred,Strasse);
Ball[2].BallZeichnen(104,520,20,clred);
Ball[3] := TBall.create(300,50,30,clred,Strasse);
Ball[3].BallZeichnen(104,520,20,clred);
Ball[4] := TBall.create(400,50,30,clred,Strasse);
Ball[4].BallZeichnen(104,520,20,clred);
Ball[5] := TBall.create(500,50,30,clred,Strasse);
Ball[5].BallZeichnen(104,520,20,clred);
Ball[6] := TBall.create(600,50,30,clred,Strasse);
Ball[6].BallZeichnen(104,520,20,clred);

end;

end.


Das ist das Formular auf dem die Klasse gezeichnet werden soll !

Und hier ist sind die Klassen UStrasse die wird aber schon gezeichnet und UBealle!

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:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
unit UBaelle;
interface

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


type TBall = Class(TObject)
 Protected
  zym : Integer;
  Zxm : Integer;
  zRadius : byte;
  zFarbe : TColor;
  kContainer: TForm;
  kBall : TBall;


 public
 Constructor Create (X,Y : Integer; Radius:byte;  Farbe : TColor;  Container : TForm); Virtual;
  Destructor Destroy; Override;
  Procedure Kennt(Ball : TBall); Virtual;
  Procedure BallZeichnen (X,Y : Integer;radius:byte; Farbe : TColor); Virtual ;
 end;

implementation

{ TBall }

procedure TBall.BallZeichnen(X, Y: Integer;Radius:byte; Farbe: TColor);
begin
 With KContainer.canvas do
 Begin
 Brush.Color := clred;
 Pen.Color := Farbe;
 Ellipse(zXm-zRadius,zym-zRadius,zxm+Zradius,zym+Zradius);
 End;
end;

constructor TBall.Create(X, Y: Integer; Radius:byte;  Farbe: TColor;
  Container: TForm);
begin
Inherited Create;
zFarbe := Farbe;
zxm := X;
zym := Y;
zRadius:=Radius;
KContainer := Container;
end;

destructor TBall.Destroy;
begin

  inherited destroy;
end;

procedure TBall.Kennt(Ball: TBall);
begin
kBall:=Ball;
end;

end.




unit UStrasse;

interface
uses extctrls, {Klasse TPanel}
      classes,  {Klasse TComponents}
      graphics, {Klasse TColor}
      forms,    {Klasse TBorderStyle}
      controls; {bvNone, bvRaised, ...}

 type TStrasse = class(TObject)
 Protected
  zym : Integer;
  Zxm : Integer;
  zStart: Integer;
  ZEnde: Integer;
  zFarbe : TColor;
  kContainer: TForm;



 public
        constructor create(X,Y : Integer;Start, Ende : Integer; Farbe : TColor; Container : TForm); Virtual;
        Destructor Destroy; Override;
         Procedure Strassezeichnen (X, Y: Integer;Start, Ende : Integer; Farbe: TColor); Virtual;
      end;
implementation

{ TStrasse }

constructor TStrasse.create(X,Y : Integer;Start, Ende : Integer; Farbe : TColor; Container : TForm);
begin
inherited create;
zFarbe := Farbe;
zxm := X;
zym := Y;
zStart:= Start;
ZEnde:= Ende;
KContainer:=container;
end;

destructor TStrasse.Destroy;
begin

  inherited destroy;
end;

procedure TStrasse.Strassezeichnen(X, Y: Integer;Start, Ende:integer; Farbe: TColor);
begin
With KContainer.Canvas do
 Begin
 Brush.Color := Farbe;
 Pen.Color := clwhite;
 Rectangle(zXm, zYm, zstart , zende);
end;
end;

end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Fr 14.01.2011 um 11:02


bummi - Fr 14.01.11 00:16

Ich habe es nicht probiert, aber das

Delphi-Quelltext
1:
TBall.create(100,50,30,clred,Strasse);                    


kann nicht funktionieren, da Strasse nicht von TForm sondern von TObject abgeleitet ist.
Alle Objekte malen auf KContainer.Canvas also dem Canvas der übergebenen Form, du müsstest also

Delphi-Quelltext
1:
TBall.create(100,50,30,clred,FLevel1);                    

verwenden.
Die Bälle und ich vermute die Autos wissen nichts von Strassen, sondern können sich wie die Strassen nur auf dem übergebenen Form malen.


masterofswim - Fr 14.01.11 00:29

Ich habe das jetzt mal so probier also die Zeile ist erstmal richtig aber
eine Zeile drunter.

Delphi-Quelltext
1:
 Ball[1].BallZeichnen(104,520,20,clred);                    


Da kommt jetz die Fehlermeldung:

[Fehler] ULevel1.pas(50): Inkompatible Typen: 'Integer' und 'TBall'
Und die
[Fehler] ULevel1.pas(45): Record, Objekt oder Klassentyp erforderlich

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


bummi - Fr 14.01.11 00:32

sinnvollerweise

Delphi-Quelltext
1:
Ball : array [1..20of TBall;                    


wobei

Delphi-Quelltext
1:
TBALL(Ball[1]).BallZeichnen(104,520,20,clred);                    


auch funktionieren würde (aber bitte nicht so machen)


masterofswim - Fr 14.01.11 00:38

Okay das klappt schonmal aber wie ich jetz die Bälle auf der Klasse Straße darstellen oder ist das wie das Hauptformular und ich muss es lediglich verschieben?


bummi - Fr 14.01.11 00:41

Die Klasse Strasse hat wie gesagt kein Canvas, alle malen auf der gleichen Zeichenfläche, wenn Du die Strasse nach den Bällen malen lässt malt sie drüber.
Alle Objekte sind gleichberechtigt und malen sich dahin wo sie es gesagt bekommen.

BTW:
Der Ansatz ist ungünstig, stammt aber sicher eh nicht von Dir, oder?


jaenicke - Fr 14.01.11 07:15

Der Ansatz, dass da überhaupt das Formular oder so übergeben wird, ist ungünstig.

Im Zeichenbefehl sollte einfach das Zielcanvas (in dem Fall dann das des Formulars) als TCanvas übergeben werden. Dann ist das den Klassen völlig egal, woher das Canvas kommt, aber sie können damit arbeiten.

Ganz ohne TCanvas zu übergeben geht es logischerweise nicht.