| Autor |
Beitrag |
RhoX
      
Beiträge: 17
Win XP
|
Verfasst: 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
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 07.11.05 19:12
Mit:
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
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: 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 
      
Beiträge: 17
Win XP
|
Verfasst: 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
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Di 08.11.05 00:28
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 08.11.05 00:55
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Di 08.11.05 10:05
RhoX 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
Delphi-Quelltext 1: 2: 3:
| MyTimer := TTimer.Create (Self); MyTimer.Enabled := True; |
in FormClose
Delphi-Quelltext
_________________ 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 
      
Beiträge: 17
Win XP
|
Verfasst: 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:
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...
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 Uhr1: TUhr; public end;
var Form1 : TForm1;
implementation
{$R *.dfm}
procedure TForm1.btErstellenClick(Sender: TObject); begin Uhr1 := TUhr.create(100, 100, 100, imBild1.Canvas); end;
end. |
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
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: 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!
|
|
|