AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Analoguhr

Ein Thema von MrFish · begonnen am 25. Apr 2004 · letzter Beitrag vom 11. Mai 2007
Antwort Antwort
Seite 3 von 5     123 45   
MrFish
Registriert seit: 16. Jul 2003
Ich habe ein Programm für eine Analoguhr geschrieben.
Es ist nur eine Übung gewesen, da ich noch Anfänger bin und mir Delpi selber beibringe.
Ich würde mich freuen wenn ihr mal drüberschaut und sagt was ihr davon haltet.
Delphi-Quellcode:
 unit Uhr;

interface

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

type
  TAnaloguhr = class(TForm)
    Edit1: TEdit;
    Uhr: TTimer;
    procedure UhrTimer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Analoguhr: TAnaloguhr;
  SecWinkel : integer;
  MinWinkel : Integer;
  StdWinkel : Integer;
  SecWinkelAlt : integer;
  MinWinkelAlt : integer;
  StdWinkelAlt : integer;
  Zeit : String;
  XPos : integer;
  YPos : Integer;
  Std : Integer;
  Min : Integer;
  Sec : Integer;


implementation

{$R *.dfm}

procedure TAnaloguhr.UhrTimer(Sender: TObject);


begin
{---------------Systemzeit auslesen und zuweisen -------------------}

Zeit := TimeToStr(Time);
Edit1.Text := Zeit;
Std := StrToInt(Copy(Zeit,1,2));
Min := StrToInt(Copy(Zeit,4,2));
Sec := StrToInt(Copy(Zeit,7,2));

{-------------Zeigerwinkel berechnen--------------------------------}

SecWinkel := (( 6 * Sec)+90);
MinWinkel := (( 6 * Min)+90);
StdWinkel := ((30 * Std)+90);

{------------Zeiger Löschen-----------------------------------------}
{-------------Sekunde-----------------------------------------------}

XPos := Trunc (cos(SecWinkelAlt * Pi /180) *(-100));
YPos := Trunc (sin(SecWinkelAlt * Pi /180) *(-100));

Canvas.MoveTo(150,150);
Canvas.Pen.Color := clBtnFace;
Canvas.Pen.Width := 1;
Canvas.LineTo((XPos + 150),(YPos + 150));

{--------------Minuten---------------------------------------------}

XPos := Trunc (cos(MinWinkelAlt * Pi /180) *(-100));
YPos := Trunc (sin(MinWinkelAlt * Pi /180) *(-100));

Canvas.MoveTo(150,150);
Canvas.Pen.Color := clBtnFace;
Canvas.Pen.Width := 3;
Canvas.LineTo((XPos + 150),(YPos + 150));

{--------------Stunde----------------------------------------------}

XPos := Trunc (cos(StdWinkelAlt * Pi /180) *(-80));
YPos := Trunc (sin(StdWinkelAlt * Pi /180) *(-80));

Canvas.MoveTo(150,150);
Canvas.Pen.Color := clBtnFace;
Canvas.Pen.Width := 3;
Canvas.LineTo((XPos + 150),(YPos + 150));


{-------------Zeiger Zeichnen---------------------------------------}
{-------------Sekunde-----------------------------------------------}

XPos := Trunc (cos(SecWinkel * Pi /180) *(-100));
YPos := Trunc (sin(SecWinkel * Pi /180) *(-100));

Canvas.MoveTo(150,150);
Canvas.Pen.Color := 0;
Canvas.Pen.Width := 1;
Canvas.LineTo((XPos + 150),(YPos + 150));

{--------------Minuten---------------------------------------------}

XPos := Trunc (cos(MinWinkel * Pi /180) *(-100));
YPos := Trunc (sin(MinWinkel * Pi /180) *(-100));

Canvas.MoveTo(150,150);
Canvas.Pen.Color := 0;
Canvas.Pen.Width := 3;
Canvas.LineTo((XPos + 150),(YPos + 150));

{--------------Stunde----------------------------------------------}

XPos := Trunc (cos(StdWinkel * Pi /180) *(-80));
YPos := Trunc (sin(StdWinkel * Pi /180) *(-80));

Canvas.MoveTo(150,150);
Canvas.Pen.Color := 0;
Canvas.Pen.Width := 3;
Canvas.LineTo((XPos + 150),(YPos + 150));

{------------Alte Winkel Zwischenspeichern-------------------------}

