Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: VB 6 vai VB.NET?

Sivun loppuun

Daimeri [15.05.2013 22:02:38]

#

Hei olen nyt aloittanut vb6 harjoittelun alkoi vain hieman mietityttään että kannattaako enää lähteä opiskelemaan vb6;sta vai kannattaisiko suoraan opetella vb.net?

Metabolix [15.05.2013 22:10:03]

#

Selvästi VB.NET kannattaa; VB 6 on ikivanha. Ajatusleikkinä vaihda kysymykseesi Windows 98 (vuodelta 1998, kuten myös VB 6) ja Windows 8 (vuodelta 2012, kuten uusin VB.NETin versio) ja mieti, mitä silloin valitsisit.

Antti Laaksonen [15.05.2013 22:29:49]

#

Vanha ei tarkoita automaattisesti huonoa. Kuunnellaanhan Bachiakin, vaikka se on ikivanha. Molemmissa versioissa on puolensa. Esimerkiksi VB 6 on huomattavasti kevyempi kuin VB.NET, ja monet asiat onnistuvat sillä suoraviivaisemmin.

Metabolix [15.05.2013 22:58:20]

#

Antti Laaksonen kirjoitti:

Kuunnellaanhan Bachiakin, vaikka se on ikivanha.

Millä tavalla tämä vertaus mielestäsi soveltuu ohjelmointikieliin? Sitä paitsi historiassa on myös suuri määrä unohdettuja säveltäjiä.

VB:stä on myös muita versioita (1–5), enkä ole kuullut, että niitä enää käytettäisiin. Kuulemani perustelut VB 6:n puolesta liittyvät yleensä joko siihen, että projekti on jo aloitettu sillä eikä muutostyö kannata, tai siihen, että henkilö ei vain viitsi opetella uutta kieltä kunnolla. Sen sijaan en ole kuullut kenestäkään, joka osaisi molempia kieliä hyvin ja silti suosittelisi VB 6:n opettelua.

Antti Laaksonen kirjoitti:

Esimerkiksi VB 6 on huomattavasti kevyempi kuin VB.NET,

Onko sinulla todellisia perusteluja tälle väitteelle? .NET Framework tulee Windowsissa nykyään aina mukana (toisin kuin VB 6:n kirjastot), joten sen koko ei kelpaa perusteluksi. Kokemukseni mukaan .NET-ohjelmat käynnistyvät ja toimivat varsin nopeasti, ja useimmat käyttämäni VB 6 -ohjelmat ovat olleet hitaita, takkuilevia tai bugisia.

Antti Laaksonen kirjoitti:

ja monet asiat onnistuvat sillä suoraviivaisemmin.

Oletkohan itse edes opetellut VB.NETiä vieläkään?

Antti Laaksonen kirjoitti:

Molemmissa versioissa on puolensa.

Niin, esimerkiksi VB.NET toimii luotettavammin nykyisissä ja tulevissa Windowsin versioissa, sitä kehitetään aktiivisesti muiden .NET-kielten ohessa ja siinä on enemmän ominaisuuksia. Monet asiat onnistuvat VB.NETillä suoraviivaisemmin kuin vanhalla VB:llä.

Lisäksi VB.NET on ilmainen, kun taas VB 6 pitää tietääkseni ostaa, ellei hanki sitä laittomin keinoin.

Antti Laaksonen [15.05.2013 23:18:53]

#

Metabolix kirjoitti:

VB:stä on myös muita versioita (1–5), enkä ole kuullut, että niitä enää käytettäisiin.

VB:n versioita 1–5 ei käytetä, koska VB 6 sisältää niiden ominaisuudet ja uusia ominaisuuksia. Sen sijaan VB.NET ei sisällä kaikkia VB 6:n ominaisuuksia.

Metabolix kirjoitti:

Antti Laaksonen kirjoitti:

Esimerkiksi VB 6 on huomattavasti kevyempi kuin VB.NET,

Onko sinulla todellisia perusteluja tälle väitteelle?

Keveys on sekä ohjelmointiympäristössä että kielen syntaksissa. IDEt tehdään yleensä raskaiksi, ja myös VB 6 oli aikoinaan raskas, mutta vuoden 1998 mittapuulla raskas sovellus on nykyään salamannopea.

Syntaksista tarjoaa esimerkin seuraava koodipari. Ensimmäinen koodi on VB 6:lle ja toinen VB.NETille. Tämä on yleensäkin tärkeä ero VB 6:n ja VB.NETin välillä: koodaaminen on sinänsä samanlaista, mutta VB.NETissä asiat ilmaistaan pitkällisemmin.

MsgBox "aybabtu"
MessageBox.Show("aybabtu")

Metabolix kirjoitti:

Oletkohan itse edes opetellut VB.NETiä vieläkään?

Tähän sopivat Seppo Heikinheimon sanat: "Ei tarvitse olla lehmä todetakseen, että maito on hapanta."

Metabolix kirjoitti:

Lisäksi VB.NET on ilmainen, kun taas VB 6 pitää tietääkseni ostaa, ellei hanki sitä laittomin keinoin.

