Autor Beitrag
-Nala-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: So 16.12.07 14:33 
Hallo!
Ich habe eine Frage zu einem Programm, welches ich geschrieben habe.
Indem Programm bewegt sich ein Objekt namens Planeten, welches ich mit einer neuen klasse (TPlanet) festgelegt habe. Dies habe ich in 2 Units programmiert. Die eine Unit (Weltraum) beschreibt das ganz normale Programm. Die andere (mPlanet) das Objekt Planeten mit all seinen Eigenschaften und Prozeduren. Nun habe ich, damit man das bewegen auch sieht das objekt immer neu gezeichnet. Das Problem das daraus nun folgt ist, dass die neu gezeichneten Objekte stehen bleiben und nach einiger zeit sieht das ganze so aus wie ein Donut (ich habe das Objekt im Kreis bewegt). Wie kann ich die gezeichneten Objekte sozusagen "verschwinden" lassen, dass nur das eine zu sehen ist??

Hier sind die Units :

1. Weltraum:

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 Weltraum;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    TiMond: TTimer;
    Memo: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TiMondTimer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Planeten: TPlanet;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Planeten := TPlanet.create (0, 6393, 1738, 100, 27,
                         200, round(clientwidth/2)-40,
                         round(clientheight/2)-40, 544,
                         223, clMedGray, clblue, clbtnface);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Planeten.zeichnen(form1.canvas);
end;

procedure TForm1.TiMondTimer(Sender: TObject);
begin
  Planeten.bewegen(Form1);
  Memo.Lines.Add('Koordinaten des Mondes: ' + IntToStr(Planeten.Mlinks)+' '+
                                             IntToStr(Planeten.Moben) );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TiMond.Enabled := true;
end;


end.


2. mPlanet:

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:
unit mPlanet;

interface

uses graphics, math, forms;

   type TPlanet = Class(TObject)
        G : real;         //Grad
        Re : integer;     //Radius der Erde
        Rm : integer;     //Radius des Mondes
        RPe : integer;    //Radius (in Punkten) der Erde
        RPm : integer;    //Radius (in Punkten) des Mondes
        Rk : integer;     //Radius der Kreisbahn
        Elinks : integer; //Position left bei der Erde
        Eoben : integer;  //Position top bei der Erde
        Mlinks : integer; //Position left bei dem Mond
        Moben : integer;  //Position top bei dem Mond
        Fm : TColor;      //Farbe des Mondes
        Fe : TColor;      //Farbe der Erde
        Fh : TColor;      //Farbe des Hintergrundes
        constructor Create (G2:real; Re2, Rm2, RPe2, RPm2, Rk2,
                            Elinks2, Eoben2, Mlinks2,
                            Moben2: integer; Fm2, Fe2, Fh2:Tcolor);

        procedure zeichnen (canv : Tcanvas);
        procedure bewegen (form : Tform);
   end;

implementation

constructor TPlanet.Create (G2:real; Re2, Rm2, RPe2, RPm2, Rk2,
                            Elinks2, Eoben2, Mlinks2,
                            Moben2: integer; Fm2, Fe2, Fh2:Tcolor);
begin
  G := G2;
  Re := Re2;
  Rm := Rm2;
  RPe := RPe2;
  RPm := Rpm2;
  Rk := Rk2;
  Elinks := Elinks2;
  Eoben := Eoben2;
  Mlinks := Mlinks2;
  Moben := Moben2;
  Fm := Fm2;
  Fe := Fe2;
  Fh := Fh2;
end;

procedure TPlanet.zeichnen (canv : Tcanvas);
begin
  canv.Brush.Color := Fe;
  canv.Ellipse(Elinks, Eoben, Elinks+RPe, Eoben+RPe);

  canv.Brush.Color := Fm;
  canv.Ellipse(Mlinks, Moben, Mlinks+RPm, Moben+RPm);
end;

procedure TPlanet.bewegen(form : Tform);
begin
  G := G + 0.1;
  Mlinks := round(form.clientwidth/2 + cos(G) * Rk);
  Moben := round (form.clientheight/2 + sin(G) * Rk);
  zeichnen(form.canvas);
end;

end.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 16.12.07 15:38 
Bevor der neue Mond gezeichnet wird, muss ja wohl der alte noch weg. Quick and dirty Lösung anhand des vorliegenden Quelltextes :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TPlanet.wegzeichnen (canv : Tcanvas); // alte Monddarstellung
begin                                           // "übermalen"
  canv.Pen.Color := clBtnFace;
  canv.Brush.Color := clBtnFace;
  canv.Ellipse(Elinks, Eoben, Elinks+RPe, Eoben+RPe);

  canv.Pen.Color := clBtnFace;
  canv.Brush.Color := clBtnFace;
  canv.Ellipse(Mlinks, Moben, Mlinks+RPm, Moben+RPm);
end;

procedure TPlanet.bewegen(form : Tform);
begin
  Mlinks := round(form.clientwidth/2 + cos(G) * Rk);
  Moben := round (form.clientheight/2 + sin(G) * Rk);
  wegzeichnen(form.canvas); // alten Mond wegzeichnen
  G := G + 0.1;
  Mlinks := round(form.clientwidth/2 + cos(G) * Rk);
  Moben := round (form.clientheight/2 + sin(G) * Rk);
  zeichnen(form.canvas);    // neuen Mond zeichnen
end;


Tip am Rande : Kommentare nur in der Deklaration hinzuschreiben ist ja schön und gut. Sind die Bezeichner selbsterklärend, dann kann man die fast komplett einsparen. Wichtiger ist aber, das Programm selbst zu kommentieren !

_________________
Gruß
Hansa
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 16.12.07 17:51 
Du musst die Malfläche bei jedem Frame komplett löschen und alle Planeten neu zeichnen.
-Nala- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: So 16.12.07 20:29 
Hey!!!!

Es funktioniert!
Vielen Dank!!