Toon posts:

[bcb3] Analoge klok maken

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi,

Als werk voor school heb ik de opdracht gekregen om een analoge klok te maken gestuurd via PC.
Hierbij maak ik gebruik van stappenmotoren.
De intrerface hiervan werkt, en de software ervoor ook :D
Nu had ik graag gehad, dat er een voorstelling van de klok op het scherm kwam.

Ik ben al eens aan het zoeken geweest op het net, maar het enigste wat ik vond was een component dat gelijk liep met de tijd van windows.

Maar dit is achter niet de bedoeling.
Dus zou ik zelf die klok willen maken.
Maar ik weet niet hoe dit te realiseren.
Mss met 2 lijntjes ( uren & minuten ) onder variabele hoek te plaatsen.

Kan iem mij helpen ?

mVg

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

www.torry.ru is vast een kant en klaar component te vinden die dat doet. Delphi componenten (en code) kunnen ook gebruikt worden in BCB, maar ik weet niet of dat al met BCB3 kan.

Anders in de OnPaint van een Form zelf tekenen op de Canvas en elke keer de Form Refreshen/Updaten/Invalidaten.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Wat je ook kunt doen, is met een TPie werken, 2 stuks dan. Alleen weet ik niet of die TPie wel in bcb3 zit, in bcb4 en bcb5 zit ie wel
Hij staat onder de Samples tab van de compnent Pallete
(et kan zijn dat ik bcb nu ff mis heb -> is toch Borland C++ Builder of niet)
suc6

Verwijderd

Verwijderd schreef op 14 februari 2003 @ 16:04:
Hoi,

Als werk voor school heb ik de opdracht gekregen om een analoge klok te maken gestuurd via PC.
Hierbij maak ik gebruik van stappenmotoren.
De intrerface hiervan werkt, en de software ervoor ook :D
Nu had ik graag gehad, dat er een voorstelling van de klok op het scherm kwam.
Even een vraag tussendoor, hoe heb je die stappenmotor aangestuurd en welke hardware gebruik je?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Okee ik heb niet het gevoel dat je ook maar enigszins gezocht hebt, dus ik ga dit stukje code ook niet uitleggen. Maar met een beetje bestuderen (zelf werken dus ;) ) zou je er wel uit moeten kunnen komen...
C++:
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
#include <math.h>

void DrawClock(TCanvas *p_Canvas, int p_Width, int p_Height, int p_Minutes, p_Hours)
{
int     l_Left;
int     l_Top;

p_Minutes %= 60;
p_Hours   %= 12;

// Draw clock circle
p_Canvas->Ellipse(0, 0, p_Width, p_Height);

// Draw hour indicator
l_Left = (sin((2 * M_PI * p_Hours) / 60) * p_Width / 3) + p_Width / 2;
l_Top  = (cos((2 * M_PI * p_Hours) / 60) * p_Height / 3) + p_Height / 2;
p_Canvas->MoveTo(p_Width / 2, p_Height / 2);
p_Canvas->LineTo(l_Left, l_Top);

// Draw minute indicator
l_Left = (sin((2 * M_PI * p_Minutes) / 60) * p_Width / 2) + p_Width / 2;
l_Top  = (cos((2 * M_PI * p_Minutes) / 60) * p_Height / 2) + p_Height / 2;
p_Canvas->MoveTo(p_Width / 2, p_Height / 2);
p_Canvas->LineTo(l_Left, l_Top);
}

Ps. niet getest, zal wellicht ook niet compileren, gewoon Notepad-werk als vanouds :P Het gaat om het idee, en als het werkt zal het best een respectabele klok tekenen :)

Professionele website nodig?


Verwijderd

ik heb nog nooit met delphi gewerkt, en met C ook weinig (veel vb e.d.), maar deze code klopt wel (syntax kan misschien fout zijn maar de structuur is goed)..

/edit/

