Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: vapaa tila

Sivun loppuun

Aku2 [26.11.2003 13:16:32]

#

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?

sooda [26.11.2003 13:33:17]

#

miten se ei enää toimi?

Aku2 [26.11.2003 15:57:54]

#

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.

tnb [26.11.2003 18:17:30]

#

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)

tnb [26.11.2003 21:13:54]

#

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

Aku2 [26.11.2003 23:23:21]

#

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ä?

tnb [27.11.2003 00:01:28]

#

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

Aku2 [27.11.2003 10:53:01]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta