| Autor |
Beitrag |
Tweafis
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Fr 30.05.03 16:11
Hallo erstma.
Well, Ich wollte als Einstieg in das KomponentenProggen mal 'ne kleine Uhr programmieren, hab aber bei der richtigen Grad Zahl noch Probleme... Ich hab es bis jetzt nur mit Sekunden laufen.
(Vorher wir der Kreis gezeichnet und die Farben gesetzt, bei Timer mit Interval 1000 wird Invalidated)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| DecodeTime(Now,nowH,nowM,nowS,dummy); rad := Width div 2; anteilS := 360-(nowS*(360/60)-90); zeigerS.x := round(cos(anteilS)*rad); zeigerS.y := round(sin(anteilS)*rad); Canvas.TextOut(0,0,'Sekunden: '+(Inttostr(nows))+' -- Grad:'+Floattostr(anteils)); Canvas.MoveTo(Width div 2, Height div 2); Canvas.LineTo(Width div 2+zeigerS.x, Height div 2+zeigerS.y); |
Der Zeiger ist aber völlig falsch... (und ich hab keinen Plan warum);
Thx, Fis
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 30.05.03 16:55
Die Funktionen cos und sin erwarten einen Wert im Bogenmaß. Du übergibst Werte im Gradmaß. Ich würde Dir die Funktion DegToRad empfehlen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Fr 30.05.03 17:02
Danke Danke Danke
Jetzt funzt es 
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Fr 30.05.03 20:01
Übrigens, hier gibt es eine sehr schöne Uhr (mit Source): www.maxk.keepfree.de/download/Clock.zip
Wollte ja nur mal ein bisschen Werbung machen 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Fr 30.05.03 20:52
Types.dcu nicht gefunden...
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Fr 30.05.03 21:44
Ich hab gerade ein Beispiel hochgeladen wie meins gerade aussieht:
www.dbsw.de/delphi/uhr.zip
Fis
|
|
worm
      
Beiträge: 135
D6 Prof
|
Verfasst: Fr 30.05.03 22:07
Nice, aber flimmert noch... solltest dir über doublebuffering Gedanken machen (also erstmal in ne Bitmap zeichnen und dann auf einen Rutsch die ganze Bitmap aufs Canvas bringen, anstatt das Canvas zu leeren und dann darauf neu zu zeichnen). Vielleicht auch das gesamte Ziffernblatt erstmal in ne Bitmap zeichnen, damit es nicht mehrmals pro Sekunde neu gezeichnet werden muss (weiß aber nicht, ob das überhaupt so viel stört). Wie auch immer, ist ja schonmal nicht schlecht!
_________________ In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Fr 30.05.03 22:17
DoubleBuffering???
Ich habe leider keine Ahnung was das ist, ich beschäftige mich erst seit kurzem mit Komponenten-Entwicklung und Delphi an sich... (Hab es schon lange aber erst vor 3 Tagen wieder bei 0 angefangen)...
Ich werd mich mal umhören. Danke,
Fis
|
|
worm
      
