Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Graphisch Digitale/Analoge Uhr (https://www.delphipraxis.net/15077-graphisch-digitale-analoge-uhr.html)

n00b_on_knees 21. Jan 2004 15:18


Graphisch Digitale/Analoge Uhr
 
Hallo miteinander!

Ich soll eine graphisch Digital und Analoge Uhr programmieren, beide sollen gleichzeitig laufen, und dass mit Echtzeit. Ich suche eine möglichst Einfache und schnelle Lösung, falls dies überhaupt möglich ist.
Wie kann ich je nach Zeit eine Uhr zeichnen? (jede Minute soll im Programm eingezeichnet sein, also 60 Striche, ist aber kein muss), wie bekomme ich es hin, dass sich die 3 Zeiger "bewegen"? und wie funktioniert es mit der Echtzeit? Und dem zeichnen der Digital Uhr..

also gibts hier wohl Fragen über Fragen ... vielleicht kennt ihr eventuell irgendwo eine Muster Lösung?

wäre freundlich wenn ihr mir vielleicht Denkanstöße, oder eventuell sogar Lösungswege oder Codehilfen geben würdet, ich danke euch im Vorraus.

mfg

flomei 21. Jan 2004 15:27

Re: Graphisch Digitale/Analoge Uhr
 
:roll: Wenn du den Quellcode nicht vorlegen musst kannst du mal auf www.tmssoftware.com vorbeigucken. Die haben das TMS Instrumentation Workshop. Da sind auch Uhren bei... (Man kann da auch die Sourcen dazu erwerben)

MfG Florian :hi:

n00b_on_knees 21. Jan 2004 15:46

Re: Graphisch Digitale/Analoge Uhr
 
Hi

danke erstmal für die Adresse, werd mich da umschauen. Allerdings brauch ich wohl leider schon den Quellcode, also wären andere Antworten auch noch gerne erwünscht. :)

czapie 21. Jan 2004 15:59

Re: Graphisch Digitale/Analoge Uhr
 
Naja ich glaube wenn wir dir hier den Quellcode hinschmeißen
wirst du dabei nicht viel lernen.

Auf alle Fälle solltest du dich mit Timern auseinandersetzen.
Für die "analoge" Uhr würde ich auf einem Image, je nach Minute und
Stunde Striche als Zeiger zeichnen. Du müßtest also eine Methode schreiben
die je nach Minute einen Strich in eine bestimmte Richtung vom
Mittelpunkt zeichnet.

Czapie.

Chris1986 21. Jan 2004 16:01

Re: Graphisch Digitale/Analoge Uhr
 
Hi
Ich hab das auch mal gemacht
Was du auf jeden Fall brauchst ist die Unit math und die Funktionen sin, dectoRad, ect. . .

Viel Spaß

MfG
Christian

n00b_on_knees 21. Jan 2004 16:12

Re: Graphisch Digitale/Analoge Uhr
 
und wie kann ich herausfinden, welche minute und sekunde, sowie stunde gerade ist? hab da leider nicht viel ahnung davon ;)

Lefko 21. Jan 2004 16:32

Re: Graphisch Digitale/Analoge Uhr
 
um die aktuelle uhrzeit sowie das datum herauszubekommen gibt es die einfache Funktion now

die stunde, minute, sekunde (und auch millisekunde) bekommst du z.b. über die Funktion DecodeTime(now,....)
datum mit DecodeDate(now,...) und beides mit DecodeDateTime(now,...)

den rest schau dir dazu in der Delphi-Hilfe an :)

evtl. musst du für einige dieser Fkt die Unit DateUtils einbinden (unter uses eintragen);

MfG Lefko.

Garby 21. Jan 2004 16:34

Re: Graphisch Digitale/Analoge Uhr
 
Hallo,

die funktion
Delphi-Quellcode:
Time;
gibt die aktuelle Zeit zurück (Datentyp TDateTime).

