Autor Beitrag
RhoX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP

BeitragVerfasst: Mo 07.11.05 18:59 
Hi, ich hoffe ich benutze das richtige Forum
Und zwar möchte ich eine grafische Uhr programmieren, d.h. es gibt eine Klasse TUhr und eine Unit MUhr.
Benutzen soll ich einen Timer und leider auch Trigonometrie für die berechnung der Striche die vom Zeiger aus zum Mittelpunkt geführt werden sollen. Es wird also der Mittelpunkt und die Breite durch eine Eingabe vom Benutzer (oder auch im Programm selber) bestimmt woraus man dann den Radius der Uhr berechnen kann. Jetzt kommen die Probleme:
1. Brauche ich für Stunden, Minuten und Sekunden jewails einen Timer?
2. Wie berechne ich den 2. Punkt für die Linie die einen Zeiger darstellen soll?

Ich hoffe man kann dieser Darstellung in etwa folgen, danke schon mal

MfG RhoX
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mo 07.11.05 19:10 
zu 1.: Du wirst keinen eigenen Timer brauchen, du kannst einfach bei jedem Timer-Event die Uhr neu "stellen".

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 07.11.05 19:12 
Mit:

ausblenden Delphi-Quelltext
1:
2:
PX := MX + Cos(Winkel / 180 * Pi) * Radius;
PY := MY - Sin(Winkel / 180 * Pi) * Radius;


Kannst Du Punkte berechnen, die auf dem äßeren Begrenzungskreis der Uhr liegen.

Die Winkel lassen sich logisch bilden, da sag ich nix dazu ;-) und wegen dem Timer: Es reicht einer aus.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mo 07.11.05 19:27 
Und wenn der Zeiger nicht bis ganz nach außen gehen soll, nimmst du halt bei der Berechnung einen kleineren Wert als Radius.

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
RhoX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP

BeitragVerfasst: Mo 07.11.05 23:42 
Ok, danke erstmal für die antworten...jetzt stehe ich bloß noch vor dem Problem wie ich den Timer in meine MUhr Unit einbinde. Also ich will den Timer nicht über die Objektpalette ins Formeinfügen, aber anscheinend bin ich momentan vollkommen verwirrt, denn ich weiss nicht mal mehr im Ansatz wie ich diese Zeit Komponente nun integriere. ;)

Danke schon mal

MfG RhoX
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Di 08.11.05 00:28 
Wie wär's mit nach "Uhr" suchen?

www.delphi-forum.de/viewtopic.php?t=48077
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.11.05 00:55 
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 08.11.05 10:05 
user profile iconRhoX hat folgendes geschrieben:
Ok, danke erstmal für die antworten...jetzt stehe ich bloß noch vor dem Problem wie ich den Timer in meine MUhr Unit einbinde. Also ich will den Timer nicht über die Objektpalette ins Formeinfügen, aber anscheinend bin ich momentan vollkommen verwirrt, denn ich weiss nicht mal mehr im Ansatz wie ich diese Zeit Komponente nun integriere. ;)

Danke schon mal

MfG RhoX


Was soll der Quark?

Wenn schon ohne TTimer auf Formular zu ziehen (warum eigentlich :?: );

dann in FormCreate
ausblenden Delphi-Quelltext
1:
2:
3:
MyTimer := TTimer.Create (Self);
MyTimer.Enabled := True;
//MyTimer. ...usw

in FormClose
ausblenden Delphi-Quelltext
1:
MyTimer.Free					

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
RhoX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP

BeitragVerfasst: Di 08.11.05 18:53 
Ok danke erstmal, nun bin ich eigentlich der Meinung das das Programm fertig ist, es ist auch zu starten. Doch sobald man den Button zum Erzeugen der Uhr drückt wird eine "Debugger Exeption Notification" angezeigt:

Zitat:

Project dprUhr.exe raised exeption class EAccessViolation with message 'Access violation at address 00472F4F in module 'dprUhr.exe'. Read of address 00000058'. Process stopped. Use Step or Run to Continue.


Der Debugger springt an die Stelle, an der die uhr durch Klicken des Button erstellt wird:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.btErstellenClick(Sender: TObject);
begin
  Uhr1 := TUhr.create(100, 100, 100, imBild1.Canvas);
end;


Ich denke um das Problem irgendwie beheben zu können ist wohl auch noch der rest des codes erforerlich...

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

interface

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

type
  TForm1 = class(TForm)
    imBild1: TImage;
    btErstellen: TButton;
    procedure btErstellenClick(Sender: TObject);
  private
    { Private declarations }
    Uhr1: TUhr;
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.btErstellenClick(Sender: TObject);
begin
  Uhr1 := TUhr.create(100, 100, 100, imBild1.Canvas);
end;

end.


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:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
unit MUhr;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, extctrls, math, QExtCtrls;

