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 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
Narses: 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); imi.canvas.ellipse(xmp-radius,ymp-radius,xmp+radius,ymp+radius); |
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
Narses: 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
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
Narses: 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 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 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 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
Narses: 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
Narses: 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
Narses: 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 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 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!