SecWinkelAlt := SecWinkel;
MinWinkelAlt := MinWinkel;
StdWinkelAlt := StdWinkel;


end;

end.


Dank
Gruß MrFish
Es gibt zwei unbestreitbare Tatsachen: 1. Ich irre mich nie. 2. Die Welt ist eine Scheibe.
 
MrKnogge

 
Delphi 2007 Professional
 
#21
  Alt 27. Apr 2004, 18:05
Also ich hab sie ir mal angesehen, man könnt zwar die ein oder andere kleinigkeit verbessern (glätten), aberfür den Anfang find ichs klasse
Christian Bootz
  Mit Zitat antworten Zitat
MrFish

 
Delphi 7 Personal
 
#22
  Alt 27. Apr 2004, 23:52
@XeRo
Ich bin dir nicht böse, sondern ich danke dir.

@MrKnogge
Das tut gut!

Ich werde die Tips von euch umsetzen und das ganz noch mal schicken.
Danke noch mal an alle. Bei der Hilfe macht das lernen Spaß.

Gruß MrFish
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#23
  Alt 28. Apr 2004, 06:16
Ich finde das irgendwie nicht so schön deinen Spaghetti-Code da. Du hast da ja im Prinzip immer wiederkehrenden Code zum Zeichnen der Zeiger nur mit anderen Winkeln und Längen. Schreib eine Prozedur dafür, der du die entsprechenden Werte als Parameter übergibst. So hast du keinen reduntanten Code. Siehe dazu meine Prozeduren ClearHands und PaintHands. Die hätte man auch noch zusammenfassen können, in dem man eine boolsche Variable mitgibt, die bestimmt, ob gezeichnet oder gelöscht werden soll.
Und durch das Zeichen auf das Bitmap im Speicher und das Kopieren des Bitmaps in OnPaint der Paintbox auf den Canvas der Paintbox, sind die Zeiger auch sofort wieder da, wenn das Fenster überdeckt wird und nicht erst nach einer Sekunde wieder, wenn bei dir der Timer ausgelöst wird.

Ich würde es so lösen:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
    OldHrs, OldMins, OldSecs: Integer;
    BackBitmap: TBitmap; // Bitmap im Speicher zum Zeichnen
    procedure ClearHands(Start: TPoint; Angle, Len: Integer);
    procedure PaintHands(start: TPoint; Angle, Len: Integer);
  public
    { Public declarations }
  end;

const
  RADIUS = 100;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

uses
  Math;

{------------------------------------------------------------------------------}
{  Zeiger löschen                                                              }
{------------------------------------------------------------------------------}
procedure TForm1.ClearHands(Start: TPoint; Angle, Len: Integer);
var
  EndPos : TPoint;
begin
  // Anfangspunkt in die Mitte des Bitmaps setzten
  BackBitmap.Canvas.Pen.Color := clWhite;
  // Zeiger neu zeichnen
  EndPos.X := Trunc(sin(DegToRad(Angle)) * (RADIUS+Len));
  EndPos.Y := Trunc(cos(DegToRad(Angle)) * -(RADIUS+Len));
  BackBitmap.Canvas.MoveTo(Start.X, Start.Y);
  BackBitmap.Canvas.LineTo(Start.X+EndPos.X, Start.Y+EndPos.Y);
end;

{------------------------------------------------------------------------------}
{  Zeiger zeichnen                                                             }
{------------------------------------------------------------------------------}
procedure TForm1.PaintHands(Start: TPoint; Angle, Len: Integer);
var
  EndPos : TPoint;
begin
  // Anfangspunkt in die Mitte des Bitmaps setzten
  BackBitmap.Canvas.Pen.Color := clBlack;
  // Zeiger neu zeichnen
  EndPos.X := Trunc(sin(DegToRad(Angle)) * (RADIUS+Len));
  EndPos.Y := Trunc(cos(DegToRad(Angle)) * -(RADIUS+Len));
  BackBitmap.Canvas.MoveTo(Start.X, Start.Y);
  BackBitmap.Canvas.LineTo(Start.X+EndPos.X, Start.Y+EndPos.Y);
end;

{------------------------------------------------------------------------------}
{  Winkel der Zeiger berechnen                                                 }
{------------------------------------------------------------------------------}
procedure CalcAngels(var hrs, mins, secs, msec: Word);
begin
  DecodeTime(Time, hrs, mins, secs, msec);
  secs := secs * 6;
  mins := mins * 6;
  hrs := hrs * 30;