Tämä on totta, tosin kysyjällä ei selvästi ole ollut ongelmia saada VB 6 käyttöön.

vuokkosetae [16.05.2013 00:45:34]

#

Tähän kysymykseen ei ole oikeaa vastausta. Suosittelen kyllä ottamaan sen .NETin mukaan.

VB ilman .NETtiä on aivan loistava valinta mikäli arkoituksesi on opiskella ohjelmointia ilman olioita yms. nykypäivän hienouksia, sinulla on vanhaa VB koodia riesana tai teet ohjelmia antiikille.

Mikäli taas ajattelit tehdä jonkin hurjan jutun joka valloittaa maailman niin .NET taitaapi olla tätä päivää.

Työkalut valitaan käyttöä varten, vaikka tosi kova koodari murskaa numeroita lispillä ja tekee tekoälyn fortranilla.

Grez [16.05.2013 09:57:29]

#

vuokkosetae kirjoitti:

Tähän kysymykseen ei ole oikeaa vastausta. Suosittelen kyllä ottamaan sen .NETin mukaan.

Mielestäni tähän on oikea vastaus, ja se on että VB6:tta ei ole järkevää käyttää uusiin projekteihin.

Ihan hyvä syy on jo sekin, että Microsoft tai kukaan muukaan tuskin tulee enää korjaamaan VB6:ssa vielä jäljellä olevia bugeja.

Äärimmäisen pieniin projekteihin, joita ei ole tarkoitus jatkokehittää sitä voisi periaatteessa toki käyttää, mutta käytännössä siitä tuskin saataisiin hyötyä verrattuna siihen että käytettäisiin vaikkapa VB.Netiä.

Toki nämä ei ole ainoat kehitystyökalut maailmassa. Luulisi löytyvän joku enemmän VB6-mäinen kehitystyökalukin, joka olisi vielä tuettu.

Ja itse esim. siirryin C#:iin, vaikka tutustumiseni .Net-maailmaan alkoikin VB.Net -projektien parissa.

Antti Laaksonen kirjoitti:

Keveys on sekä ohjelmointiympäristössä että kielen syntaksissa.

Syntaksista tarjoaa esimerkin seuraava koodipari.

Sitten taas monien ihan perusasioiden kirjoittaminen VB6:ssa mukana tulevilla kirjastoilla on VB6:ssa raskasta verrattuna esim. VB.Netiin. Esim:

Dim smtp As New System.Net.Mail.SmtpClient("smtp.operaattori.net")
smtp.Send("lauri.lahettaja@posti.net", "matti.mottonen@osoite.com", _
            "Testiviesti", "Lähetin sulle testiviestin VB.Netillä")

Saman koodaaminen VB6:lla olisi sen verran raskasta, etten taida edes vaivautua. Löysin kyllä netistä n. 50 rivisen toteutuksen pelkkiä VB6:n mukana tulevia kirjastoja käyttäen ja n. 20 rivisen toteutuksen CDO:lla.

Daimeri [16.05.2013 11:02:45]

#

Kiitos vastauksistanne.

Yksi koodari sanoi että kannattaa opetella ensin vb;6sta ja sitten siirtyä vb.nettiin koska vb.net on paljon monimutkaisempi. itseäni hieman asia mietityttää kun kieli on kuitenkin erilainen että jos nyt alan lukemaan vb6;sta vuoden pari ja sitten tajuan että vb6;s on eilispäivän juttu.

JaskaP [16.05.2013 16:04:29]

#

Ei VB.NETtiä kannata opetella, koska C# on yhtä helppo/vaikea, mutta paremmalla syntaksilla. Lisäksi opit samalla hyvin yleisen "aaltosulku"-kielten tyylin.

