| Autor |
Beitrag |
Bernd59 
      
Beiträge: 18
|
Verfasst: 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
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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 22.12.09 17:58
Wo macht es denn Sinn, die Maustaste abzufragen? Vielleicht im OnMouseDown ?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 22.12.09 18:16
Kleine Anmerkung: IMHO wäre es sinnvoller, Faktor als Single zu betrachten.
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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. 
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: Di 22.12.09 18:37
Ja, wie muss ich dann die If Bedingung schreiben
Immer wenn ich was ausprobiere, erscheinen Fehlermeldungen
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 22.12.09 18:59
Imi ist nichts zugewiesen, weil du SetImi nirgends aufrufst.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: Di 22.12.09 19:42
ich hab es jetzt in elli.ellimalen umgenannt
aber er zeichnet immer noch kreise und keine ellipsen
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: Di 22.12.09 19:43
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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 22.12.09 19:59
Setz mal nen Haltepunkt, und schau dir die Werte an..
Außerdem weist du Radius keinen wert zu.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Bernd59 
      
Beiträge: 18
|
Verfasst: Di 22.12.09 20:01
Radius ist ein Wert zugewiesen. In der SpinEdit1 ist er standardmäßig auf 50 gesetzt
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
|