Autor |
Beitrag |
masterofswim
Hält's aus hier
Beiträge: 14
|
Verfasst: Fr 14.01.11 00:05
Wollte wissen wie ich die Klasse UBaelle auf die Klasse UStrasse zeichne?
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 public end;
var FLevel1: TFLevel1; Strasse: TStrasse; Auto:TAuto; Ball : array [1..20] of 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);
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!
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
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, classes, graphics, forms, controls;
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
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 Narses: Code- durch Delphi-Tags ersetztModeriert von Narses: Topic aus Multimedia / Grafik verschoben am Fr 14.01.2011 um 11:02
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
masterofswim 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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 Narses: Code- durch Delphi-Tags ersetzt
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Fr 14.01.11 00:32
sinnvollerweise
Delphi-Quelltext 1:
| Ball : array [1..20] of TBall; |
wobei
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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
|
|
|