Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kreise zeichnen -- Problem beim Radius


Bernd59 - Di 22.12.09 14:19
Titel: Kreise zeichnen -- Problem beim Radius
Hallo,

ich habe erst seit kurzem mit Delphi angefangen und habe nun ein Problem. Bei einem unserer Programme sollen wir einen Kreis zeichnen. Das funktioniert auch nur ist das Problem das der Radius immer gleich bleibt, obwohl ich ein SpindEdit eingefügt habe
Anbei habe ich meinen Quelltext dazugefügt
Gruß


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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Spin;
type TKreis=class(TObject)
  private
  xmp,ymp,radius: integer;
  imi    : TImage;

  public
  procedure setmitte (x,y:integer);
  procedure setImi   (im :TImage);
  procedure Malen;
  procedure setradius(r :integer);

end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
  private
    Kreis: TKreis;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TKreis.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;

procedure TKreis.setimi   (im :TImage);
begin
     imi:=im;
end;

procedure TKreis.malen;
begin
 imi.canvas.ellipse(xmp-50,ymp-50,xmp+50,ymp+50);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Kreis:=TKreis.create;
Kreis.setimi(image1);
Kreis.setradius(50);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Kreis.setmitte(x,y);
Kreis.malen;
end;

procedure TKreis.setradius(R: integer);
begin
 radius:=r;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Kreis.setradius(Spinedit1.value);
end;
end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


FinnO - Di 22.12.09 14:23

naja, du legst in TKreis.Malen den Radius auch fix auf 50 ;) da müsste wohl anstelle von


Delphi-Quelltext
1:
2:
3:
4:
imi.canvas.ellipse(xmp-50,ymp-50,xmp+50,ymp+50);
//eher sowas: 
imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius); 
//stehen.


Bernd59 - Di 22.12.09 14:36

Hey danke für die schnelle und gute Antwort.
Nun haben wir noch zusätzliche Aufgaben bekommen

Wir sollen eine weitere Klasse einfügen, die von TKreis abgeleitet wird (TEllipse)
Nun habe ich den Quelltext folgendermaßen verändert (Veränderung schwarz hinterlegt)
Moderiert von user profile iconNarses: Bold- durch Highlight-Tags ersetzt.


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

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, Spin;

type TKreis=class(TObject)
private
xmp,ymp,radius: integer;
imi : TImage;

public
procedure setmitte (x,y:integer);
procedure setImi (im :TImage);
procedure Malen;
procedure setradius(r :integer);

end;
type TEllipse=class(TKreis)
private 

public

end;

type
TForm1 = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
Image1: TImage;
SpinEdit1: TSpinEdit;
procedure FormShow(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SpinEdit1Change(Sender: TObject);
private
Kreis: TKreis;

public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

Nun heißt es in der Aufgabe das wir bei private einen Verzerrungsfaktor setzen müssen (der Wert beträgt 5). Muss ich da jetzt einfach eine Variable namens Verzerrungsfaktor : integer definieren?
Bei Public müssen wir eine procedure setzen womit der Faktor gesetzt werden kann sowie eine procedure mit der die Ellipse gemalt werden kann
die procedure ellimalen (ellipse) ist doch so ähnlich wie bei dem Kreis in dem man den Radius bestimmt hat? Nun muss man sie nur anderst strecken( mit Verzerrungsfaktor)?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


FinnO - Di 22.12.09 14:45

stimmt soweit... auf jeden Fall empfehle ich dir, im Informatikunterricht selbst mitzuarbeiten :D ansonsten, benutz mal bitte Delphi-Tags *MODERAAAAATOOOOOOOR Schrei*

€: eine Ellipse hat halt eben einen X-Radius und einen Y-Radius *scratch*


thepaine91 - Di 22.12.09 14:46

Ich würde mal davon ausgehen du weist doch was du zu tun hast dann tu es doch einfach erst mal. ;)
Davon abgesehen ist die Aufgabestellung doch sehr eindeutig.


Bernd59 - Di 22.12.09 15:04

Mal ne Frage: Wie füge ich diese Tags ein, damit es besser lesbar wird?


FinnO - Di 22.12.09 15:06

oben im Editor auf Bereiche -> Delphi -> +


Bernd59 - Di 22.12.09 15:08