("Aaltosulku"-kieliä ovat mm. C, C++, Java, PHP, C#, JavaScript eli käytännössä yleisimmät kielet.)

Metabolix [16.05.2013 18:27:31]

#

Antti Laaksonen kirjoitti:

Metabolix kirjoitti:

Oletkohan itse edes opetellut VB.NETiä vieläkään?

Tähän sopivat Seppo Heikinheimon sanat: "Ei tarvitse olla lehmä todetakseen, että maito on hapanta."

Onpa hölmösti sanottu. Maidon asianmukaisessa käytössä – suoraan lehmästä vasikkaan – maito ei ole hapanta. Ongelman aiheuttaa ihminen, joka käyttää maitoa väärin eli lypsää lehmän ja säilöö maidon. Sanojen looginen sovellus tähän tilanteeseen on siis, että jos VB 6 -koodari löytää vikaa VB.NET-koodista, hän on tehnyt itse jotain väärin.

Daimeri [16.05.2013 19:10:11]

#

Oon nyt ihan pihalla kumpaa kannattaa harjotella. Ajattelin nyt sitten kokeilla myös vb.net;tiä Onko vb.net ohjelmointi vaikeampaa kuin vb6 ?

groovyb [16.05.2013 19:48:39]

#

Kun et kerran kumpaakaan osaa, valitse vb.net.
joka tapauksessa sun pitää kieli opetella, valitsit kumman tahansa. Vb.net on nykyaikaa, vb6 jäänne ja obsolete.

Metabolix [16.05.2013 20:27:27]

#

Olen melko varma, että Antti Laaksonen on tämän foorumin aktiivisista ja edes jossain suhteessa taitavista VB-koodareista ainoa, joka suosittelee VB 6:n opettelua; kaikki muut suosittelevat VB.NETiä.

Monelle laiskalle VB 6 -koodarille siirtymä VB.NETiin on ollut vaikea, joten mielestäni olisi erittäin typerää opetella ensin tahallaan väärä kieli ja myöhemmin vaihtaa toiseen. Jos VB.NET kuitenkin kiinnostaa, opettele alusta asti sitä.

samip [16.05.2013 20:52:59]

#

Itse siirtyisin suoraan C#:iin jos VB:lle ei ole jotain erityistä tarvetta, mutta antamistasi vaihtoehdoista .NET ehdottomasti. Perustelut taisi aika pitkälti jo tullakin.

Daimeri [16.05.2013 21:01:30]

#

Okei kiitoksia. alan nyt harjoitteleen sitten VB.NETiä

suunnitelmani on hakea kirjastosta kirjoja ja tehä harjoutuiksia ladata netistä valmiita koodeja ja yrittää ymmärtää mitä ohjelman sisällä tapahtuu. ja muokata valmista koodia.

vinkkejä opetteluun saa toki laittaa

Antti Laaksonen [17.05.2013 00:06:34]

#

Grez kirjoitti:

Ihan hyvä syy on jo sekin, että Microsoft tai kukaan muukaan tuskin tulee enää korjaamaan VB6:ssa vielä jäljellä olevia bugeja.

En ymmärrä tätä perustelua. VB 6:ssa on nyt vähemmän bugeja kuin koskaan. Mitä järkeä sitä oli sitten käyttää vuonna 1998, jolloin siinä oli paljon enemmän bugeja kuin nyt? En usko, että Microsoft on luvannut ikuiset bugikorjaukset VB.NETille.

Grez kirjoitti:

Sitten taas monien ihan perusasioiden kirjoittaminen VB6:ssa mukana tulevilla kirjastoilla on VB6:ssa raskasta verrattuna esim. VB.Netiin. Esim:

Dim smtp As New System.Net.Mail.SmtpClient("smtp.operaattori.net")
smtp.Send("lauri.lahettaja@posti.net", "matti.mottonen@osoite.com", _
            "Testiviesti", "Lähetin sulle testiviestin VB.Netillä")

Totta, myös vastakkaisia esimerkkejä on. Tosin tuossakin tulee vastaan VB.netin pitkät nimet ja turhien olioiden luonti. Jos vastaava toiminto olisi VB 6:ssa, niin se olisi luultavasti toteutettu jotenkin näin:

Mail "lauri.lahettaja@posti.net", _
     "matti.mottonen@osoite.com", _
     "Testiviesti", _
     "Lähetin sulle testiviestin VB 6:lla", _
     "smtp.operaattori.net"

Metabolix kirjoitti:

Monelle laiskalle VB 6 -koodarille siirtymä VB.NETiin on ollut vaikea,

Miten laiskuus tähän liittyy? Kyllä minä jaksan kirjoittaa tarvittaessa vaikka

System.Windows.Forms.MessageBox.Show("aybabtu")

mutta tyhmäähän se olisi.

Grez [17.05.2013 04:36:00]

#

Antti Laaksonen kirjoitti:

Grez kirjoitti:

Ihan hyvä syy on jo sekin, että Microsoft tai kukaan muukaan tuskin tulee enää korjaamaan VB6:ssa vielä jäljellä olevia bugeja.

En ymmärrä tätä perustelua. VB 6:ssa on nyt vähemmän bugeja kuin koskaan. Mitä järkeä sitä oli sitten käyttää vuonna 1998, jolloin siinä oli paljon enemmän bugeja kuin nyt? En usko, että Microsoft on luvannut ikuiset bugikorjaukset VB.NETille.

No pointtina nyt ehkä lähinnä oli se, että VB.Netillä pystyy tekemään suoraan ilman kikkailua nekin asiat, joissa VB6:lla joutuu kiertämään VB6:n bugeja. Puhumattakaan niistä, mitä VB6:n kanssa käytännössä ei edes voi kiertää. Se että VB6 on joskus ollut vieläkin huonompi on mielestä kohtuullisen irrelevanttia.

Ja jos tekee vaikka webiin näkyvän palvelun, niin mikäli VB6:sta löytyy tietoturva-aukko niin sitten on pakko muuttaa omaa koodia, kun taas VB.Netin tai minä tahansa muun tuetun tuotteen kanssa on todennäköistä että aukkoon tehdään korjaus.

Antti Laaksonen kirjoitti:

Jos vastaava toiminto olisi VB 6:ssa, niin se olisi luultavasti toteutettu jotenkin näin

Ja pointtinihan oli että VB.Netillä todennäköisesti monet asiat on helpompi toteuttaa, ei se olisiko jäätelö parempaa JOS lehmät osaisivat lentää.

Antti Laaksonen kirjoitti:

Miten laiskuus tähän liittyy?

No tuskin ainakaan sillä tavalla kuin sen ymmärsit. Uskon että Metabolix tarkoitti sitä mitä kirjoittikin, että siirtymä on ollut vaikea. Jos Metabolix olisi tarkoittanut että pidempien avainsanojen ja pidemmän syntaksin kirjoittaminen olisi vaikeaa, hän olisi varmaan kirjoittanut niin.

Käytän kyllä sekä C# että VB6 tälläkin hetkellä ja vaikka C# koodista tulee pidempää, niin ei siinä käytännössä enempää tarvitse kirjoittaa

VB6:ssa täytyy kirjoittaa Msgbox kun taas C#:ssa riittää näpytellä (äsken kokeilin) Me.S( jolloin toki koodi-ikkunaan ilmestyy MessageBox.Show(

Ja myönnän toki että VB6:lla monet jutut on näppärämpiä tehdä. Ero VB.Net tai C#:iin on kuitenkin marginaalinen. Sitten taas monet jutut on VB.Net tai C#:lla monta kertaluokkaa VB6:sta helpompaa tehdä. Ja tyypillisesti isoon projektiin tulee kuitenkin näitä molempia, jolloin lopputuloksena kokonaisuus on helpompaa tehdä .Net -maailmassa.

Sitten tuli myös mieleen että monia saattaa kiinnostaa tehdä softaa esim. Xboxille tai Windows -puhelimille, -tableteille yms. Näiden kanssa VB6:sta ei ole mitään hyötyä. Myöskin kaikki muut uudet jutut tehdään .Net -maailmaan, jolloin .Net-osaaja pystyy niitä helposti hyödyntämään, toisin kuin VB6-osaaja.

groovyb [17.05.2013 08:28:26]

#

Eiköhän perusteeksi riitä että koko winforms on jo saanut lisäaikaa pelkästä armosta. Windowsit siirtyivät jo XP ajoista wpf pohjaiseen piirtoon. Ei vb6:selle vanhentuneena kielenä ole valideja perusteluita enää. Ei QB:täkään paljoa suositella. Silloin kun .net piti vielä itse erikseen asentaa ja framework oli suppea, perustelut olivat ihan päteviä. Nyt se on yhtä vanhentunut kuin QB.

Metabolix [17.05.2013 12:55:15]

#

Antti Laaksonen kirjoitti:

Metabolix kirjoitti:

Monelle laiskalle VB 6 -koodarille siirtymä VB.NETiin on ollut vaikea,

Miten laiskuus tähän liittyy?

Laiska ei paneudu opetteluun kunnolla vaan yrittää käyttää VB.NETiä vanhoilla tiedoilla vähän sinnepäin, ja kun koodaus ei suju, hän tekee helposti perusteettoman päätelmän ”VB.NET on huono, siinä ei toimi mikään koodi” ja palaa VB 6:n käyttöön. Sen sijaan ahkera (vai ylipäänsä asiasta kiinnostunut ja vähän fiksumpi?) ymmärtää, että monet asiat pitää opetella uudestaan, ja selvittää ongelmat kärsivällisesti eikä luovuta.

Onhan tälläkin foorumilla nähty monta aivan yksinkertaista kysymystä siitä, miten jokin VB 6 -juttu tehdään VB.NETillä. Jos kysyjät olisivat opetelleet VB.NETiä järjestyksessä ja sekoittamatta siihen VB 6 -asioita, monia ongelmia ei olisi ollut tai ainakin kysymykset olisivat olleet selvempiä (”miten tehdään asia X” vs. ”miksi tämä omituinen sekasikiö ei toimi”).

Hennkka [17.05.2013 16:48:03]

#

Olen aikoinani joutunut itsekin tekemään saman valinnan kuin sinä. Isä osasi hieman VB6:tta, joten se löytyi valmiiksi asennettuna. Ohjelmoinnista ei kuitenkaan tullut oikeen mitään, koska en tiennyt muita komentoja kuin msgbox ja isä oli päivät töissä, joten ainoa apuri oli google. Kun sitten googlaillessa suurin osa vastauksista oli VB.netille oli sen kokeileminen luonnollinen vaihtoehto. Ihastuin siihen välittömästi: tavaraa pystyi raahaamaan formille hiirellä, kaksoisklikkaamalla sai luotua tapahtumahandlerit, IDE:stä pystyi muuttaa helposti ominaisuuksia ja mikä parasta, kokeilemalla oppinut kun olen, kirjoittamalla alun ja painamalla Ctrl+space, sai listan sopivista jatkoista ja mahdollisista ominaisuuksista ja funktioista! Täten pystyn omasta kokemuksesta suosittelemaan VB.nettiä ensimmäiseksi kieleksi.

Daimeri [17.05.2013 21:42:11]

#

Hennkka kirjoitti:

tavaraa pystyi raahaamaan formille hiirellä, kaksoisklikkaamalla sai luotua tapahtumahandlerit,

Tossa vb6;sessa mitä käytin pystyis myös hiirellä siirtämään tavaraa formille ilman ongelmia. olen nyt saanut tehtyä ensimmäisen ohjelman vb.netillä joka arpoo lukuja 0-30 väliltä ja kun tulee luku 7 kuva tulee visiblestä näkyviin. (Mod. huom: uusi kysymys, uusi keskustelu.)

ajv [17.05.2013 22:03:01]

#

JaskaP kirjoitti:

Ei VB.NETtiä kannata opetella, koska C# on yhtä helppo/vaikea, mutta paremmalla syntaksilla. Lisäksi opit samalla hyvin yleisen "aaltosulku"-kielten tyylin.

Täältä kans ääni tolle C#:lle

JaskaP [18.05.2013 11:10:48]

#

ajv kirjoitti:

JaskaP kirjoitti:

Ei VB.NETtiä kannata opetella, koska C# on yhtä helppo/vaikea, mutta paremmalla syntaksilla. Lisäksi opit samalla hyvin yleisen "aaltosulku"-kielten tyylin.

Täältä kans ääni tolle C#:lle

En varsinaisesti C#:ia diggaa, mutta jos on pakottava tarve tai halu mennä MS-välineillä niin C# on parempi kuin VB.NET. Toivotaan että nm. Daimerilla oli tällainen tarve/halu.

Hennkka kirjoitti:

Ihastuin [VB.NETiin] välittömästi: tavaraa pystyi raahaamaan formille hiirellä, kaksoisklikkaamalla sai luotua tapahtumahandlerit, IDE:stä pystyi muuttaa helposti ominaisuuksia ja mikä parasta, kokeilemalla oppinut kun olen, kirjoittamalla alun ja painamalla Ctrl+space, sai listan sopivista jatkoista ja mahdollisista ominaisuuksista ja funktioista! Täten pystyn omasta kokemuksesta suosittelemaan VB.nettiä ensimmäiseksi kieleksi.

Hmm... C++:lle löytyy samanlainen IDE:n toimivuus (ainakin Visual Studio ja Qt Creator), joten vastaavasti voisi aloittaa suoraan C++:lla ja IDE:llä, eikös?

Hennkka [18.05.2013 14:40:07]

#

JaskaP kirjoitti:

Hmm... C++:lle löytyy samanlainen IDE:n toimivuus (ainakin Visual Studio ja Qt Creator), joten vastaavasti voisi aloittaa suoraan C++:lla ja IDE:llä, eikös?

Enhän ole tätä kieltänytkään. Kysyjähän kai kuitenkin pohti kumman valitsee: VB6:n vai VB.netin.

Jos nyt kuitenkin puolustelen vielä Basicia yleisesti aloityskielenä, niin:

En kuitenkaan halua väittää, että Basic (ja erityisesti VB.net) olisi paras ohjelmointikieli aloittelijoille, mutta mielestäni se on varteenotettava vaihtoehto. Myöhemmin kuitenkin täytyy opetella uusia kieliä ja kun jo yhtä osaa, ei uuden opetteleminen vaadi paljoakaan vaivaa.

groovyb [19.05.2013 20:28:47]

#

kyllä .net kielet on se The valinta, mikäli tehdään normaalia windows -kehitystä (ja mikäli käytetään .netin c++:aa, niin syntaksi jo vähän eroaakin normaalista c++:sta gc:n takia). Ja yleensä vb:tä tai vb.nettiä ohjelmoimaan oppimishalukkaat henkilöt haluavat tehdä juuri suhteellisen kevyttä windowssoftaa. tuohon tarkoitukseen perinteinen c++ + MFC ei ole edes harkittava vaihtoehto tänäpäivänä.

jalski [21.05.2013 15:58:51]

#

groovyb kirjoitti:

kyllä .net kielet on se The valinta, mikäli tehdään normaalia windows -kehitystä

.NET kielet ovat helpottaneet Windows-ohjelmien kehitystyötä, mutta eivät suinkaan ole ainoita "THE" valintoja kaikkeen ohjelmointiin Windows ympäristössä.

Hyvät kirjastot ja käyttäjää miellyttävä ohjelmointikielen syntaksi voi tehdä perinteisestä WinAPI-ohjelmoinnistakin melko nautittavan kokemuksen.

Esimerkiksi itse teen suurimman osan Windows ohjelmoinnista käyttäen MiniBASIC kääntäjää, jota en tosin voi enää suositella muille koska ohjelmointikielen kehittäjä sai pitkän vankilatuomion ja päivityksiä tuskin enää tulee.

Alla esimerkkinä Yksinkertainen graafinen Windows-ohjelma MiniBASIC:illa, mikä piirtää analogisen kellon. Ikkunan kokoa voi muuttaa ja se on varustettu valikolla. Uskallan väittää, että vastaava .NET-ohjelma ei olisi yksinkertaisempi ja helpompi toteuttaa.

##NOCONSOLE
const MENU_EXIT = 1

DSTRING hours[3,12] = { "03","02","01","12","11","10","09","08","07","06","05","04" }
WINDOW win

win.Open(0,0,400,400,WS_OVERLAPPEDWINDOW|WS_VISIBLE|BUFFERED|CENTERED,0,"Simple Clock",NULL,&handler)
win.BeginMenu()
win.MenuTitle("File")
win.MenuItem("Exit",0,MENU_EXIT)
win.EndMenu()
draw_clock(win)
win.StartTimer(1000)

DO:PROCESSMESSAGES():UNTIL win.GetHandle()=NULL


FUNC handler(WINDOW wnd),INT
	SELECT wnd.Message
		CASE ID_CLOSE
			wnd.StopTimer()
			wnd.Close()
		CASE ID_MENUPICK
			IF wnd.menunum = MENU_EXIT
				wnd.StopTimer()
				wnd.close()
			ENDIF
		CASE WM_TIMER
			draw_clock(wnd)
	ENDSELECT
	RETURN 0
ENDF


FUNC circleptx(INT x, INT r, INT deg),INT
	RETURN (x + COSD(deg) * r)
ENDF


FUNC circlepty(INT y, INT r, INT deg),INT
	RETURN (y - SIND(deg) * r)
ENDF


FUNC draw_clock(WINDOW wnd)
	INT i
	INT w, h, xcenter, ycenter, radius
	INT angsecs, angmins, anghours
	INT cx, cy
	RECT rc
	INT wSecond,wMinute,wHour

	rc = wnd.GetClientRect()
	w = rc.right - rc.left
	h = rc.bottom - rc.top
	xcenter = w/2
	ycenter = h/2

	IF w > h THEN radius = h ELSE radius = w
	radius = radius/2 - 8

	STRING strTime = TIME$
	wHour = VAL(MID$(strTime,1,2))
	wMinute = VAL(MID$(strTime,4,2))
	wSecond = VAL(MID$(strTime,7,2))

	angsecs = 90 - wSecond * 6
	angmins = 90 - wMinute * 6
	anghours = 90 - (wHour * 5 + wMinute / 10) * 6

	wnd.CacheUpdates(TRUE)

	wnd.SetLineStyle(LSSOLID, 1)
	wnd.DrawRect(0,0,rc.right,rc.bottom,RGB(255,255,255),RGB(255,255,255))
	wnd.DrawCircle(xcenter,ycenter,radius,RGB(0,0,0), RGB(255,255,255))
	wnd.DrawCircle(xcenter,ycenter,5,RGB(0,0,0), RGB(0,0,0))

	FOR i = 0 TO 59
		wnd.DrawCircle(circleptx(xcenter,radius*0.95,i*(360/60)),circlepty(ycenter,radius*0.95,i*(360/60)),1,RGB(0,0,0), RGB(0,0,0))
	NEXT i

	FOR i = 0 TO 11
		cx = circleptx(xcenter,radius*0.95,i*(360/12))
		cy = circlepty(ycenter,radius*0.95,i*(360/12))
		wnd.DrawCircle(cx,cy,2,RGB(0,0,0), RGB(0,0,0))
		cx = circleptx(xcenter-10,radius*0.80,i*(360/12))
		cy = circlepty(ycenter-8,radius*0.80,i*(360/12))
		wnd.WriteText(cx,cy,hours[0,i])
	NEXT i

	wnd.SetLineStyle(LSSOLID, 2)
	wnd.Line(xcenter,ycenter,circleptx(xcenter,radius*0.90,angsecs), circlepty(ycenter,radius*0.90,angsecs),RGB(0,0,0))

	wnd.SetLineStyle(LSSOLID, 4)
	wnd.Line(xcenter,ycenter,circleptx(xcenter,radius*0.85,angmins), circlepty(ycenter,radius*0.85,angmins),RGB(0,0,0))

	wnd.SetLineStyle(LSSOLID, 6)
	wnd.Line(xcenter,ycenter,circleptx(xcenter,radius*0.65,anghours), circlepty(ycenter,radius*0.65,anghours),RGB(0,0,0))

	wnd.CacheUpdates(FALSE)
ENDF

groovyb [21.05.2013 16:39:20]

#

En sanonutkaan ainoita, vaan ainoa varteenotettava vaihtoehto.

Daimeri [21.05.2013 18:44:42]

#

Noniin tässä on nyt vb.nettiä opiskeltu kohta pari viikkoo. Tuntuu yllättävän helpolta ymmärtää koodia ja tehdä simppeleitä ohjelmia. Aluks toi koodi näytti ihan heprealta mutta nytkun on jokapäivä tehny harjotuksia niin alkaa homma jo selkeneen vaikka siis en mikään koodaaja vielä ole mutta....

feenix [23.05.2013 23:40:55]

#

No, kun kerran jalski epäili miten helposti .NET-kielillä kellon tekisi niin teinpä sitten pikaisesti vastaavan. Ja ei tuo ainakaan monimutkaisempi ole kuin tuo BASIC-versio.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Clock
{
	static class Program
	{
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new Form1());
		}
	}

	public class Form1 : Form
	{
		Timer t = new Timer();

		public Form1()
		{
			Text = "Clock";

			ResizeRedraw = true;
			Menu = new MainMenu();
			MenuItem mi = new MenuItem("&File");
			Menu.MenuItems.Add(mi);
			MenuItem mi2 = new MenuItem("E&xit");
			mi2.Click += (s, e) => { Close(); };
			mi.MenuItems.Add(mi2);

			t.Interval = 1000;
			t.Tick += (s, e) => Refresh();
			t.Start();
			this.FormClosing += (s, e) => t.Stop();
		}

		protected override void OnPaint(PaintEventArgs e)
		{
			DateTime d = DateTime.Now;

			int radius = Math.Min(ClientSize.Width, ClientSize.Height) / 2 - 8;

			e.Graphics.TranslateTransform(ClientSize.Width / 2, ClientSize.Height / 2);
			for (int i = 1; i <= 12; i++)
			{
				e.Graphics.RotateTransform(30);
				e.Graphics.DrawString(i.ToString(), SystemFonts.DefaultFont, Brushes.Black, -e.Graphics.MeasureString(i.ToString(), SystemFonts.DefaultFont).Width / 2, -radius+4, StringFormat.GenericTypographic);
			}

			e.Graphics.DrawEllipse(Pens.Black, -radius, -radius, radius * 2, radius * 2);
			e.Graphics.FillEllipse(Brushes.Black, -5, -5, 10, 10);

			e.Graphics.DrawLine(new Pen(Brushes.Black, 6), 0, 0, (int)(radius * 0.65 * Math.Sin(d.Hour * Math.PI / 6)), -(int)(radius * 0.65 * Math.Cos(d.Hour * Math.PI / 6)));
			e.Graphics.DrawLine(new Pen(Brushes.Black, 4), 0, 0, (int)(radius * 0.85 * Math.Sin(d.Minute * Math.PI / 30)), -(int)(radius * 0.8 * Math.Cos(d.Minute * Math.PI / 30)));
			e.Graphics.DrawLine(new Pen(Brushes.Black, 2), 0, 0, (int)(radius * 0.9 * Math.Sin(d.Second * Math.PI / 30)), -(int)(radius * 0.9 * Math.Cos(d.Second * Math.PI / 30)));
		}
	}
}