Beiträge: 135
D6 Prof
|
Verfasst: Fr 30.05.03 23:11
Das bedeutet, Du zeichnest erst einmal alles in eine Bitmap - dazu musst Du bloß in deiner Zeichenprozedur eine temporäre Bitmap erzeugen (Klasse TBitmap), width und height noch festlegen und dann in dessen Canvas zeichnen (die selben Befehle, die Du sonst auf das Canvas deiner Komponente angewendet hast). Am Ende kannst Du z.B. mit CopyRect (oder auch mit Draw? müsste ich nachgucken) die Bitmap auf den Canvas deiner Komponente bringen und die Bitmap wieder freigeben. Oder vielleicht auch die Bitmap gleich behalten, wenn du sie mehrmals pro Sekunde brauchst.
Der Vorteil ist jedenfalls, dass es dann normalerweise nicht mehr flimmert, weil das Bild nicht zwischendurch gelöscht werden muss.
_________________ In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.05.03 23:15
DoubleBuffering funktioniert folgendermaßen:
Nehmen wir an du hast eine Paintbox mit etwas drauf. Wenn du jatzt das in der Paintbox direkt neu zeichnest, kann es flackern je nach dem wie viel und wie oft gezeichnet wird. das liegt daran, weil die grafische Ausgabe mit Windows-Boardmitteln recht langsam ist.
Die Lösung ist hier: Man zeichnet zu erst sein Bitmap im Speicher neu und kopiert es dann in einem Rutsch in die Paintbox. Das geht wesentlich schneller als direkt in die Paintbox zu zeichnen.
Wenn man das Zeichenen im Speicher jetzt noch geschickt in einem separaten Thread verlegt, kann man beides gleichzeitig ablaufen lassen. Geschickt deshalb, weil man etwas mit der Synchronisation aufpassen muß.
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Fr 30.05.03 23:27
*nixversteh*...
Err.... Ich glaub ich geh dann erstma schlafen und schau morgen wie das geht *verwirrtist*
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.05.03 23:33
OK, Versuch nummer zwei.
Du arbeitest mit zwei Bitmaps, eins unsichtbar im Speicher und eins sichtbar auf deinem Fenster. Die ganzen Zeichenoperationen machst du im Bitmap im Speicher, weil es einfach schneller geht. Bist du damit fertig, kopierts du das Bitmap im Speicher auf dein Bitmap im Fenster. Und das Kopieren in einem Rutsch geht auch schneller als alles einzeln zu zeichnen.
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Fr 30.05.03 23:35
Damit du dich nicht um das zweite Bitmap kümmern musst kannst du diese Aufgabe den Rechner selbst übernehmen lassen, indem du der Form, auf der du die Komponente hast auf deren Canvas du zeichnest (also Paintbox oder sowas) einfach das Property DoubleBuffered auf True setzt. Am besten im OnCreate-Event, weil es im ObjectInspector nicht zugänglich ist.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Sa 31.05.03 00:24
Irgendwie hat der Thread ziemlich viele Aufrufe...
Ich hab jetzt DoubleBuffered der Form auf der die Uhr liegt angeschaltet, merk aber keinen großen Unterschied...
Fis
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Sa 31.05.03 00:56
sollte aber nicht sein.
Normalerweise ist das genau daß, was Luckie und Worm dir hier vorgeschlagen haben, nur automatisiert...
Dann musst du es wohl doch manuell machen:
Du erzeugst eine Variable vom Typ TBitmap. Das Teil hat ebenfalls einen Canvas, darauf zeichnest du (ist im Speicher, also geht schnell).
Wenn du mit zeichnen fertig bist, mit Draw das Bitmap auf den Canvas der Komponente zeichnen, auf die du vorher die Uhr gemalt hast. Dadurch wird das Bitmap aus dem (schnellen) Speicher in einem Rutsch auf den (langsamen) Bildschirm gezeichnet, was insgesamt schneller ist, als wenn du ständig einzelne Zeichenfunktionen auf dem Bildschirm mausführen würdest.
Ist das mit Draw dann immer noch zu langsam, könntest du BitBlt benutzen, um das Bitmap auf den Canvas zu blitten, das ist aber eine Windows-APPI-Funktion, deren Parameter ich im Moment leider nicht auswendig weiß. Aber vielleicht reicht ja Draw...
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Sa 31.05.03 07:08
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Sa 31.05.03 09:14
EErrrr.... Irgendwas stimmt hier nicht.
Da steht Aufrufe: 14782 <-- 
|
|
Tweafis 
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Sa 31.05.03 10:45
So ich hab grad eine neue Version hochgeladen, sagt mal wie es euch gefällt, das läuft jetzt über den Speicher (DoubleBuffered?????)
Die Checkbox ist nur für Formular.Double Buffered.
Außerdem hab ich das Popupmenu der Uhr verbessert...
Fragen:
1. soll man die länge der Zeiger variieren können?
2. Wie geht das mit der Transparenz
Download
sry wegen doppelpost, aber sonst sieht das niemand 
|
|