ik zou dr gewoon een plaatje achter douwen van een klokwerk, en dan (weet niet of dat makkelijk is in delphi/c++) de wijzers ook een plaatje, en die roteren.. ziet er gelijk stuk mooier uit en is waarschijnlijk niet zoveel werk..

/edit/

[ Voor 45% gewijzigd door Verwijderd op 15-02-2003 03:28 ]


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Ik heb ooit in Delphi ook een klok gebouwd (maar dan eentje met 100 minuten per uur en 100 seconden per minuut :+, rekent wel makkelijker :) ). Ik had het gedaan door gewoon met de draw-functies de wijzers te tekenen en dat elke seconde (deel v/e seconde aangezien er 100 in 1 'minuut' zaten :) ) bij te werken.
Als je een beetje met sinussen en cosinussen om kunt gaan, is dat niet zo'n groot probleem.

[ Voor 3% gewijzigd door maikel op 15-02-2003 03:53 ]


Verwijderd

Topicstarter
curry684 schreef op 15 February 2003 @ 03:08:
C++:
1
2
3
TCanvas *p_Canvas, int p_Width, int p_Height, int p_Minutes, p_Hours)

p_Canvas->Ellipse(0, 0, p_Width, p_Height);
OK de code begrijp ik voor het grootste deel :D
Maar wat is die canvas juist ? Ik krijg er steets een error bij bij het compileren :S

mvg.

BTW: ik heb zeker gezogd hoor :p

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zoek in de BCB help index eens op de onderwerpen TCanvas en TPaintBox.

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 15 February 2003 @ 12:24:
Zoek in de BCB help index eens op de onderwerpen TCanvas en TPaintBox.
Done, maar het spijt mij. Ik ben er echt niet wijzer van :s

Kan iem het eens uitleggen in stapjes ?

Ik open dus borland c++ builder
En dan vind ik nergens een component TCanvas of Tpaint

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

TPaintBox vind je in de System Tab en die heeft een OnPaint funcie, waar je op de Canvas van die TPaintBox kan tekenen. Ieder ander visueel component heeft trouwens ook een Canvas.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 15 February 2003 @ 13:33:
TPaintBox vind je in de System Tab en die heeft een OnPaint funcie, waar je op de Canvas van die TPaintBox kan tekenen. Ieder ander visueel component heeft trouwens ook een Canvas.
OK dit lukt alvast, bedankt mannen !

Nog 1 vraagje:

Het uurwerk, wordt steeds in de rechterbovenhoek getekend, ook
al heb ik de paintbox in het midden van het blad gezet.
Kan iem mij nog met deze laatste vraag helpen aub

Hartelijk dank alvast

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je pakt de verkeerde Canvas. Jij hebt de Canvas van het form. Pak die van je PaintBox

YamakasisPaintBox->Canvas

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Lap, ik dacht nu eens dat ik eruit was :S

Ik heb nu vier knoppen op het scherm staan:
uren + & -
en
minuten + & -

Maar het lukt mij nog steeds niet om het uurwerk te laten lopen.

Sorry, dat ik alles zo snel achter elkaar vraag, maar ik zit in de week op internaat en daar is er geen internet aansluiting.

mVg

Yama

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Zijn die knoppen en de paintbox het enige dat je op je form hebt staan?
Zo ja, dan moet er nog een timer bij.

En bij die timer moet je aan z'n OnTimer-event (geloof ik) wat code hangen die op de paintbox de tijd 'tekent'. Die tijd moet je dus ook bijhouden.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 15 February 2003 @ 15:50:
Lap, ik dacht nu eens dat ik eruit was :S

Ik heb nu vier knoppen op het scherm staan:
uren + & -
en
minuten + & -

Maar het lukt mij nog steeds niet om het uurwerk te laten lopen.
Je paintbox wordt alleen getekend als het nodig is. Sleep er eens een ander form overheen, dan zie je denk ik wel dat er wat nieuws getekend wordt.

