Sub Image1_Click () If image1.Picture = LoadPicture("kuva.bmp") Then End End Sub
Minusta tuon pitäisi toimia vaan ei. Olen yrittänyt muokata tuota koodia mutten ole löytänyt oikeaa ratkaisua. Onko jollain takataskussa oikeanlaista koodia.
Eli haluat siis tarkistaa, onko image1:ssä jokin kuva, vai? Valitettavasti voin sanoa, että imagen picture-alueet eivät kelpaa vertailuun. Syystä en ole varma, mutta et voi testata onko imagessa pikselilleen jokin tietty kuva millään yksinkertaisella komennolla.
Voithan aina toki käydä läpi pikseli kerrallaan, mutta taitaa olla liian hidasta :)
Laita kuvan latauksessa muistiin, mikä tiedosto siihen on ladattu ja vaertaa tiedostonimiä. Näinkin voisi onnistua.
Vaan ompas keino sittenkin
Sub Image1_Click () If LoadPicture("kuva.bmp") = True Then End End Sub
Tämä toimii. :)
Edit: Mutta miten saan sen toimimaan indexin kanssa
Sub Image1_Click (index as integer) If LoadPicture("kuva.bmp") = True Then End End Sub
sillä nyt se ottaa sen kaikista kuvista.
Tuo koodi
If LoadPicture("kuva.bmp") = True Then End
vain tarkistaa onko tuota kuvaa olemassa... näin uskoisin.
Eli tuon index-homman tehdäksesi sinun on tarkastettava kyseisen image1(index):n kuvan tiedoston nimi. Se taas voi olla hieman hankalaa.
No sitä minäkin, että miten tuo If-lauseke voi tietää mitä PictureBoxia tarkoitetaan?
Täytyy sitten heivata tuo systeemi :( ja ottaa takaisin vanha jäykkä systeemi :( .Mutta jos joku keksii keinon niin...
Ja pakkohan tuohon keino on olla muuten vb3 on puutteellinen.
LoadPicture("kuva.bmp") = True koska se edustaa nollasta poikkeavaa lukua. Kyseinen luku on erilainen vaikka tiedosto olisi sama joten niitä ei voi suoraan verrata. En tiedä miten tuo lukuarvo muodostuu, mutta joka kerralla tulee eri luku vaikka kyse on samasta imagesta ja kuvatiedostosta.
Vanhoissa Visual Basiceissa LoadPicturen palautusarvo on aina -1 eli True. Uudemmissa palautusarvo on sedän kuvaama hämäräperäinen luku, joka on ilmeisesti kuvan tunniste muistissa. Kuitenkaan yksittäisiä pikseleitä ei tällä tavalla voi verrata. Tiedostonimien vertaaminen on ihan hyvä idea, jos ei halua jokaista pikseliä tutkia erikseen.
No en todellakaan ajatellut tutkia jokaista pixeliä erikseen vaikka kyse olisi pienestäkin kuvasta. Mutta en vieläkään ole löytänyt ratkaisua miten ladatun kuvan tiedoston nimen saa koodaamalla selville. Mutta se olisi helpompaa jos olisin koodilla ladannut kuvan mutta kun en ole.
Milläs sitten olet sen ladannut? Muuttuuko kuva ohjelman ajon aikana?
Kyllä!
Image1 = LoadPicture("kuva.bmp") Print Image1.Picture
eli miten miten saan printattua tuo 'kuva.bmp' nimen tuohon
etpäs mitenkään, ei se kuvaloota tiedä mitä siihen o ladattu.
Eikai se kuva sinne boxiin itsestään ilmesty?
Samalla kun lataat kuvant eli koodissasi kohta
Image1 = LoadPicture("kuva.bmp") pistä perään myös
Image1.tag = "kuva.bmp" näin tiedät myöhemmin mikä kuva siinä on
Onko muuten mitenkään mahdollista tallentaa noita kuvia ensin muuttujiin ja sitten vasta myöhemmin niistä kopioida PictureBoxeihin? Kumma idea kenties, mutta tuli vaan mieleen.
Edit: Tai siis ei tietenkään mihinkään tavallisiin muuttujiin vaan ajattelin, jos VB:ssä olisi joku systeemi tyyliin:
Dim muuttuja As Image
tai jotain sen tapaista.
Perjaatteessa kyllä jos se typettaa
type image
...
end type
Ja joo tuo tag voi olla hyvä idea.
No joo siis miten tuon tagin pitäisi toimia. Kuva sitäpaitsi vaihtuu ajon aikana.
Kerros nyt vähä enempi siitä koodista. Tietääkös joku onko VB3:ssa tuota .tag parametria?
No oletetaan että on vaikka neljä saman nimistä imagea, jolloin ne ovat indexoituja. (vaikka oikeasti niitä on 223) Niissä vaihtuu aika ajoin kuva. Ja pitäisi saada selville mikä kuva tietyssä imagessa kulloinkin on.
Ja VB3:ssa on .tag parametri.
Tag-ominaisuuteen voi tallentaa minkä tahansa merkkijonon. Tässä tapauksessa voisi Tagiin pistää tiedoston nimen heti kuvan latauksen jälkeen. Sitten vertailun voisi myöhemmin tehdä tähän tyyliin:
If Image1.Tag = "c:\omat\kuva.bmp" Then MsgBox "Kuva on sama!" End If
223 erillistä Image-kontrollia ei tosin kuulosta kovin hyvältä, moinen vienee tosi paljon muistia. Pystyisitkö tekemään ohjelman jollain muulla tavalla?
No empäs tiedä kun ne ovat 32*32pixel tilejä. Jotenka ehkä pitää muuttaa toteutusta. Mutta en tiedä miten. Jokainen tile pitäisi pystyä valitsemaan yksitellen, joka olisi helppoa juuri näin...
Tuohon ehkä sopisi kuvaleikkuri (PictureClip Control) kuin nyrkki silmään. Oletko kokeillut.
Huh! Ongelma ratkaistu .tagilla. En vain heti tajunnut. Olin kai liikaa miettinyt.
Aiheeseen liittyen - kokeilin mielenkiinnosta tuota Image-kontrollia ja huomasin yhden dokumentoimattoman(?) ominaisuuden, jota en ole huomannut aiemmin.
Image-objektin picture-ominaisuudella on myös ominaisuudet:
Picture.Handle,
Picture.Height,
Picture.hPal,
Picture.Type,
Picture.Width
Sekä metodi:
Picture.Render()
Kyseisiä ominaisuuksia ei ole dokumentoitu MSDN:ssä (July 2001) VB:n puolella ollenkaan ja C:n puolella vain ohimennen.
Asensin samalle koneelle .NET kehitysympäristön ja tuli mieleen olisiko mahdollista, että kyseinen COM objekti olisi korvaantunut .NET:in vastaavalla?
Tosin .NET:in MSDN:kään (Jan 2004) ei kyseisiä ominaisuuksia tunnistanut...
Edit: typoja
Ainakin minun vuotta vanhemmasta MSDN:stä nuo kaikki löytyy otsikon "StdPicture Object" alta.
edit: myös: http://msdn.microsoft.com/library/default.asp?
Kiitos kaima.
Ei sillä sinällään väliä ole - luontainen uteliaisuus iski ja halusin tsekata kyseisen luokan läpi mitä sillä saa aikaiseksi :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.