Entwickler-Ecke

Sonstiges (Delphi) - Analoge Uhr


bLubZo_0r - Di 10.03.09 00:55
Titel: Analoge Uhr
Huhu jungs ich habe mal eine frage und zwar habe ich bisher folgendes pogrammiert :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//Minutenzeiger ################################################################
pen.Width := 2;
pen.color := clwhite;
x_pt := 250 + round (200*cos((sekpos*0.1+90)*pi/180.0));
y_pt := 250 - round (200*sin((sekpos*0.1+90)*pi/180.0));
moveto(250,250);
lineto(x_pt,y_pt);
brush.Color := clblack;
winkel := tim_sekpos.tag *0.1/-180*pi;
x := round(sin(winkel)*150);
y := -round(cos(winkel)*150);
pbx_uhr.Canvas.Rectangle(x+240,y+240,x+260,y+260);


Es läuft alles wunderbar :D aber ich wollte halt das die zeiger sich an die systemzeit anpassen =) aber wie ?

Hab mir gedacht das ihr mir weiterhelfen könnt :D

TY schon mal im vorraus.... :shock:

Moderiert von user profile iconChristian S.: Highlight- durch Delphi-Tags ersetzt


jaenicke - Di 10.03.09 01:14

Bitte benutze delphi-Tags statt highlight-Tags, du siehst doch wie das so aussieht, wie soll man da etwas lesen können? ;-)

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG84bc4f2dd1d6116b630ebf5fd2fda82f}</span></span>                    
user profile iconbLubZo_0r hat folgendes geschrieben Zum zitierten Posting springen:
Es läuft alles wunderbar :D aber ich wollte halt das die zeiger sich an die systemzeit anpassen =) aber wie ?
Dann benutzt du doch bereits Werte. Du weißt also wie du zu bestimmten Werten die Anzeige machst, oder?

Also wo ist das Problem? Beim Ermitteln der Sekunden usw. aus der Systemzeit?

Delphi-Quelltext
1:
2:
3:
4:
5:
uses
  DateUtils;

// und dann:
SecondsOf(now)


bLubZo_0r - Di 10.03.09 01:32

Also das Problem ist das ich die schon vorhandenen Zeiger (Sek,Min,Std) habe. Aber ich will sie mit der Systemzeit verbinden, so dass ich in den Zeigern die aktuelle Systemzeit lesen kann. Der aktuelle QT sieht so aus

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:
unit UhrUnit1;

interface

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

type
  TUhrForm = class(TForm)
    pbx_uhr: TPaintBox;
    tim_sekpos: TTimer;
    lbl_zeit: TLabel;
    procedure pbx_uhrClick(Sender: TObject);
    procedure pbx_uhrPaint(Sender: TObject);
    procedure tim_sekposTimer(Sender: TObject);
  private
    procedure zeigezeit(sekpos: integer);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  UhrForm: TUhrForm;
  sek,min,std : array [0..3of TPoint;
implementation

{$R *.dfm}

procedure TUhrForm.pbx_uhrClick(Sender: TObject);
begin
if (tim_sekpos.enabled = false) then tim_sekpos.enabled := true
                                else tim_sekpos.enabled := false;
end;

procedure TUhrForm.zeigezeit(sekpos: integer);
var y_pt, x_pt, x, y :integer;
    winkel           :double;
begin
with  pbx_uhr.canvas do
begin
pen.Color := clblack;
brush.color := clblack;
ellipse(20,20,480,480);
font.Color := claqua;
font.Size := 23;
textout(233,-8,'12');
textout(480,230,'3');
textout(240,468,'6');
textout(1,230,'9');
// Sekundenzeiger ##############################################################
tim_sekpos.tag := tim_sekpos.tag *1;
pbx_uhr.Canvas.pen.Width := 1;
pbx_uhr.Canvas.pen.Color   := claqua;
pbx_uhr.Canvas.brush.Color := clblack;
sek[0].X :=250;
sek[0].Y :=250;
sek[1].X :=250+round(160*sin((-4.0+tim_sekpos.tag*6) *pi/-180));
sek[1].Y :=250-round(160*cos((-4.0+tim_sekpos.tag*6) *pi/-180));
sek[2].X :=250+round(220*sin((     tim_sekpos.tag*6)  *pi/-180));
sek[2].Y :=250-round(220*cos((     tim_sekpos.tag*6)  *pi/-180));
sek[3].X :=250+round(160*sin(( 4.0+tim_sekpos.tag*6) *pi/-180));
sek[3].Y :=250-round(160*cos(( 4.0+tim_sekpos.tag*6) *pi/-180));
pbx_uhr.Canvas.polygon(sek);
{pen.Width := 1;
pen.color := claqua;
x_pt := 250 + round (220*cos((sekpos*6.0+90)*pi/180.0));
y_pt := 250 - round (220*sin((sekpos*6.0+90)*pi/180.0));
moveto(250,250);
lineto(x_pt,y_pt);
brush.Color := clblack;
winkel := tim_sekpos.tag *6/-180*pi;
x := round(sin(winkel)*180);
y := -round(cos(winkel)*180);
ellipse(x+240,y+240,x+260,y+260);}

//Minutenzeiger ################################################################
pen.Width := 2;
pen.color := clwhite;
x_pt := 250 + round (200*cos((sekpos*0.1+90)*pi/180.0));
y_pt := 250 - round (200*sin((sekpos*0.1+90)*pi/180.0));
moveto(250,250);
lineto(x_pt,y_pt);
brush.Color := clblack;
winkel := tim_sekpos.tag *0.1/-180*pi;
x := round(sin(winkel)*150);
y := -round(cos(winkel)*150);
pbx_uhr.Canvas.Rectangle(x+240,y+240,x+260,y+260);
// Stundenzeiger ###############################################################
pen.Width := 3;
pen.color := clblue;
x_pt := 250 + round (180*cos((sekpos*0.0083+90)*pi/180.0));
y_pt := 250 - round (180*sin((sekpos*0.0083+90)*pi/180.0));
moveto(250,250);
lineto(x_pt,y_pt);
brush.Color := clblack;
winkel := tim_sekpos.tag *0.0083/-180*pi;
x := round(sin(winkel)*120);
y := -round(cos(winkel)*120);
ellipse(x+240,y+240,x+260,y+260);
end;
end;

procedure TUhrForm.pbx_uhrPaint(Sender: TObject);
var wg, wb, rd, x_gr, y_gr              : extended;
    i, x_pt, y_pt, x, y                 : integer;
    winkel                              : double;
begin
with pbx_uhr.canvas do
begin
// Inistalisierung #############################################################
brush.color := clblack;
ellipse(0,0,499,499);
wg   := 0.0;
wb   := 0.0;
rd   := 240.0;
x_gr := 0;
y_gr := 0;
x_pt := 0;
y_pt := 0;
pen.Width := 3;
pen.color := cllime;
brush.color := cllime;
// Bogenmaßberechnung ##########################################################
for i := 0 to 59 do
  begin
  wg   := i*6.0;
  wb   := wg*pi/180.0;
  x_gr := rd*cos(wb);
  y_gr := rd*sin(wb);
  x_pt := 250 + round(x_gr);
  y_pt := 250 - round(y_gr);
  // Zeichen der Makierungen ###################################################
    if (i mod 5 = 0)
    then ellipse (x_pt-5,y_pt-5,x_pt+5,y_pt+5)
    else ellipse (x_pt-1,y_pt-1,x_pt+1,y_pt+1);
    end;
    zeigezeit(0);
    end;
    end;
procedure TUhrForm.tim_sekposTimer(Sender: TObject);
begin
// DigitalUhr ##################################################################
lbl_zeit.Caption := FormatDateTime('hh:nn:ss                                 dd.mm.yyyy',+now);
//lbl_zeit.caption := TimeToStr(now)+' Uhr';
tim_sekpos.tag := tim_sekpos.tag -1;
if (tim_sekpos.tag = 60then tim_sekpos.tag := 0;
zeigezeit(tim_sekpos.tag);
end;
end.


TY im vorraus


jaenicke - Di 10.03.09 01:38

user profile iconbLubZo_0r hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
if (tim_sekpos.enabled = false) then                    
Der Vergleich mit Booleanwerten (z.B. if x = true then) ist nicht nur unschön und unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/
Richtig wäre es in deinem Fall so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TUhrForm.pbx_uhrClick(Sender: TObject);
begin
  if not tim_sekpos.Enabled then
    tim_sekpos.Enabled := true
  else
    tim_sekpos.Enabled := false;
end;
Oder direkt so:

Delphi-Quelltext
1:
2:
3:
4:
procedure TUhrForm.pbx_uhrClick(Sender: TObject);
begin
  im_sekpos.Enabled := not tim_sekpos.Enabled;
end;


Jetzt zu dem anderen Problem:
Ich habe oben ja bereits geschrieben wie du die Sekunden bekommst. Genauso geht es mit Minuten und Stunden. Eine Sekunde entspricht 360/60 = 6 Grad. Das heißt du multiplizierst den Sekundenwert mit 6 um den Winkel in Grad zu erhalten.
Analog entspricht eine Stunde 360/12 = 30 Grad.