Mit der Funktion
Delphi-Quellcode:
DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
kannst du einen Wert des Typs TDateTime in Stunden, Minuten, Sekunden und Millisekunden zerlegen.

n00b_on_knees 28. Jan 2004 17:56

Re: Graphisch Digitale/Analoge Uhr
 
Danke nochmals für eure Antworten..bin leider nicht grade ein großes Talent in Programmieren, und komme irgendwie nicht wirklich mit diesem Programm zurecht. Habe auch schon seit etwa einer Stunde nach Lösungen im Internet gesucht, und leider nichts gefunden.. Irgendwie habe ich Angst vor dem Lehrer, wenn ich nichts wirklich passendes habe. Ich glaube wenn ich ihm meinen mickrigen Quellcode abgebe, schickt er mich noch zurück in die Grundschule :shock: :wall:

könntet ihr mir genauere Angaben, vllt sogar nen kleinen Lösungsweg für entweder die Analoge oder die Digitale Uhr, geben? Haben wir doch in der Schule auch schon gemacht..nur ich kann sie leider nicht so wirklich in ein Programm umsetzen.
Hilfreich wäre auch ein Tutorial..nur scheint es so eins nirgends im Internet zu geben :|

Luckie 28. Jan 2004 17:59

Re: Graphisch Digitale/Analoge Uhr
 
Nimm kein TInage, sondern eine TPaintbox. TIMage ist nur für das Anzeigen geeignet. Liunien Kannst du auf das Canvas der Paintbox mit den Methoden LineTo und MoveTo von TCanvas Zeichnen.

n00b_on_knees 28. Jan 2004 18:04

Re: Graphisch Digitale/Analoge Uhr
 
weiß wohl leider nichtmal was eine TInage ist..lol.
Das mit der Paintbox war mir sowieso klar, danke ;)..hmm ja das mit den Linienzeichnen ist auch klar..nur wie passe ich der aktuellen Uhrzeit die Zeiger an, bezüglich dem Winkel, und wie manage ich das bewegen? Immer beim Winkel dazuzählen? Nur wie?

Luckie 28. Jan 2004 18:07

Re: Graphisch Digitale/Analoge Uhr
 
Sollte TImage heißen.

Stanlay Hanks 28. Jan 2004 18:07

Re: Graphisch Digitale/Analoge Uhr
 
Zitat:

Zitat von n00b_on_knees
...Irgendwie habe ich Angst vor dem Lehrer, wenn ich nichts wirklich passendes habe. Ich glaube wenn ich ihm meinen mickrigen Quellcode abgebe, schickt er mich noch zurück in die Grundschule :shock: :wall:

Der soll herkommen :mad: Die DP steht hinter dir :dp: :wink:

Aber zu deinem Problem: Die Digitale Uhr dürfte kein Problem sein: Du nimmst ein TLabel (Register "Standard" auf der Komponentenleiste) und einen TTimer (Register "System") und ziehst dir beide auf dein Form. Dann klickst du doppelt auf den Timer und schreibst:

Delphi-Quellcode:
Label1.Caption := TimeToStr(Time);
Die Eigenschaft "Interval" des Timers setzt du im Objektinspektor auf 1000 (Zeit in Millisekunden, nach denen das "onTimer" Ereignis wiederholt ausgeführt wird. Allerdings sollte der Standardwert schon 1000 sein. Ein, bzw. ausschalten kannst du deine Uhr dann indem du

Delphi-Quellcode:
//entweder
Timer1.Enabled := false; //Zum Ausschalten

//oder
Timer1.Enabled := true; //Zum Einschalten
schreibst.

Bei der Analogen Uhr kann ich dir leider wenig weiterhelfen. (Muss wohl irgendwas mit Winkeln zu tun haben :mrgreen:)

Man liest sich, Stanlay :hi:

n00b_on_knees 28. Jan 2004 18:33

Re: Graphisch Digitale/Analoge Uhr
 
hmm, ich denke dass ist leider etwas zu einfach :pale:
das ganze soll hier so ähnlich geschehen, nur mit Zeichnen:

Code:
   __
||    ||
||    ||
   __
||    ||
||    ||
   __
das wäre ein teil der anzeige, nur mit strichen, kanns leider nicht anders hier mit zeichen machen ;)

