| Autor |
Beitrag |
Huppi
Hält's aus hier
Beiträge: 3
|
Verfasst: 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.
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; public 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 Christian S.: Topic aus Sonstiges verschoben am Fr 09.09.2005 um 17:45
|
|
ManuelGS
      
Beiträge: 173
Win XP HE, Suse Linux
D6, D7, D2005 Personal
|
Verfasst: 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
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Fr 09.09.05 17:36
Quick Hack:
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 
Hält's aus hier
Beiträge: 3
|
Verfasst: 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
      
Beiträge: 173
Win XP HE, Suse Linux
D6, D7, D2005 Personal
|
Verfasst: 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 
Hält's aus hier
Beiträge: 3
|
Verfasst: 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. )
|
|
|