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?
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.
Kätevintä on tietysti käyttää MS Common Controlleista löytyvää ListViewiä (tai joku muu List* systeemi jokatapauksessa) :)
ImageListhän se on
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....
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
Loopja 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.
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 SubKiitos 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
Vaikuttaa aika kewliltä, mutta eipä tosiaan minullakaan näytä kuvia laatikoissa. Käynnistys tuntuis toimivan. VB6/Windows Server 2003
Kokeilkaapas laittaa formin AutoRedraw-ominaisuuden arvoksi True. Ja imgOhjelma on tosiaan Image.
Aihe on jo aika vanha, joten et voi enää vastata siihen.