Ok, ich habe es nun soweit gemacht nun hänge ich wieder
Ich habe bei TEllipse private und public belegt
Zusätzlich habe ich bei TForm1 TEllipse eingefügt
Nun soll ich bei Show elli erzeugen und die Werte setzen. Sind die Werte für den Verzerrungsfaktor gemeint? Wie setze ich die?
elli hat alle Werte von TKreis und die eigenen. Muss ich nun für die Ellipse jedes mal eine eigene Procedure erstellen?


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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Spin;
type TKreis=class(TObject)
     private
     xmp,ymp,radius: integer;
     imi    : TImage;

     public
     procedure setmitte (x,y:integer);
     procedure setImi   (im :TImage);
     procedure Malen;
     procedure setradius(r :integer);
end;

type TEllipse=class(TKreis)
     private
     verzerrungsfaktor : integer;

     public
     procedure Faktorsetzen;
     procedure ellimalen;

end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
  private
    Kreis: TKreis;
    elli:  TEllipse;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TKreis.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TKreis.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TKreis.malen;
begin
 imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Kreis:=TKreis.create;
Kreis.setimi(image1);
elli:=TEllipse.create;
elli.setimi.(image1);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Kreis.setmitte(x,y);
Kreis.malen;
end;
procedure TKreis.setradius(R: integer);
begin
 radius:=r;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Kreis.setradius(Spinedit1.value);
end;
procedure TEllipse.Faktorsetzen;
begin
Verzerrungsfaktor:=5;
end;
procedure TEllipse.ellimalen;
begin
imi.canvas.ellipse(xmp-verzerrungsfaktor,ymp-radius,xmp+verzerrungsfaktor,ymp+radius);
end;
end.


FinnO - Di 22.12.09 15:10

naja, ein Faktor hat mit addition wenig zu tun. Wie wäre es mit Multiplikation? Und, es wäre u.U. ganz sinnig, wenn "Faktorsetzen" den Faktor als Parameter kriegt, wie z.B. imiSetzen...


Bernd59 - Di 22.12.09 15:51

Ok ich habe nun alle Procedures erstellt um die Ellipsen zu zeichnen, allerdings zeichnet das Programm mir noch keine :?
Was meintest du denn mit Parameter setzen (Faktorsetzen)
Schlussendlich muss ich es noch so einstellen das wenn ich die linke Maustaste drücke der Kreis gezeichnet wird und bei der rechten Maustaste die Ellipse, allerdings haben wir den Befehl für links und rechts noch nicht behandelt
Könnt ihr mir ihn sagen

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Spin;
type TKreis=class(TObject)
     private
     xmp,ymp,radius: integer;
     imi    : TImage;

     public
     procedure setmitte (x,y:integer);
     procedure setImi   (im :TImage);
     procedure Malen;
     procedure setradius(r :integer);
end;

type TEllipse=class(TKreis)
     private
     verzerrungsfaktor : integer;

     public
     procedure setmitte (x,y:integer);
     procedure setImi   (im :TImage);
     procedure setradius(r :integer);
     procedure Faktorsetzen;
     procedure ellimalen;

end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
  private
    Kreis: TKreis;
    elli:  TEllipse;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TKreis.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TKreis.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TKreis.malen;
begin
 imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Kreis:=TKreis.create;
Kreis.setimi(image1);
elli:=TEllipse.create;

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

begin
Kreis.setmitte(x,y);
Kreis.malen;
end;
procedure TKreis.setradius(R: integer);
begin
 radius:=r;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Kreis.setradius(Spinedit1.value);
end;

procedure TEllipse.setmitte(x,y : integer);
begin
xmp:=X;
ymp:=y;
end;
procedure TEllipse.Faktorsetzen;
begin
Verzerrungsfaktor:=5;
end;
procedure TEllipse.ellimalen;
begin
imi.canvas.ellipse(xmp*verzerrungsfaktor,ymp-radius,xmp*verzerrungsfaktor,ymp+radius);
end;
procedure TEllipse.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TEllipse.setradius(r :integer);
begin
radius:=r;
end;
end.


platzwart - Di 22.12.09 15:53


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
If Button = mbLeft then
 begin
  ...
 end
else
 If Button = mbRight then
  begin
   ...
  end;


Bernd59 - Di 22.12.09 16:09