jalski [24.05.2013 07:48:32]

#

feenix kirjoitti:

No, kun kerran jalski epäili miten helposti .NET-kielillä kellon tekisi niin teinpä sitten pikaisesti vastaavan. Ja ei tuo ainakaan monimutkaisempi ole kuin tuo BASIC-versio.

Ei monimutkaisempi, mutta ei myöskään ihan vastaava. Vertaa vaikka kuvasta. Kellostasi puuttuu tunti, sekunti ja minuutti merkit sekä lisäksi et käytä tuplapuskuria piirtoon, eli kellon päivitys välkkyy.

Oma kelloni kuvassa siis vasemmalla... Tuossa kellossasi tuntiviisari ei muuten näyttäisi liikkuvan oikeassa suhteessa aikaan nähden (katso kuvasta).

groovyb [24.05.2013 10:28:40]

#

No tuo Doublebuffer hoituu tässä tapauksessa ihan

Form1.DoubleBuffer = true;

ja tuo tuntiviisarin liike on sidottu nykyiseen tuntiin (eli hyppää vasta kun tunti vaihtuu, koska kaavassa on Math.Sin(d.Hour * Math.PI... ). nuo minuuttien ja tuntin pilkutkin on vain simppeli piirto, idean kuitenkin ymmärsit varmasti.

feenix [24.05.2013 21:28:49]

#

Pointti oli esittää miten yksinkertainen tuo on toteuttaa, ei tehdä täsmälleen identtistä kelloa. En alkanut parsimaan sen tarkemmin BASICia päässäni. Tahallani myös jätin tuntiviisarin osoittamaan aina tasatuntia, se ei tosiaan sen vaikeampi ole laittaa pyörimään oikein, mutta toki voin tuon korjata jos haluat. Ja teinhän sentään nätisti numerot kääntymään ja miksi ihmeessä kellossa olisi alkunollat... ;)

