Autor Beitrag
Bernd59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 22.12.09 18:16 
Kleine Anmerkung: IMHO wäre es sinnvoller, Faktor als Single zu betrachten.
Bernd59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 22.12.09 18:37 
Ja, wie muss ich dann die If Bedingung schreiben
Immer wenn ich was ausprobiere, erscheinen Fehlermeldungen
Bernd59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 22.12.09 18:50 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 22.12.09 18:59 
Imi ist nichts zugewiesen, weil du SetImi nirgends aufrufst.

_________________
PROGRAMMER: A device for converting coffee into software.
Bernd59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 22.12.09 19:42 
ich hab es jetzt in elli.ellimalen umgenannt
aber er zeichnet immer noch kreise und keine ellipsen
Bernd59 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 22.12.09 19:43 
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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 22.12.09 20:01 
Radius ist ein Wert zugewiesen. In der SpinEdit1 ist er standardmäßig auf 50 gesetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.