Danke, aber bei ich weiß nicht genau wo ich das MB Left und MB right einfügen soll?
Ich hab den Quelltext optisch ein bisschen übersichtlicher gemacht.
Nun habe ich das Problem, das wenn ich das Programm starte erst denn Radius ändern muss damit ich einen Kreis zeichen kann

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:
123:
unit UnitHF;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Spin;
type TKreis=class(TObject)
     private
     xmp,ymp,radius: integer;
     imi    : TImage;

     public
     procedure setmitte (x,y:integer);
     procedure setImi   (im :TImage);
     procedure Malen;
     procedure setradius(r :integer);
end;

type TEllipse=class(TKreis)
     private
     verzerrungsfaktor : integer;

     public
     procedure setmitte (x,y:integer);
     procedure setImi   (im :TImage);
     procedure setradius(r :integer);
     procedure Faktorsetzen;
     procedure ellimalen;

end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
  private
    Kreis: TKreis;
    elli:  TEllipse;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TKreis.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TKreis.setimi   (im :TImage);
begin
     imi:=im;
end;


procedure TForm1.FormShow(Sender: TObject);
begin
      Kreis:=TKreis.create;
      Kreis.setimi(image1);
      elli:=TEllipse.create;

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);


begin
      Kreis.setmitte(x,y);
      Kreis.malen;
end;

procedure TKreis.setradius(R: integer);
begin
      radius:=r;
end;

procedure TKreis.malen;
begin
      imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius);
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
      Kreis.setradius(Spinedit1.value);
end;

procedure TEllipse.ellimalen;
begin
      imi.canvas.ellipse(xmp*verzerrungsfaktor,ymp-radius,xmp*verzerrungsfaktor,ymp+radius);
end;

procedure TEllipse.setmitte(x,y : integer);
begin
      xmp:=X;
      ymp:=y;
end;
procedure TEllipse.Faktorsetzen;
begin
      Verzerrungsfaktor:=5;
end;

procedure TEllipse.setimi   (im :TImage);
begin
      imi:=im;
end;
procedure TEllipse.setradius(r :integer);
begin
      radius:=r;
end;

end.


thepaine91 - Di 22.12.09 16:18

Ganz sicher nicht im OnMouseDown event.


FinnO - Di 22.12.09 16:21

:mrgreen: ne, auf keinen Fall da :P

[/ironie]


Bernd59 - Di 22.12.09 16:22

ja wo muss ich es dann hineinfügen
Könnt ihr mir sagen warum ich erst denn Radius im SpinEdit ändern muss, bevor ich den Kreis zeichnen kann?


FinnO - Di 22.12.09 16:30

*ironieschildwedel*

weil du vermutlich vorher keinen Radius gesetzt hast, der dann entweder 0 oder irgendwas perverses á la 123481283 oder so ist.


thepaine91 - Di 22.12.09 16:30


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormShow(Sender: TObject);
begin
      Kreis:=TKreis.create;
      Kreis.setimi(image1);
      elli:=TEllipse.create;

end;


Hat euer Lehrer das so vorgegeben?


Bernd59 - Di 22.12.09 16:50

Wenn ich aber

Delphi-Quelltext
1:
2:
3:
Kreis:=TKreis.create;
Kreis.setimi(image1);
Kreis.setradius(50);

eingebe dann zeichnet er mir den Kreis mit Radius 50, wenn ich aber dann auf 120 einstelle kann ich nur einen Kreis mit Radius 120 zeichnen, denn beim zweiten Klick springt er wieder auf 50 zurück

Nein, den letzten Befehl mit der Ellipse hab ich selber eingefügt! in der Aufgabe steht: ,,Bei Show dann elli erzeugen und Werte setzen". Deswegen habe ich den Befehl gesetzt, aber wie setzt man die Werte?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Erstes Problem braucht ihr nicht erläutern, hab ich gelöst mit


Delphi-Quelltext
1:
2:
3:
Kreis:=TKreis.create;
Kreis.setimi(image1);
Kreis.setradius(SPinEdit1.value);

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


thepaine91 - Di 22.12.09 16:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormShow(Sender: TObject);
begin
      Kreis:=TKreis.create;
      Kreis.setimi(image1);
      elli:=TEllipse.create;

end;


Wenn die Aufgabenstellung so war beschwer dich von mir bei deinem Lehrer.
Denn (onshow) kann öfter auftreten.

In dem Fall würdest du immer wieder

Delphi-Quelltext
1:
2:
3:
Kreis:=TKreis.create;
Kreis.setimi(image1);
elli:=TEllipse.create;