end;

{------------------------------------------------------------------------------}
{  Form erzeugen                                                               }
{------------------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  // Bitmap im Speicher erzeugen
  BackBitmap := TBitmap.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Bitmap im Speicher wieder freigeben
  FreeAndNil(BackBitmap);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  hrs, mins,
    secs, msec : Word;
  Start : TPoint;
begin
  // Zeit zur Kontrolle mitlaufen lassen
  Caption := TimeToStr(Time);

  // Größe des Bitmaps an die Größe der Paintbox (Align := alClient anpassen
  BackBitmap.Width := Paintbox1.Width;
  BackBitmap.Height := Paintbox1.Height;

  // Startpunkt berechnen (soll immer in der Mitte der Paintbox sein
  Start.X := Paintbox1.Width div 2;
  Start.Y := Paintbox1.Height div 2;

  // Winkel berechnen
  CalcAngels(hrs, mins, secs, msec);

  // Zeiger löschen
  ClearHands(Start, OldSecs, Paintbox1.Height div 2 div 2 - 40);
  // Zeiger zeichnen
  PaintHands(Start, secs, Paintbox1.Height div 2 div 2 - 40);
  // alten Winkel merken
  OldSecs := secs;

  ClearHands(Start, OldMins, Paintbox1.Height div 2 div 3 - 50);
  PaintHands(Start, mins, Paintbox1.Height div 2 div 3 - 50);
  OldMins := mins;

  ClearHands(Start, OldHrs, Paintbox1.Height div 2 div 6 - 60);
  PaintHands(Start, hrs, Paintbox1.Height div 2 div 6 - 60);
  OldHrs := hrs;

  // Neuzeichnen der Paintbox auslösen
  Paintbox1.Repaint;
end;

{------------------------------------------------------------------------------}
{  OnPaint der Paintbox                                                        }
{  Bitmap im Speicher auf die Paintbox kopieren                                }
{------------------------------------------------------------------------------}
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  BitBlt(Paintbox1.Canvas.Handle, 0, 0, Paintbox1.Width, Paintbox1.Height,
    BackBitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;

{------------------------------------------------------------------------------}
{  Größe des Bitmap im Speicher auf null setzen                                }
{------------------------------------------------------------------------------}
procedure TForm1.FormResize(Sender: TObject);
begin
  BackBitmap.Width := 0;
  BackBitmap.Height := 0;
end;
Damit wird auch die Uhr immer in der Mitte gezeichnet und die Zeiger passen immer drauf. Im Anhang noch mal das ganze Projekt.
Angehängte Dateien
Dateityp: zip analog_uhr.zip (188,9 KB, 161x aufgerufen)
Michael
  Mit Zitat antworten Zitat
MrFish

 
Delphi 7 Personal
 
#24
  Alt 8. Mai 2004, 00:29
@Luckie

Das ist ja wahnsinn was du dir für eine Mühe gemacht hast.
Ich habe deinen Source durchgearbeitet und viel dabei gelernt.

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#25
  Alt 8. Mai 2004, 01:42
War nicht viel Mühe. War im Prinzip in einer halben Stunde fertig, danach noch etwas Kosmetik und ein zwei Bugs ausmerzen, das war schon alles.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus
 
#26
  Alt 8. Mai 2004, 03:50
@Luckie: Sauberer Code, aber der Kreis um die Uhr fehlt immer noch :lol
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#27
  Alt 8. Mai 2004, 04:23
Zitat von alcaeus:
@Luckie: Sauberer Code, aber der Kreis um die Uhr fehlt immer noch :lol
Dazu war ich zu faul, aber mach du das doch.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus
 
#28
  Alt 8. Mai 2004, 06:49
Zitat von Luckie:
Dazu war ich zu faul, aber mach du das doch.
Und ich bin nicht faul? Naja, falls ich mal nichts zu tun habe, werde ichs machen, oder MrFish machts...
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#29
  Alt 8. Mai 2004, 07:01
Das Problem war, ich war zu faul die Koordinaten auszurechnen für die Minutenstriche bzw. dafür eine Routine zuschreiben, die selbiges in einer Schleife erledigt.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon
 
#30
  Alt 8. Mai 2004, 18:10
ganz toll wär jetzt, das ganze in ne komponente zu schmeissen
aber für nen anfänger...(ich kanns auch nicht )
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz