Autor Beitrag
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: 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)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  DecodeTime(Now,nowH,nowM,nowS,dummy); // Zeit in Variablen Speichern (dummy -> millisekunden)

  rad := Width div 2; // radius auf die hälfte der Breite setzen

  anteilS := 360-(nowS*(360/60)-90); // jede Sekunde um ein 60stel von 360 weitergehen... (-90 weil 0 rechts ist und 360- weil sonst falschrum)
  zeigerS.x := round(cos(anteilS)*rad); // cos ist der relative x wert
  zeigerS.y := round(sin(anteilS)*rad); //  sin ist der relative y wert

  Canvas.TextOut(0,0,'Sekunden: '+(Inttostr(nows))+' -- Grad:'+Floattostr(anteils));  // Sekunden und Gradzahl ausgeben (nur debugging)

  Canvas.MoveTo(Width div 2, Height div 2); // Von Mitte aus...
  Canvas.LineTo(Width div 2+zeigerS.x, Height div 2+zeigerS.y); // zu dem Punkt zeichnen


Der Zeiger ist aber völlig falsch... (und ich hab keinen Plan warum);

Thx, Fis
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Fr 30.05.03 17:02 
Danke Danke Danke :D

Jetzt funzt es :mrgreen:
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Fr 30.05.03 20:01 
Übrigens, hier gibt es eine sehr schöne Uhr (mit Source): www.maxk.keepfree.de/download/Clock.zip :wink:

Wollte ja nur mal ein bisschen Werbung machen :roll:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Fr 30.05.03 20:52 
Types.dcu nicht gefunden...
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Fr 30.05.03 21:44 
Ich hab gerade ein Beispiel hochgeladen wie meins gerade aussieht:

www.dbsw.de/delphi/uhr.zip

Fis
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Sa 31.05.03 00:24 
Irgendwie hat der Thread ziemlich viele Aufrufe... :wink:

Ich hab jetzt DoubleBuffered der Form auf der die Uhr liegt angeschaltet, merk aber keinen großen Unterschied...

Fis
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Sa 31.05.03 07:08 
Thx, es funzt, es flackert nicht mehr, auch wenn ich den Timer auf 1 stelle :mrgreen:


ausblenden Delphi-Quelltext
1:
var DBuffer: TBitmap;					


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  DBuffer := TBitmap.Create;
  DBuffer.Width := Width;
  DBuffer.Height := Height;

  with DBuffer do begin
  //... gleiche Anweisungen
  end;
  Canvas.Draw(0,0,DBuffer);
  DBuffer.free;


...aber wie mach ich das transparent (Hintergrund...) :?
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Sa 31.05.03 09:14 
EErrrr.... Irgendwas stimmt hier nicht.

Da steht Aufrufe: 14782 <-- :shock: :?:
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: 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 :?