Autor Beitrag
Huppi
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 09.09.05 16:42 
Hallo. Ich bin neu hier, und habe ein paar Fragen an die Experten hier ; )

Wir nehmen in der Schule gerade Delphi durch. Komme da eigentlich sehr gut mit, und in Zeiten wo mich die Langeweile zu Hause packt, schau ich ins Schulbuch und löse die Aufgaben dort.

Diesmal habe ich mir eine Analoge Uhr ausgesucht.
1. Es soll so sein, dass eine neue Klasse ( TUhr ) in der Unit mUhr erstellt wird
2. Die Uhr(en) sollen auf einem Imagefeld oder auf der Form selber gezeichnet werden ( mit dem ganzen Canvas-Kram ).

Dazu ein Button, der, wenn man auf ihn draufklickt, eben diese Uhren erstellt.
Es muss mit einem constructor TUhr.create gemacht werden.
Soll so geschehen, dass die Uhr gezeichnet wird, der Zeiger sich in bestimmten Intervallen um ein kleines Stück weiterdreht ( Mit einem Timer eben ). Da dachte ich mir, er zeichnet die Uhr, und bevor er sie nochmal ( den Zeiger ein kleines Stück versetzt ) zeichnet, übermalt/"löscht" er sie, mit dem Penmode PMNotXor.

Die Tips, die im Buch standen ( mit den ganzen Variablen ) habe ich schon verwendet, und das so gut wie möglich ausgebaut.

Ich weiß, das ist nicht sehr professionell, aber wie gesagt, ich bin in der Anfangsphase.

Er zeichnet erstmal einen Kreis ( mit canvas.ellipse ), startpunkt x,y, endpunkt x+2*radius,y+2*radius. Danach geht er zu dem Mittelpunkt mit canvas.moveto ( zu zXM,zYM : zXM:= x+radius, zYM:=y-radius ) und soll von da eine Linie zeichnen, die als Zeiger dient. Entweder verlassen mich meine Mathe-Kenntnisse oder es scheitert daran, dass er keine Zeichen vom Typ Real in die Lineto-Methode mit einbeziehen will.


z.Z. bin ich so weit, vielleicht habt ihr ja Lust / Zeit zu helfen.
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:
type

 TUhr = class(tobject)
  zx,zy,zbreite,zXM,zYM,zradius:integer;
  zwstd,zwmin:real;
  kcontainer:TCanvas;
  constructor create (x,y,b,radius:integer;flaeche:TCanvas);virtual;
  procedure zeichneUhr(x,y,b,radius:integer;flaeche:tcanvas);
  end;

  TForm1 = class(TForm)
    img1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  uhr:Tuhr;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}




constructor TUhr.create (x,y,b,radius:integer;flaeche:TCanvas);
begin

inherited create;
zx:=x;
zy:=y;
zbreite:=b;
kContainer:=flaeche;
zradius:=radius;
zwstd:=pi*3/2;
zwmin:=0.0;




end;


    procedure tuhr.zeichneUhr(x,y,b,radius:integer;flaeche:tcanvas);
     var neux,neuy:real;
     begin

     zxm:=x+radius;
     zym:=y+radius;
     neux:=cos(zwmin)+0.9*radius;
     neuy:=sin(zwmin)+0.8*radius;

       with kContainer do begin
       ellipse(x,y,x+2*radius,y-2*radius);
       moveto(zxm,zym);
       lineto(neux,neuy);

         end;
     end;


procedure TForm1.Button1Click(Sender: TObject);
begin

   uhr:=tuhr.create(50,50,50,25,img1.canvas);



end;

end.


Huppi


Moderiert von user profile iconChristian S.: Topic aus Sonstiges verschoben am Fr 09.09.2005 um 17:45
ManuelGS
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 173

Win XP HE, Suse Linux
D6, D7, D2005 Personal
BeitragVerfasst: Fr 09.09.05 17:19 
Ja, der will keinen Wert vom Typ real, sondern vom Typ integer;
"Umwandlung" von real zu integer geht zB. mit "round" oder "trunc".

