Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Ohjelmat hakemistossa *VB 5*

Sivun loppuun

juhaz [05.11.2003 22:21:12]

#

Onkohan jotain tapaa hakea jostain hakemistosta tiedostoja ja lisätä niitä vaikka johonkin formille iconeina, joita klikatessa se ohjelma käynnistyy?

Ei taida olla kovin helppo jos edes on mahdollista?

Antti Laaksonen [07.11.2003 12:54:24]

#

On mahdollista. Laita formille esim. Image-kontrolli, jonka Index-arvo on 0. Tämän jälkeen lue hakemiston tiedostot (Dir-funktiolla) ja luo kustakin tiedostosta oma kuvake sopivalle paikalle formille. Tiedoston nimen voit vaikkapa liittää kontrollin Tag-ominaisuuteen. Kuvakkeilla (Image-kontrollit) on sitten yhteinen Click-aliohjelma, joka käynnistää Tagissa mainitun tiedoston tai ohjelman WinApin ShellExecute-funktiolla. Ainoa juttu, mitä nyt heti en keksi, on tiedoston kuvakkeen selvittäminen.

thefox [07.11.2003 16:57:12]

#

Kätevintä on tietysti käyttää MS Common Controlleista löytyvää ListViewiä (tai joku muu List* systeemi jokatapauksessa) :)

sooda [07.11.2003 16:58:06]

#

ImageListhän se on

juhaz [14.11.2003 06:16:11]

#

No ei kellään sattuisi olemaan mitään koodiesimerkkiä aiheesta? Minä löysin yhden ihan hienon explorerin... tjs (windowsin shellin) replacerin, jossa oli tämä tehty, mutta minä en löytänyt siellä koodissa mitään mitä olisi ymmärtänyt....

juhaz [15.11.2003 00:16:36]

#

varmaan tätä täytyisi jotenkin käyttää hyväkseen
https://www.ohjelmointiputka.net/keskustelu/528-vb-kysymys

Eli olen yrittänyt nyt tehdä niin, että kun mulla on formilla frame objekti ja framesta löytyy image1 ja label1 ja form_load tapahtumasta löytyy tälläistä koodia

Dim tiedosto As String

'etsii juurihakemiston tekstitiedostot
tiedosto = Dir("c:\*.exe")
Do Until tiedosto = ""
    Debug.Print tiedosto
    tiedosto = Dir
Loop

ja yritin saada toimimaan mohaxin neuvoma koodiesimerkki tuon kanssa, mutten saanut tosin mä en ole saanut sitä esimerkkiä muutenkaan toimimaan vaan laaksosen koodiesimerkki on ollut ainoa, joka toimii, mutta se ei ehkä sovellu ihan noin käyttööni.

Mitään hyvää tapaa eli pitäisi saada jokaisesta C-asemalla olevasta exe tiedostosta tehtyä oma kuvake formille.

Antti Laaksonen [15.11.2003 02:10:53]

#

Teinpä iltapuhteiksi ohjelman, joka lukee hakemiston ohjelmatiedostot ja näyttää ne siististi formilla. Kuvaketta painamalla ohjelma käynnistyy. Bonuksena ohjelma yrittää saada selville ohjelman todellisen kuvakkeen käymällä läpi resurssit 0 - 255. Usein se toimiikin muttei aina. Joku varmaan tietää paremman tavan kuin umpimähkään kokeileminen.

Formilla täytyy olla imgOhjelma-niminen kuva, jonka Index-arvo on 0.

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Any) As Long

Private Const IDI_APPLICATION = 32512& 'ohjelman oletuskuvake
Private Const HAKEMISTO = "c:\testi\" 'hakemisto, josta ohjelmia etsitään

Private Sub Form_Load()
    ScaleMode = 3 'pikseli on twippiä mukavampi yksikkö
    'kätketään tyhjä kuva ja määritetään kuvakkeiden mitat
    imgOhjelma(0).Visible = False
    imgOhjelma(0).Move 0, 0, 32, 32

    Dim tied As String, i As Integer
    Dim x As Integer, y As Integer
    Dim d As Long, ohj As Long, kuva As Long
    'ruvetaan lukemaan hakemistoa
    tied = Dir(HAKEMISTO & "*.exe")
    'ensimmäisen kuvakkeen piirtokohta
    x = 5
    y = 5
    'jatketaan niin kauan kuin tiedostoja riittää
    While tied <> ""
        'luodaan uusi kuvake
        i = i + 1
        Load imgOhjelma(i)
        'siirretään kuvake oikeaan paikkaan
        imgOhjelma(i).Move x, y
        'ladataan ohjelma kuvakkeen hakemista varten
        ohj = LoadLibrary(HAKEMISTO & tied)
        kuva = 0
        'yritetään etsiä kuvake ohjelmasta
        If ohj Then
            For d = 0 To 255
                kuva = LoadIcon(ohj, "#" & d)
                If kuva <> 0 Then Exit For
            Next
        End If
        'jos kuvaketta ei löytynyt, käytetään oletuskuvaketta
        If kuva = 0 Then
            kuva = LoadIcon(0, IDI_APPLICATION)
        End If
        'ohjelmaa ei enää tarvita
        d = FreeLibrary(ohj)
        'laitetaan kuvake näkyville ja piirretään kuvake
        imgOhjelma(i).Visible = True
        d = DrawIcon(Me.hdc, x, y, kuva)
        'ohjelman nimi Tagiin ja vihjelaatikkoon
        imgOhjelma(i).Tag = tied
        imgOhjelma(i).ToolTipText = tied
        'lasketaan seuraavan kuvakkeen paikka
        x = x + 32 + 5
        If x + 32 + 5 >= Me.ScaleWidth Then
            x = 5
            y = y + 32 + 5
        End If
        'haetaan seuraava tiedosto hakemistosta
        tied = Dir
    Wend
End Sub

Private Sub imgOhjelma_Click(Index As Integer)
    'avataan Tagin mukainen ohjelma
    Dim d As Long
    d = ShellExecute(Me.hwnd, vbNullString, HAKEMISTO & imgOhjelma(Index).Tag, vbNullString, vbNullString, vbNormalFocus)
End Sub

juhaz [15.11.2003 02:25:05]

#

Kiitos Antti L, tuo on mahtava enkä olisi kyllä itse koskaan tuota kehittänyt ja koodi on vielä mukavasti kommentoitu suomeksi :)

Kai tarkoitat tuolla imgOhjelma siis ihan vain image objektia vai onko se sitten picture objekti? Image objektissa ei näy mitään kuvia ja picture objektina kaikki toimii, mutta ohjelman kuvaketta ei näy vaan pelkkä harmaa boxi, mutta kummallakin tapaa kuitenkin ohjelmien käynnistys toimii jotenkuten paitsi, että image objektia käytettäessä vain yksi ohjelmista toimii ja loput valittaa "file not found"... tjs ja saa todellakin niitä kuvakkeita formilla etsiä, kun ei mitään tietoa muista ohjelmista kuin vain siitä yhdestä.

ps: Käytössäni on Visual Basic 5

Edit: väitin väärää ensin

Blaze [15.11.2003 12:23:36]

#

Vaikuttaa aika kewliltä, mutta eipä tosiaan minullakaan näytä kuvia laatikoissa. Käynnistys tuntuis toimivan. VB6/Windows Server 2003

Antti Laaksonen [15.11.2003 12:35:53]

#

Kokeilkaapas laittaa formin AutoRedraw-ominaisuuden arvoksi True. Ja imgOhjelma on tosiaan Image.


Sivun alkuun

Vastaus

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

Tietoa sivustosta