Vandaar dat ik ook in mijn eerste post al zei dat je PaintBox.Invalidate/Refresh of Update aan moet roepen elke keer als je de uren en/of minuten verander.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 15 februari 2003 @ 16:25:
[...]
/Refresh of Update aan moet roepen elke keer als je de uren en/of minuten verander.
En met welk CMD doen we dit ?

Eventjes een uitwijding aan die extra forms :

Als ik bv 2 forms heb, en ik wissel van form door

C++:
1
2
Form1->Hide();
Form2->Show();


Dan wisselen de forms van positie.
Is er een manier zodat het bijna niet te zien is dat er van form gewisseld is ?

mVg

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

C++:
1
MyPaintBox->Invalidate();

En van die forms, doe je niets aan. Je kunt het beter verbergen door eerst de nieuwe te tonen voordat je de oude hide.

[ Voor 59% gewijzigd door curry684 op 15-02-2003 17:26 ]

Professionele website nodig?


Verwijderd

hee :( da's mijn script :(

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Gewoonlijk doe ik niet aan complete code, maar ik verveelde me wat, dus bij deze...

Bestaat uit een Form met enkel een PaintBox en een Timer. De enige properties die je hoeft te veranderen zijn de 2 events en de PaintBox->Align moet op alClient staan.
C++:
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
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
// Globals
// (these should be member variables but for the sake of not having to quote
// the header I made them global)
//---------------------------------------------------------------------------

int g_Seconds;
int g_Minutes;
int g_Hours;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
// Force initial update
Timer1Timer(Timer1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
TCanvas*  l_Canvas  = PaintBox1->Canvas;
int       l_Width   = PaintBox1->Width;
int       l_Height  = PaintBox1->Height;
int       l_Left;
int       l_Top;

// Draw clock circle
l_Canvas->Ellipse(0, 0, l_Width, l_Height);

// Draw hour indicator
l_Left = (sin((2 * M_PI * g_Hours) / 12) * l_Width / 5) + l_Width / 2;
l_Top  = -(cos((2 * M_PI * g_Hours) / 12) * l_Height / 5) + l_Height / 2;
l_Canvas->MoveTo(l_Width / 2, l_Height / 2);
l_Canvas->LineTo(l_Left, l_Top);

// Draw minute indicator
l_Left = (sin((2 * M_PI * g_Minutes) / 60) * l_Width / 3) + l_Width / 2;
l_Top  = -(cos((2 * M_PI * g_Minutes) / 60) * l_Height / 3) + l_Height / 2;
l_Canvas->MoveTo(l_Width / 2, l_Height / 2);
l_Canvas->LineTo(l_Left, l_Top);

// Draw seconds indicator
l_Left = (sin((2 * M_PI * g_Seconds) / 60) * l_Width / 2) + l_Width / 2;
l_Top  = -(cos((2 * M_PI * g_Seconds) / 60) * l_Height / 2) + l_Height / 2;
l_Canvas->MoveTo(l_Width / 2, l_Height / 2);
l_Canvas->LineTo(l_Left, l_Top);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
SYSTEMTIME    l_SystemTime;

// Reload time variables
GetLocalTime(&l_SystemTime);
g_Seconds   = l_SystemTime.wSecond % 60;
g_Minutes   = l_SystemTime.wMinute % 60;
g_Hours     = l_SystemTime.wHour % 12;

// Invalidate the paint box to force a redraw
PaintBox1->Invalidate();
}
//---------------------------------------------------------------------------

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Professionele website nodig?


Verwijderd

bijna goed, je moet alleen een correctie inbouwen voor het uur
uur=uur+(minuut/60) , anders verspringt je uurwijzer maar een keer per uur.
eigenlijk zou dat ook voor minuut moeten, maar een "stationsklok" die maar een keer per minuut verspringt is ook wel mooi.
Pagina: 1