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



BeitragVerfasst: Fr 14.01.11 00:05 
Wollte wissen wie ich die Klasse UBaelle auf die Klasse UStrasse zeichne?

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:
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!
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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 14.01.11 00:16 
Ich habe es nicht probiert, aber das
ausblenden 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
ausblenden 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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.01.11 00:29 
Ich habe das jetzt mal so probier also die Zeile ist erstmal richtig aber
eine Zeile drunter.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 14.01.11 00:32 
sinnvollerweise
ausblenden Delphi-Quelltext
1:
Ball : array [1..20of TBall;					


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


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

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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?

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: masterofswim
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.