Edit: Okey die Formatierung hier macht das ganze zunichte..jedenfalls soll es so gezeichnet werden wie in einer normalen Digitalanzeige einer Uhr, mit diesen Strichen.

[edit=Luckie]Dann nehmen wir doch mal die Code-Tags. ;) Mfg, Luckie[/edit]

Chris1986 28. Jan 2004 18:56

Re: Graphisch Digitale/Analoge Uhr
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Analogen Uhr:
Da hilft dir die Unit "math" und ein bisschen Mathe. Ich hab sowas auch mal gemacht. Ich häng das Prog einfach mal an.

MfG
Christian

n00b_on_knees 28. Jan 2004 19:11

Re: Graphisch Digitale/Analoge Uhr
 
dankesehr, werd mir dass mal durchsehen. hast du etwas dagegen wenn ich teile deines codes verwende?
Damit bin ich schon mal mit einem Teil des Programms bestimmt weiter.

Chris1986 28. Jan 2004 19:14

Re: Graphisch Digitale/Analoge Uhr
 
Den Code kannst du ruhig benutzen. Aber wie gesagt: Das ist Mathe der 9. Klasse. Wenn du das deinem Lehrer vorstellen willst, dann solltest du den Code verstehen.

MfG
Christian

Spezi1980 28. Jan 2004 19:48

Re: Graphisch Digitale/Analoge Uhr
 
Hallo,

Wenn du die Uhr direkt malen willst, so kann ich dir ein Beispiel zeigen:

analoge Uhr:
also, du nimmst ein leeres Fenster, haust eine Paintbox und einen Timer drauf. Den Interval der Uhr setzt du auf 1000 (ms = 1s).

In das Ereigniss "OnTimer" des Timers gibst du folgendes ein:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
 Procedure DrawDigit(Digit:Char; XPos,YPos, Size:Integer; Canvas : TCanvas);
 Var I:Integer; X,Y, Breite,Hoehe:Integer;
 begin
   Breite := Size div 2; {Breite einer Zahl berechnen}
   Hoehe  := Size;      {Hoehe einer Zahl berechnen}
   Canvas.MoveTo(XPos,YPos);
   case Digit of
     ':' : begin
               X := Breite div 2;
               Y := Hoehe div 3;
               Canvas.Ellipse(XPos +X -1, YPos + y  -1,XPos +X +1,YPos +Y  +1);
               Canvas.Ellipse(XPos +X -1, YPos + y*2 -1,XPos +X +1,YPos +Y*2 +1);
           end;
     '.' : begin
               X := XPos + Breite div 2;
               Y := XPos + Hoehe;
               Canvas.Ellipse(X - 1,y-2, X + 1,y);
           end;
     '0' : begin
               Canvas.LineTo(XPos,YPos + Size);
               Canvas.LineTo(XPos + Breite,YPos + Hoehe);
               Canvas.LineTo(XPos + Breite,YPos);
               Canvas.LineTo(XPos,YPos);
           end;
     '1' : begin
               Canvas.MoveTo(XPos,YPos + Size div 3);
               Canvas.LineTo(XPos + Breite,YPos);
               Canvas.LineTo(XPos + Breite,YPos + Hoehe);
           end;
     '2' : begin {...}
               Canvas.MoveTo(XPos         ,YPos + Hoehe div 5);
               Canvas.LineTo(XPos         ,YPos);
               Canvas.LineTo(XPos + Breite ,YPos);
               Canvas.LineTo(XPos + Breite ,YPos + Hoehe div 2);
               Canvas.LineTo(XPos         ,YPos + Hoehe div 2);
               Canvas.LineTo(XPos         ,YPos + Hoehe);
               Canvas.LineTo(XPos + Breite ,YPos + Hoehe);
               Canvas.LineTo(XPos + Breite ,YPos + Hoehe - Hoehe div 5);
           end;
     '3' : begin {...
                   Hier musst du nun selbst aktiv werden und die anderen Zahlen wie oben malen...}
           end;
   end;
 end;