Was habt ihr denn für ein Schulbuch, und in welcher Klassenstufe bist du? (nur interessehalber)

_________________
"Leben ist gänzlich Bühne und Spiel; so lerne denn spielen
und entsage dem Ernst - oder erdulde das Leid." - Palladas von Alexandria
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Fr 09.09.05 17:36 
Quick Hack:

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:
type
 TUhr = class
 private
  FCanvas : TCanvas;
  FBounds : TRect;
  FTimer : TTimer;

  procedure DrawClock(aCanvas : TCanvas; aBounds : TRect);
  procedure TimerEvent(Sender : TObject);
 public
  constructor Create(aCanvas : TCanvas; aBounds : TRect);
 end;


procedure TUhr.DrawClock(aCanvas : TCanvas; aBounds : TRect);

 procedure DrawPointer(aCanvas : TCanvas; aBounds : TRect;
                       aFatness : integer;
                       const aRadius,aIndex : double);
  var a,x,y : double;
      center : TPoint;
 begin
  a := aIndex*2*Pi/60;
  x := cos(a) * aRadius * (aBounds.Right-aBounds.Left) * 0.5;
  y := sin(a) * aRadius * (aBounds.Bottom-aBounds.Top) * 0.5;

  center.x := (aBounds.Left+aBounds.Right) div 2;
  center.y := (aBounds.Top+aBounds.Bottom) div 2;

  aCanvas.Pen.Width:=aFatness;
  aCanvas.MoveTo(center.x,center.y);
  aCanvas.LineTo(center.x+Round(x),center.y+Round(y));
 end;


 var hour,minute,second,msec : word;
begin
 DecodeTime(Now, hour,minute,second,msec);

 with aCanvas do
 begin
  Brush.Color := clWhite;
  FillRect(aBounds);

  Brush.Color := clBlack;
  DrawPointer(aCanvas,aBounds,3,0.5,hour);
  DrawPointer(aCanvas,aBounds,2,0.9,minute);
  DrawPointer(aCanvas,aBounds,1,1,second);
 end;
end;

procedure TUhr.TimerEvent(Sender : TObject);
begin
 if Assigned(FCanvas) then
  DrawClock(FCanvas,FBounds);
end;

constructor TUhr.Create(aCanvas : TCanvas; aBounds : TRect);
begin
 inherited Create;

 FCanvas := aCanvas;
 FBounds := aBounds;

 FTimer:=TTimer.Create(NIL);
 with FTimer do
 begin
  OnTimer := TimerEvent;
  Interval := 1000;
  Enabled := true;
 end;

 TimerEvent(self);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 TUhr.Create(Canvas,rect(100,100,300,300));
end;
Huppi Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 09.09.05 18:11 
Danke so weit.

Ich bin in Stufe 12.
Wir benutzen das Buch "Objektorientierte Programmierung mit Delphi", Band 2 "Delphi-Klassen entwickeln" von Damann/Wemßen
ManuelGS
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 173

Win XP HE, Suse Linux
D6, D7, D2005 Personal
BeitragVerfasst: Fr 09.09.05 18:18 
Danke für die Info. Scheint mir fast so, als würde das Buch etwas taugen!!

_________________
"Leben ist gänzlich Bühne und Spiel; so lerne denn spielen
und entsage dem Ernst - oder erdulde das Leid." - Palladas von Alexandria
Huppi Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 09.09.05 18:46 
Na dann ist ja gut

Wenn's dich interessiert, davor haben wir ein "Notizzettelprogramm" geschrieben, bei dem man 4 Buttons auf dem Formular hatte, Zettel erstellen -> Caption eingeben, Nachricht eingeben.

Die Zettel konnte man dann später wieder aufrufen, Löschen oder bearbeiten.
Das ganze lief dann über die Komponentenliste ( Mit Componentcount usw. )