Olen koittanut aikaisemmin tuodun linkkivinkin perusteella tehdä pikku ohjelmaa, joka näyttäisi vapaan tilan eri kiintolevyosioilta.
Koodi on seuraavanlaista:
Formilla
Muuttuja asema, olisi tarkoitus korvata hakemistorakenteessa tarkenne eri osioon, joka tuossa ei ole vielä toiminnassa.
Private Sub Command1_Click() Dim userbytes As ULARGE_INTEGER Dim totalbytes As ULARGE_INTEGER Dim freebytes As ULARGE_INTEGER Dim tempval As Currency Dim retval As Long Dim asema As String asema = Combo_drive.Text retval = GetDiskFreeSpaceEx("c:\", userbytes, totalbytes, freebytes) CopyMemory tempval, freebytes, 8 tempval = tempval * 10000 Lbl_bittia.Caption = Format(tempval, "### ### ### ###") & " " Lbl_kilobittia.Caption = Format(tempval / 1024, "### ### ### ###") & " " Lbl_megabittia.Caption = Format(Lbl_kilobittia.Caption / 1024, "### ### ### ###") & " " Lbl_gigabittia.Caption = Format(Round(Lbl_megabittia.Caption / 1024, 1), "### ### ###.###") & " " End Sub
Moduulissa:
Public Type ULARGE_INTEGER LowPart As Long HighPart As Long End Type Public Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" (ByVal _ lpDirectoryName As String, lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _ lpTotalNumberOfBytes As ULARGE_INTEGER, lpTotalNumberOfFreeBytes As ULARGE_INTEGER) As Long Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source _ As Any, ByVal Length As Long)
Homma toimii jos haluan katsoa osiota c:, mutta jos vaihdan tuohon formissa olevaan koodiin ositunnuksen d:, niin enään ei toimikaan.
Onko vinkkejä mikä tuossa mättää?
Samoin löytyykö mitään koodivinkkiä, miten tarkistaa mitä kaikkia osioita löytyy, jotka voisi siten luetteloida automaattisesti esim. Comboboxiin?
miten se ei enää toimi?
Antaa virheilmoituksen:
Run-time error '13'
Type mismatch
Viittaa riviin:
Lbl_megabittia.Caption = Format(Lbl_kilobittia.Caption / 1024, "### ### ### ###") & " "
Debugissa retvalin arvo on nolla. Eli se ei osaa hakea sitä vapaatatilaa.
Jos muutan tuon rivin ja sen jälkeiset rivit kommenteiksi, niin ei anna mitään lukua edes bitteinä tai kilobitteinä, ei kuitenkaan enään anna virheilmoitusta. Labelit huutaa tyhjyyttä.
Outoa, että vain c:ltä osaa, mutta d:ltä tai miltään muilta osioilta ei osaa.
Itsellä tuli ongelma eräässä ohjelmassa kun vaihdoin isomman D-kovalevyn jossa oli enemmän kuin 2^31 tavua. Eli menee overflow erroriin johon Format reagoi "Type mismatch"?
Tätä on ilmeisesti jo yritetty ratkoa pitkällä integerillä.
VB6:ssa on myös 28 desimaalin (96-bit) lukuformaattti piilotettuna Variant määrittelyyn. Suoraan ei voi määritellä vaan käytetään Cdec muunnosta. Suurin kokonais luku on 79,228,162,514,264,337,593,543,950,335
Dim a As Variant
Dim b As Long
a = CDec(b)
lainaus:
Samoin löytyykö mitään koodivinkkiä, miten tarkistaa mitä kaikkia osioita löytyy, jotka voisi siten luetteloida automaattisesti esim. Comboboxiin?
Tässä ratkaisu, en testannut itse
' NOTE: this code requires that you add a reference to the ' Microsoft Scripting Runtime type library Dim fso As New Scripting.FileSystemObject Dim drv As Scripting.Drive Dim info As String For Each drv In fso.Drives ' display drive name and type info = drv.DriveLetter 'Aseman kirjain 'tähän sitten sovellus next
Ei tuo ainankaan suoraan toiminut. näytti infossa vain viimeisen kirjaimen. pitänee tuota kuitenkin jotenkin soveltaa, eli tallentaa ne jotenkin uuteen muuttujaan tai taulukkoon ja vasta sitten iskeä listana ne comboon. :-/
Tuo aikaisempi meni hiukan minulta yli.
Kaikki osioni on saman kokoiset ja samaisella kiintolevyllä. joten hiukan epäilyttäisi tuo mainitsemasi.
Toimiiko kenelläkään muulla toi koodiosa muilla kuin c:llä?
Ohjelmasi toimii moitteetta C ja D-levyillä vaikka D on 100G.>>ompa outo juttu toi D:\ asemasi
tässä parannettu ohjelmma jossa tuo comboon syöttö
For Each drv In fso.Drives ' display drive name and type info = drv.DriveLetter 'Aseman kirjain 'tähän sitten sovellus Combo1.AddItem (info)'***** lisäys Next
Lisäksi omassa ohjelmassasi tulee tehdä muutos:
asema = Combo1.Text + ":\" 'muuten puuttuvat retval = GetDiskFreeSpaceEx(asema, userbytes, totalbytes, freebytes)'asema laitettu "C:\" paikalle
Tuolla sain se toimimaan Combon osalta sen myöten huomasinkin, että virheilmoitus tuleekin vain, jos asema on CD-asema tai diskettiasema.
Enpä huomannut katsoa, että CD asematunnukseni on jossain vaiheessa muuttunut d: asemaksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.