Var I:Integer; Zeit:String;
begin
  Zeit := timetoStr(now); //aktuelle Uhrzeit ermitteln
  Canvas.Rectangle(0,0,PaintBox1.Width,PaintBox1.Height); //Inhalt der Paintbox löschen
  for I:=1 to length(Zeit) do begin
    DrawDigit( Zeit[I] , //Die übergebene Ziffer
              (5 + abs(PaintBox1.Canvas.Font.Height) div 2) * I, //die X Koordinate der Ziffer (die 5 ist der Abstand)
              10, //die Y Koordinate des Textes
              abs(PaintBox1.Canvas.Font.Height), //Die Schriftgröße
              PaintBox1.Canvas); //wohin gezeichnet werden soll
  end;
end;
Ich hoffe mal das dir das weiterhilft.

Gruß
Robs

[Edit]mann sollte sich das auch nochmal durchlesen was man postet :wall: [/Edit]
grrrrrrrr :wall: :wall: :wall:

n00b_on_knees 28. Jan 2004 20:16

Re: Graphisch Digitale/Analoge Uhr
 
@Spezi
Danke auch, werd mich nur vorher mal mit dem andrem Code beschäftigen!
Ich glaube da muss brauch ich noch mehr Durchblick *g*

n00b_on_knees 28. Jan 2004 21:06

Re: Graphisch Digitale/Analoge Uhr
 
@Chris

Bin ja gerade dabei deinen Code durchzustudieren..was genau bezeugst du mit

Delphi-Quellcode:
sin(DegToRad(h*30))
?

ich weiß, dass der ganze Teil der Anweisung mit

Delphi-Quellcode:
x:= sin(DegToRad(h*30))*(pb.width/2-70);
zu tun hat, macht das ganze einfach nur den Winkel auszurechnen? (den Teil nach * verstehe ich..)

Stanlay Hanks 28. Jan 2004 21:12

Re: Graphisch Digitale/Analoge Uhr
 
Vielleicht helfen ja ein paar Zitate aus der OH weiter:

Zitat:

In Delphi gibt Sin den Sinuns des Arguments zurück.

X ist ein Ausdruck des Typs Real. Sin gibt den Sinus des mit X angegebenen Winkels im Bogenmaß (Rad) zurück.
Zitat:

Die Funktion konvertiert einen in Grad angegebenen Winkel in das Bogenmaß.
Man liest sich, Stanlay :hi:

n00b_on_knees 29. Jan 2004 16:08

Re: Graphisch Digitale/Analoge Uhr
 
danke nochmal an alle..die Analoge Uhr hab ich nun so gut wie hingekriegt.. jetzt fehlt nurnoch die Digitale..antworten für dieses Beispiel sind immernoch willkommen *g*

Jörn 29. Jan 2004 16:20

Re: Graphisch Digitale/Analoge Uhr
 
Zur Theorie:
Wir betrachten einfach mal nur den Minutenzeiger. Wenn er auf der vollen Stunde steht, sagen wir mal, sind das 0 Grad. Eine Minute später muss der Zeiger einen Winkel von 360 Grad / 60 (wegen 60 Minuten in der vollen Stunde) haben. Ganz einfach also. Für den Stundenzeiger geht das dann ähnlich *gg*

Du musst dann "nur" mittels Sinus und Cosinus den Endpunkt des Zeigers errechnen, der Anfang ist ja in der Mitte der Uhr
Viel Erfolg!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 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