Entwickler-Ecke

Sonstiges (Delphi) - kreis zeichnen


navarro2010 - So 13.03.11 19:50
Titel: kreis zeichnen
wie kann ich einen kreis zeichnen lassen? ich möchte diesen kreis auf einem image feld zeichen lassen und wollte es erst mit einer ellipse veruschen, bin dann aber nicht weitergekommen. vielleicht kann mir jemand weiterhelfen?


jaenicke - So 13.03.11 19:54

Wenn du eine Ellipse mit derselben Breite wie Höhe zeichnest, ist das ein Kreis. Das ist also schon richtig.

Wie hast du es denn versucht?


navarro2010 - So 13.03.11 19:59


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:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    ColorDialog1: TColorDialog;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Panel1: TPanel;
    OpenButton: TSpeedButton;
    SaveButton: TSpeedButton;
    NewButton: TSpeedButton;
    ComboBox2: TComboBox;
    ComboBox1: TComboBox;
    PenButton: TSpeedButton;
    LineButton: TSpeedButton;
    RectButton: TSpeedButton;
    CircleButton: TSpeedButton;
    EllipseButton: TSpeedButton;
    PenColorButton: TSpeedButton;
    BrushColorButton: TSpeedButton;
    xButton: TSpeedButton;
    yButton: TSpeedButton;
    ExitButton: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure PenButtonClick(Sender: TObject);
    procedure LineButtonClick(Sender: TObject);
    procedure RectButtonClick(Sender: TObject);
    procedure CircleButtonClick(Sender: TObject);
    procedure EllipseButtonClick(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure PenColorButtonClick(Sender: TObject);
    procedure BrushColorButtonClick(Sender: TObject);
    procedure OpenButtonClick(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
    procedure NewButtonClick(Sender: TObject);
    procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ComboBox2DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ExitButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var Grafikart:   Integer;
    Stiftart:    TPenStyle;
    Pinselart:   TBrushStyle;
    Zeichnen:    Boolean;
    Stiftfarbe, Pinselfarbe: TColor;
    x0,y0,x1,y1: LongInt;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Grafikart:=1;
  Stiftfarbe:=clBlack;       
  Pinselfarbe:=clBlack;      
  Stiftart:=psSolid;         
  Pinselart:=bsClear;        
  Image1.Canvas.Pen.Color:=Stiftfarbe;
end;

procedure TForm1.PenButtonClick(Sender: TObject);
begin
  Grafikart:=1;
end;

procedure TForm1.LineButtonClick(Sender: TObject);
begin
  Grafikart:=2;
end;

procedure TForm1.RectButtonClick(Sender: TObject);
begin
  Grafikart:=3;
end;

procedure TForm1.CircleButtonClick(Sender: TObject);
begin
  Grafikart:=4;
end;

procedure TForm1.EllipseButtonClick(Sender: TObject);
begin
  Grafikart:=5;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Zeichnen:=True;                      
  x0:=X; y0:=Y;                        
  with Image1.Canvas do
    begin
      Pen.Color:=Stiftfarbe;
      Pen.Style:=Stiftart;
      Brush.Color:=Pinselfarbe;
      Brush.Style:=Pinselart;              
      MoveTo(X,Y);
      if Grafikart=1 then
        Pen.Mode:=pmCopy               //pmCopy - Stiftfarbe von Color
      else
        Pen.Mode:=pmNotXor;            // pmNotXor - Umkehren bzw löschen
    end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Zeichnen then
    with Image1.Canvas do
      begin
        Case Grafikart of
          1:  Image1.Canvas.LineTo(x,y);// hier zeichnen wir eine Linie zu X und Y, die in der Prozedur enthalten sind
          2begin
               //hier musst du etwas sinnvolles einfügen, wie auch bei 3,4,5
             end;
          3: Image1.Canvas.Rectangle(x,y,x,y);   
          4: Image1.Canvas.Ellipse(x,y,x,y);  //hieraus soll der kreis werden
          5: Image1.Canvas.Ellipse(x,y,x,y);
        end;
        x1:=x;       
        y1:=y;       
      end;           
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Zeichnen:=False;
  with Image1.Canvas do
    begin
      Pen.Mode:=pmCopy;    //pmCopy heißt, dass jetzt die Stiftfarbe aus dem DIalog verwendet wird
      Case grafikart of
        2: LineTo(x,y); //wie schon oben, musst du jetzt die richtigen Befehle zum Zeichnen geben.
        3: Rectangle(x0,y0,x1,y1);
        4: Ellipse(x0,y0,x1,y1);  //wie kann ich hier den kreis zeichnen lassen???
        5: Ellipse(x0,y0,x1,y1);
      end;
    end;
end;


jaenicke - So 13.03.11 20:08

Nun, was du machen möchtest ist ja eine Ellipse mit gleichen Seitenlängen zu zeichnen. Das heißt, du musst dir die Seitenlänge berechnen und die dann in beide Richtungen benutzen.

Am sinnvollsten dürfte für eine Mausauswahl sein, wenn du die kleinere der beiden Ausdehnungen benutzt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses
  Math;

var
  CircleDiameter: Integer;
begin
  CircleDiameter := Min(x1 - x0, y1 - y0);
  Ellipse(x0, y0, x0 + CircleDiameter, y0 + CircleDiameter);


navarro2010 - So 13.03.11 20:15

erst einaml vielen dank für deine hilfe. aber wie und wo kann ich deinen vorschlag in mein programm einfügen?


elundril - So 13.03.11 20:16

Dort wo du halt den Kreis zeichnen willst. Ist ja nicht so schwer rauszufinden, immerhin hast du den Rest ja auch alleine geschafft.

lg elundril


navarro2010 - So 13.03.11 20:22

wenn ich min eingebe, kommt eine fehlermeldung undefinierter benutzer.


jaenicke - So 13.03.11 20:23

Du hast da etwas überlesen...
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
uses
  Math;
Die Unit Math muss in die uses-Klausel.


navarro2010 - So 13.03.11 20:33

ich hab des jetzt mal soweit eingefüg. leider bekomm ich immer noch nicht einen kreis.

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:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    ColorDialog1: TColorDialog;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Panel1: TPanel;
    OpenButton: TSpeedButton;
    SaveButton: TSpeedButton;
    NewButton: TSpeedButton;
    ComboBox2: TComboBox;
    ComboBox1: TComboBox;
    PenButton: TSpeedButton;
    LineButton: TSpeedButton;
    RectButton: TSpeedButton;
    CircleButton: TSpeedButton;
    EllipseButton: TSpeedButton;
    PenColorButton: TSpeedButton;
    BrushColorButton: TSpeedButton;
    xButton: TSpeedButton;
    yButton: TSpeedButton;
    ExitButton: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure PenButtonClick(Sender: TObject);
    procedure LineButtonClick(Sender: TObject);
    procedure RectButtonClick(Sender: TObject);
    procedure CircleButtonClick(Sender: TObject);
    procedure EllipseButtonClick(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure PenColorButtonClick(Sender: TObject);
    procedure BrushColorButtonClick(Sender: TObject);
    procedure OpenButtonClick(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
    procedure NewButtonClick(Sender: TObject);
    procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ComboBox2DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ExitButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var Grafikart:   Integer;
    Stiftart:    TPenStyle;
    Pinselart:   TBrushStyle;
    Zeichnen:    Boolean;
    Stiftfarbe, Pinselfarbe: TColor;
    x0,y0,x1,y1: LongInt;
    CircleDiameter: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Grafikart:=1;
  Stiftfarbe:=clBlack;       //schwarz
  Pinselfarbe:=clBlack;      //schwarz
  Stiftart:=psSolid;         //undurchsichtig
  Pinselart:=bsClear;        //durchsichtig
  Image1.Canvas.Pen.Color:=Stiftfarbe;
end;

procedure TForm1.PenButtonClick(Sender: TObject);   //Zeichenwerkzeuge 1-5
begin
  Grafikart:=1;
end;

procedure TForm1.LineButtonClick(Sender: TObject);
begin
  Grafikart:=2;
end;

procedure TForm1.RectButtonClick(Sender: TObject);
begin
  Grafikart:=3;
end;

procedure TForm1.CircleButtonClick(Sender: TObject);
begin
  Grafikart:=4;
end;

procedure TForm1.EllipseButtonClick(Sender: TObject);
begin
  Grafikart:=5;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Zeichnen:=True;                      //jetzt wird gezeichnet
  x0:=X; y0:=Y;                        //Startpunkt
  x1:=X; y1:=Y;                        //Endpunkt - wird geändert bei Bewegung
  with Image1.Canvas do
    begin
      Pen.Color:=Stiftfarbe;
      Pen.Style:=Stiftart;
      Brush.Color:=Pinselfarbe;
      Brush.Style:=Pinselart;              
      MoveTo(X,Y);
      if Grafikart=1 then
        Pen.Mode:=pmCopy               //pmCopy - Stiftfarbe von Color
      else
        Pen.Mode:=pmNotXor;            // pmNotXor - Umkehren bzw löschen
    end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Zeichnen then
    with Image1.Canvas do
      begin
        Case Grafikart of
          1:  Image1.Canvas.LineTo(x,y);// hier zeichnen wir eine Linie zu X und Y, die in der Prozedur enthalten sind
          2begin
               //hier musst du etwas sinnvolles einfügen, wie auch bei 3,4,5
             end;
          3: Image1.Canvas.Rectangle(x,y,x,y);   // Viereck.1.Versuch,noch Fehler!
          4: Image1.Canvas.Ellipse(x,y,x,y);
          5: Image1.Canvas.Ellipse(x,y,x,y);
        end;
        x1:=x;       //hier wird nach jeder Mausbewegung die X-Position der Maus gespeichert
        y1:=y;       //hier die Y-Position -> zusammen mit pmNotXor kann damit ein löschen des
      end;           //letzten Zeichenschrittes bewirkt werden.
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Zeichnen:=False;
  CircleDiameter := Min(x1 - x0, y1 - y0);
  with Image1.Canvas do
    begin
      Pen.Mode:=pmCopy;    //pmCopy heißt, dass jetzt die Stiftfarbe aus dem DIalog verwendet wird
      Case grafikart of
        2: LineTo(x,y); //wie schon oben, musst du jetzt die richtigen Befehle zum Zeichnen geben.
        3: Rectangle(x0,y0,x1,y1);
        4: Ellipse(x0, y0, x1 + CircleDiameter, y1 + CircleDiameter);
        5: Ellipse(x0,y0,x1,y1);
      end;
    end;
end;


jaenicke - So 13.03.11 20:35

Naja, zumindest kopieren müsste man halt können... :roll: Nimm dir ein Beispiel an Guttenberg...
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  Ellipse(x0, y0, x0 + CircleDiameter, y0 + CircleDiameter);                    

user profile iconnavarro2010 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
        4: Ellipse(x0, y0, x1 + CircleDiameter, y1 + CircleDiameter);                    


navarro2010 - So 13.03.11 20:38

auja, danke für den hinweis und für deine hilfe!!!!!


Boldar - Mo 14.03.11 00:08

Übrigens wäre deine Grafikart Variable ein Fall für eine enumeration.
http://www.christian-stelzmann.de/index_tutorials_crashkurs.html