Ja onko tosiaan niin, että tuossa BASICissasi pitää käsitellä kellonaikaa merkkijonona vai päätit vain tehdä niin?

Jos oikeasti tekisin kellon, en piirtäisi kaikkea tietenkään aina uudestaan vaan tekisin pohjalle kellotaulun ja siirtäisin vain viisareita.

Siinä nyt sitten tuplapuskuroitu, antialiasoitu versio, jossa myös merkit ja tunti- sekä minuuttiviisari liikkuu sekuntien tarkkuudella. Tuli monta riviä lisää, ihan samanlaista piirtokamaa kuin BASICillakin. Yllättäen kun se, että piirretään viiva ei kauheasti eroa näissä ympäristöissä kuitenkaan.

(Ja koordinaatiston pyöritystä käytän vain kun se nyt on simppeliä eikä tarvitse kirjoittaa sinejä ja kosineja, toki ilman sitäkin pärjäisi)

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Clock
{
	static class Program
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new Form1());
		}
	}

	public class Form1 : Form
	{
		Timer t = new Timer();

		public Form1()
		{
			Text = "Clock";
			DoubleBuffered = true;

			ResizeRedraw = true;
			Menu = new MainMenu();
			MenuItem mi = new MenuItem("&File");
			Menu.MenuItems.Add(mi);
			MenuItem mi2 = new MenuItem("E&xit");
			mi2.Click += (s, e) => { Close(); };
			mi.MenuItems.Add(mi2);

			t.Interval = 1000;
			t.Tick += (s, e) => Refresh();
			t.Start();
			this.FormClosing += (s, e) => t.Stop();
		}

		protected override void OnPaint(PaintEventArgs e)
		{
			DateTime d = DateTime.Now;

			int radius = Math.Min(ClientSize.Width, ClientSize.Height) / 2 - 8;

			e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
			e.Graphics.TranslateTransform(ClientSize.Width / 2, ClientSize.Height / 2);

			for (int i = 0; i < 60; i++)
			{
				if ((i % 5) == 0)
					e.Graphics.FillEllipse(Brushes.Black, -2, radius - 6, 4, 4);
				else
					e.Graphics.FillEllipse(Brushes.Black, -1, radius - 5, 2, 2);

				e.Graphics.RotateTransform(6);
			}

			for (int i = 1; i <= 12; i++)
			{
				e.Graphics.RotateTransform(30);
				e.Graphics.DrawString(i.ToString(), SystemFonts.DefaultFont, Brushes.Black, (-e.Graphics.MeasureString(i.ToString(), SystemFonts.DefaultFont).Width+4) / 2, -radius+10, StringFormat.GenericTypographic);
			}

			e.Graphics.DrawEllipse(Pens.Black, -radius, -radius, radius * 2, radius * 2);
			e.Graphics.FillEllipse(Brushes.Black, -5, -5, 10, 10);

			e.Graphics.DrawLine(new Pen(Brushes.Black, 6), 0, 0, (int)(radius * 0.65 * Math.Sin((d.Hour + d.Minute / 60.0 + d.Second / 3600.0) * Math.PI / 6)), -(int)(radius * 0.65 * Math.Cos((d.Hour + d.Minute / 60.0 + d.Second / 3600.0) * Math.PI / 6)));
			e.Graphics.DrawLine(new Pen(Brushes.Black, 4), 0, 0, (int)(radius * 0.85 * Math.Sin((d.Minute + d.Second / 60.0) * Math.PI / 30)), -(int)(radius * 0.8 * Math.Cos((d.Minute + d.Second / 60.0) * Math.PI / 30)));
			e.Graphics.DrawLine(new Pen(Brushes.Black, 2), 0, 0, (int)(radius * 0.9 * Math.Sin(d.Second * Math.PI / 30)), -(int)(radius * 0.9 * Math.Cos(d.Second * Math.PI / 30)));
		}
	}
}