aufrufen.

Naja die folge davon ergibt sich von selbst.
Aber vielleicht denk ich grad auch zu weit. ^^

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Bernd59 - Di 22.12.09 17:12

Ich poste hier mal die komplette Aufgabe incl. dem was wir schon gelöst haben


Bernd59 - Di 22.12.09 17:54

SO ich habe es nun noch einmal neu gemacht das Programm und habe jetzt keine Fehlermeldung mehr. Das Problem ist nur noch das mit der linken und der rechten Maus

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Spin;
type TKreis=class(TObject)
  private
  xmp,ymp,radius: integer;
  imi    : TImage;

  public
  procedure setmitte (x,y:integer);
  procedure setImi   (im :TImage);
  procedure Malen;
  procedure setradius(r :integer);

end;
type TEllipse=class(TKreis)
  private
  Faktor :integer;
  public
  procedure setfaktor(f :integer);
  procedure ellimalen;
  procedure setmitte (x,y:integer);
  procedure setImi   (im :TImage);

end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
  private
    Kreis: TKreis;
    elli : TEllipse;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TKreis.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TEllipse.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TKreis.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TEllipse.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TKreis.malen;

begin
 imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius);
end;

procedure TEllipse.ellimalen;

begin
 imi.canvas.ellipse(xmp-radius*Faktor,ymp-radius,xmp+radius*Faktor,ymp+radius);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Kreis:=TKreis.create;
Kreis.setimi(image1);
Kreis.setradius(Spinedit1.value);
elli:=TEllipse.create;
elli.setradius(Spinedit1.value);
elli.setfaktor(Spinedit2.value);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Kreis.setmitte(x,y);
Kreis.malen;
end;
procedure TKreis.setradius(R: integer);
begin
 radius:=r;
end;
procedure TEllipse.setfaktor(F: integer);
begin
 Faktor:=f;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Kreis.setradius(Spinedit1.value);
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
elli.setfaktor(Spinedit2.value);
end;

end.


Könnt ihr mir noch sagen wo ich diesen Befehl einfügen muss?


Xentar - Di 22.12.09 17:58

Wo macht es denn Sinn, die Maustaste abzufragen? Vielleicht im OnMouseDown ?


Jakob_Ullmann - Di 22.12.09 18:16

Kleine Anmerkung: IMHO wäre es sinnvoller, Faktor als Single zu betrachten.


Bernd59 - Di 22.12.09 18:20

So habe es unter MouseDown eingegeben, aber es kommt immer ein Fehler
[Fehler] UnitHF.pas(99): Deklaration erwartet, aber 'IF' gefunden


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

  If Button = mbLeft
 then
  begin
  TKreis.Malen
  end
 else
  begin
  TEllipse.ellimalen
  end;


Was bedeutet IMHO und single


Jakob_Ullmann - Di 22.12.09 18:27

1. begin fehlt.
2. IMHO = in my humble opinion = meiner (bescheidenen) Meinung nach
3. Single ist ein Datentyp für Dezimalzahlen mit einfacher Genauigkeit (gibt dann noch doppelte Genauigkeit (Double) und Extended). Mit Integer kann man, wie du sicherlich weißt, nur ganze Zahlen darstellen.

EDIT: Nebenbei: das


Delphi-Quelltext
1:
2:
3:
4:
if <bedingung> then
begin
  TEllipse.Ellimalen;
end;


ist erstens nicht notwendig (bei einer Anweisung kannst du das begin-end weglassen) und zweitens geht TEllipse.ellimalen bzw. TKreis.Malen so nicht. Du müsstest halt ein konkretes Objekt der Klasse TKreis / TEllipse ansprechen. :wink:


Bernd59 - Di 22.12.09 18:37

Ja, wie muss ich dann die If Bedingung schreiben
Immer wenn ich was ausprobiere, erscheinen Fehlermeldungen


Bernd59 - Di 22.12.09 18:50


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  begin
  If Button = mbLeft
 then
  begin
  Kreis.malen;
  end
 else
  begin
  elli.malen;
  end;


Die If-Bedinung habe ich jetzt. Das Programm läuft auch aber wenn ich die rechte Maustaste drücke erscheint diese Fehlermeldung:
Im Projekt KreisObjekt. exe ist eine Exception der Klasse EAccess aufgetreten

Ausserdem markiert er mir diese Zeile im Quelltext

imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius);


Xentar - Di 22.12.09 18:59

Imi ist nichts zugewiesen, weil du SetImi nirgends aufrufst.


Bernd59 - Di 22.12.09 19:04

Hab ich gemacht.
Nun zeichnet er auch mit der rechten Maustaste aber keine Ellipse, sondern nur einen Kreis, obwohl ich bei der Ellipse es mit dem Faktor multipliziere


Xentar - Di 22.12.09 19:07

Richtig.. du multiplizierst die X sowie Y Richtung mit dem selben Faktor.
Wenn du ne Ellipse willst, musst du schon zwei verschiedene Werte nehmen.


Bernd59 - Di 22.12.09 19:13

Ich multipliziere doch nur die X Werte

imi.canvas.ellipse(xmp-radius*Faktor,ymp-radius,xmp+radius*Faktor,ymp+radius);


Xentar - Di 22.12.09 19:28

Ach, tschuldigung. Hab nur drauf geachtet, dass es zweimal *Faktor gibt.

Neuer Versuch:
Du rufst Elli.Malen auf. Nun schau mal bitte, wie die Methode richtig heißt, und welches Malen er dann wohl nimmt.


Bernd59 - Di 22.12.09 19:42

ich hab es jetzt in elli.ellimalen umgenannt
aber er zeichnet immer noch kreise und keine ellipsen


Bernd59 - Di 22.12.09 19:43


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:
123:
124:
125:
126:
127:
128:
129:
130:
131:
unit UnitHF;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Spin;
type TKreis=class(TObject)
  private
  xmp,ymp,radius: integer;
  imi    : TImage;

  public
  procedure setmitte (x,y:integer);
  procedure setImi   (im :TImage);
  procedure Malen;
  procedure setradius(r :integer);

end;
type TEllipse=class(TKreis)
  private
  Faktor :integer;
  public
  procedure setfaktor(f :integer);
  procedure ellimalen;
  procedure setmitte (x,y:integer);
  procedure setImi   (im :TImage);

end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    Image1: TImage;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
  private
    Kreis: TKreis;
    elli : TEllipse;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TKreis.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TEllipse.setmitte(x,y : integer);
begin
     xmp:=X;
     ymp:=y;
end;
procedure TKreis.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TEllipse.setimi   (im :TImage);
begin
     imi:=im;
end;
procedure TKreis.malen;

begin
 imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius);
end;

procedure TEllipse.ellimalen;
begin
imi.canvas.ellipse(xmp-radius*Faktor,ymp-radius,xmp+radius*Faktor,ymp+radius);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Kreis:=TKreis.create;
Kreis.setimi(image1);
Kreis.setradius(Spinedit1.value);
elli:=TEllipse.create;
elli.setradius(Spinedit1.value);
elli.setfaktor(Spinedit2.value);
elli.setimi(image1);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If Button = mbLeft
 then
  begin
  Kreis.malen;
  end
 else
  begin
  elli.ellimalen;
  end;

begin
Kreis.setmitte(x,y);
Kreis.malen;
end;
end;

procedure TKreis.setradius(R: integer);
begin
 radius:=r;
end;
procedure TEllipse.setfaktor(F: integer);
begin
 Faktor:=f;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Kreis.setradius(Spinedit1.value);
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
elli.setfaktor(Spinedit2.value);
end;
end.


Xentar - Di 22.12.09 19:59

Setz mal nen Haltepunkt, und schau dir die Werte an..

Außerdem weist du Radius keinen wert zu.


Bernd59 - Di 22.12.09 20:01

Radius ist ein Wert zugewiesen. In der SpinEdit1 ist er standardmäßig auf 50 gesetzt


Xentar - Mi 23.12.09 00:00

So.. man ey.
Hab nun mal das Projekt kopiert..

1. Egal welche Maustaste man drückt - du übermalst das am Ende immer mit einem Kreis (Zeile 110) Wenn du das dann noch für die ellipse richtig machst, funktioniert das auch.
2. Deine Formatierung, sowie Namensgebung ist verbesserungswürdig ;)
3. Trotzdem ändert sich der Radius der Ellipse niemals im OnChange des SpinEdit - weil du eben nur den Readius des Kreises änderst.
4. Wenn du nur selber malen möchtest, könnte man auch ne PaintBox nehmen, und im OnPaint die Methode "malen" aufrufen.