Type
  TUhr = class(TObject)
     Protected

      zX, zXM, zY, zYM, zBreite : Integer;
      zWStd, zWMin, zWSec, zTime, zTime2, zRadius  : Real;
      zAn : Boolean;
      zZeichenfeld : TCanvas;
      hZeit: TTimer;

      procedure UhrZeichnen;virtual;
      procedure StdZeigerZeichnen;virtual;
      procedure MinZeigerZeichnen;virtual;
      procedure SecZeigerZeichnen;virtual;

    Public
       
      constructor create(zX, zY, zBreite:Integer;zZeichenFeld:TCanvas);virtual;
      destructor destroy; override;            // ???
      procedure loeschen;virtual;
      procedure hZeitTimer;virtual;
     
  end;

implementation

constructor TUhr.create;
begin
  inherited create;
  zXM := zX;
  zYM := zY;
  zRadius := zBreite div 2;
  hZeit.Enabled := true;
  hZeit.Interval := 1000;
  UhrZeichnen;
  hZeitTimer;
  zWStd := 0;
  zWMin := 0;
  zWSec := 0;
  zTime := 0;
  zTime2 := 0;
  UhrZeichnen;
  StdZeigerZeichnen;
  MinZeigerZeichnen;
  SecZeigerZeichnen;
end;

destructor TUhr.destroy;
begin
  inherited destroy;
end;

procedure TUhr.loeschen;
begin
  with zZeichenFeld do
  begin
    brush.Style := bsSolid;
    brush.Color := clWhite;
    pen.Color := clWhite;
    rectangle(zX - (zBreite div 2), zY + (zBreite div 2), zBreite, zBreite);
    pen.Color := clBlack;
  end;
end;

procedure TUhr.hZeitTimer;
begin
  SecZeigerZeichnen;
  zTime := zTime + 1000;
  zTime2 := zTime2 + 1000;
  if zTime = 60000 then
  begin
    MinZeigerZeichnen;
    zTime := 0;
  end;
  if zTime = 3600000 then
  begin
    StdZeigerZeichnen;
    zTime2 := 0;
  end;
end;

procedure TUhr.UhrZeichnen;
begin
  with zZeichenfeld do
  begin
    pen.Mode := pmNotXor;
    brush.Style := bsSolid;
    brush.Color := clWhite;
    pen.Color := clBlack;
    moveTo(zXM, zYM);
    ellipse(zXM - trunc(zRadius), zYM - trunc(zRadius), zXM + trunc(zRadius), zYM + trunc(zRadius));
    moveTo(zXM, zYM);
    lineTo(zXM, zYM - trunc(zRadius));
    moveTo(zXM, zYM);
    lineTo(zXM + trunc(cos(DegToRad(zWStd))) * trunc(zRadius), zYM - trunc(sin(DegToRad(zWStd))) * trunc(zRadius));
  end;
end;

procedure TUhr.StdZeigerZeichnen;
begin
  zWStd := zWStd + 30;
  with zZeichenfeld do
  begin
    pen.Mode := pmNotXor;
    brush.Style := bsSolid;
    brush.Color := clWhite;
    pen.Color := clBlack;
    moveTo(zXM, zYM);
    lineTo(zXM + trunc(cos(DegToRad(zWStd))) * trunc(zRadius), zYM - trunc(sin(DegToRad(zWStd))) * trunc(zRadius));
  end;
end;

procedure TUhr.MinZeigerZeichnen;
begin
  zWMin := zWMin + 6;
  with zZeichenfeld do
  begin
    pen.Mode := pmNotXor;
    brush.Style := bsSolid;
    brush.Color := clWhite;
    pen.Color := clBlack;
    moveTo(zXM, zYM);
    lineTo(zXM + trunc(cos(DegToRad(zWMin))) * trunc(zRadius), zYM - trunc(sin(DegToRad(zWMin))) * trunc(zRadius));
  end;
end;

procedure TUhr.SecZeigerZeichnen;
begin
  zWSec := zWSec + 0.1;
  with zZeichenfeld do
  begin
    pen.Mode := pmNotXor;
    brush.Style := bsSolid;
    brush.Color := clWhite;
    pen.Color := clBlack;
    moveTo(zXM, zYM);
    lineTo(zXM + trunc(cos(DegToRad(zWSec))) * trunc(zRadius), zYM - trunc(sin(DegToRad(zWSec))) * trunc(zRadius));
  end;
end;

end.


Die vorherigen bereits geschrieben Programme von euch habe ich als Hilfe benutzt, aber ich wollte am liebsten bei meiner eigenen Idee bleiben, ich hoffe der Code ist verstädnlich.

Danke schon mal

MfG
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 09.11.05 08:28 
Ich habe deine unit MUhr mal ausprobiert unf folgende Fehler/Hinweise:

(1) hZeit wird nicht Created!
(2) die Variablen bei TUhr.Create haben den gleichen Namen wie die privaten Variablenn, dies gibt immer Ärger
(3) hZeit muss auch wieder freigeben werden
(4) der Timer hat in OnTimer kein Ereignis
(5) die Zeit wird nie über Now ausgelesen
(6) Deine Zeitrechnung verstehe ich nicht, nimm mal DecodeTime + F1, da wird alles schon berechnet

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!