jalski [27.05.2013 10:44:05]

#

feenix kirjoitti:

Ja onko tosiaan niin, että tuossa BASICissasi pitää käsitellä kellonaikaa merkkijonona vai päätit vain tehdä niin?

Päätin käyttää MiniBASIC:in sisäänrakennettuja komentoja tähän tarkoitukseen. Toki olisi ollut mahdollista käyttää myös WinAPI:n ja C-standardikirjaston toiminnallisuutta.

feenix kirjoitti:

Tuli monta riviä lisää, ihan samanlaista piirtokamaa kuin BASICillakin. Yllättäen kun se, että piirretään viiva ei kauheasti eroa näissä ympäristöissä kuitenkaan.

Jos olisin rekisteröinyt omat käsittelijät tapahtumille yhden ikkunaviestien käsittelijän sijaan ja käyttänyt GDI+:ssaa piirtämiseen, niin ohjelmien välinen ero olisi ollut vielä pienempi...

Lisähaasteena kokeilepas toteuttaa vaikka tätä MiniBASIC:illa kirjoitettua "Mine Sweeper" peliä vastaava toteutus C#:llä. Lähdekooditiedosto paketin sisällä on sweeper.mba ja valmis ajettava binääri löytyy bin-hakemistosta.

The Alchemist [27.05.2013 12:10:01]

#

feenix kirjoitti:

Yllättäen kun se, että piirretään viiva ei kauheasti eroa näissä ympäristöissä kuitenkaan.

Trigonometrian matikka ei muutu ympäristöstä toiseen, joten niin kauan kuin kaikki lasketaan ja piirretään itse pisteistä ja viivoista lähtien, niin eiköhän käytettävät funktiot ole ihan samanlaisia jopa kielestä ja kirjastosta riippumatta.

Itse tekisinkin ensimmäisenä kellon eri komponenttien piirtelyyn tarvittavat kätevyysfunktiot ja jättäisin niiden alkeisgeometrian kokonaan event handlereiden ulkopuolelle. Koodistakin tulee luettavampaa, kun ymmärtää, mitä helkuttia siellä tapahtumankäsittelijässä oikeasti tehdään.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta