Avatar billede acp Nybegynder
19. juli 2002 - 18:32 Der er 32 kommentarer og
1 løsning

Listbox

Hej Alle

Jeg er igang med et projekt hvor vi skal bruge et program der kan installere programmer som står inde i en listbox

Altså man vælger et produkt i en listbox (mærkere det) og installationen skal starte når man trykke på en knap

Nogle der kan hjælpe....

En anden ting ? Kan man lave sådan at listbox'sen indhold kommer fra en .INI fil, som man kan rette i, altså tilføje og fjerne programmer. Hvor der står i INI Filen:

Hvad Linie i Listbox'en skal være ?
Hvor Installationsfilerne ligger ?

Anders
Avatar billede kedde65 Praktikant
19. juli 2002 - 19:54 #1
Du kan ikke som standard få en listbox til at installere det program du klikker på, men du kan lægge dine progra navne + installationssti ind i en fast defineret format i en INI fil, og herefter hente det ind i et dobbelt array. Herefter burde det være en smal sag at starte instalationsprogrammet.

Jeg kigger lige på det!

VH CK
Avatar billede joern Nybegynder
19. juli 2002 - 20:07 #2
Hej Anders.

Det ser ud til at 'hajerne' er på sommerferie.
Jeg plejer aldrig at være første mand på spørgsmålene.

Ini-filer er jo blot tekst-filer der har denne ekstension for at lette genkendelsen (for mennesker) De er tænkt at indeholde opstart-data (initierings-data) som f.eks. farver, skriftsnit, vinduer placering på skærmen, sidst anvendte filer og den slags.

Du kan da godt gemme dine data i en fil med ini som ekstension, men du kan også kalde den 'anders.acp'

Jeg anvender selv ini-filer i stedet for at skrive til registrerings-databasen (hvad 'hajerne' gør) men jeg bruger desuden tekstfiler (ascii-filer) som databaser.

For at starte et program (setup.exe) i dit projekt, skal du anvende kommandoen i VB der hedder shell, - eksempel:

x = shell("C:\temp\setup.exe", 1)

Nogle udelader 'x =' og det kan man vist godt, når der ikke ønskes returneret om shell gik godt.

Når din liste skal vise hvilke programmer der skal installeres, dur det jo ikke at der bare står en sti og 'setup', der skal være et navn.  Navnet skal så være entydigt forbundet til den respektive sti og setup- eller install-fil.

Jeg ville lave en (ini) fil og kalde den program.dat  Den skulle indholde linierne parvis, programnavn og setup-sti.

Eksempel:

Paint Shop Pro
d:\pakker\psp\setup.exe
Notetab Light
d:\pakker\notetab\setup.exe
CuteFtp
d:\pakker\cuteftp\setup.exe
......

For alt læse filen skal den åbnes

Dim Prog(20), progsti(20) As String
Dim n As Integer

n = 0    '(er ikke nødvendigvis påkrævet)
Open app.path & "\program.dat" for input as #1
  Do While EOF(1) = False
    Line Input #1, prog(n)
    Line Input #1, progsti(n)
    list1.AddItem prog(n)
    n = n +1
  Loop
Close #1

I dette tilfælde med indekserede variable må listeboksen IKKE være med sorted = true 

Når du klikke i listen:

x = shell(progsti(list1.listindex),1)

Håber det kan hjælpe dig igang.  Har du ingen bøger eller links til VB-tips?

Skal du have hjælp til at skrive til filen fra dit program, vil jeg foretrække at sende et lille kartoteks-projekt som indeholder dette bl.a.

M.v.h.  Jørn
Avatar billede kedde65 Praktikant
19. juli 2002 - 20:11 #3
Og her kommer koden så

Dim path() As String

Private Sub Command1_Click()
    MsgBox path(Combo1.ListIndex)
End Sub

Private Sub Form_Load()
    Dim i As Integer
    Dim fso As FileSystemObject
    Dim reader As TextStream
    Set fso = New FileSystemObject
    i = 1
    Set reader = fso.GetFile(App.path & "\hula.ini").OpenAsTextStream(ForReading)
   
    While Not reader.AtEndOfStream
        ReDim Preserve path(i - 1)
        Combo1.AddItem reader.ReadLine
        path(i - 1) = reader.ReadLine
        i = i + 1
    Wend

    Set reader = Nothing
    Set fso = Nothing
End Sub

og husk at ini filen skal være i følgende format

Winzip
c:\Winzip\setup.exe
Photoshop
c:\AdobePhotoShop\inst\setup.exe

VH CK
Avatar billede kedde65 Praktikant
19. juli 2002 - 20:12 #4
Passer selvfølgelig ikke :-))

denne

Private Sub Command1_Click()
    MsgBox path(Combo1.ListIndex)
End Sub

Skulle være

Private Sub Command1_Click()
    shell path(Combo1.ListIndex)
End Sub

VH CK
Avatar billede joern Nybegynder
19. juli 2002 - 20:14 #5
Ja, mens jeg skrev kom kedde65 på banen.
Et to-dimensionelt array vil tillade at listeboksen er sorteret.  Så skal man blot løbe array'et igennem indtil der er match med navnet, der er klikket på og så udføre shell på sti-variablen.
Der er flere andre løsninger mulige, listen kan også indeholde både programnavn og inst-sti på hver linie med så mange blanktegn imellem at inst-sti ikke ses.  Så kan man med en streng-kommando uddrage inst-sti og lade shell køre med den.
Hvis der f.eks. indsættes en * lige før inst-sti bliver det let at bruge 'Instr' til at isolere inst-sti'en.

M.v.h.  Jørn
Avatar billede kedde65 Praktikant
19. juli 2002 - 20:25 #6
Husk iøvrigt i mit eksempel at sætte en reference til "Microsoft Scripting Runtime" ellers får du lidt bøvl med compileren.

VH CK
Avatar billede acp Nybegynder
19. juli 2002 - 20:46 #7
Hej Jørn

Den fejler når jeg prøver:

jeg vælger et program i listen (list1) og vælger at installere det via knappen (command1)

Så kommer den og siger: "Compile Error: Sub or Function not defined", den brokker sig over "progsti" under command1_click

Her er hele koden:
Private Sub Command1_Click()

X = Shell(progsti(List1.ListIndex), 1)

End Sub

Private Sub Form_Load()

Dim Prog(20), progsti(20) As String

Dim n As Integer


Open App.path & "\select.ini" For Input As #1
  Do While EOF(1) = False
    Line Input #1, Prog(n)
    Line Input #1, progsti(n)
    List1.AddItem Prog(n)
    n = n + 1
  Loop

end sub
Avatar billede kedde65 Praktikant
19. juli 2002 - 20:53 #8
Er det ikke fordi du ikke har en kombobox der hedder List1??

VH CK
Avatar billede kedde65 Praktikant
19. juli 2002 - 20:55 #9
Jamen progsti er jo også erklæret lokalt. Linien
Dim Prog(20), progsti(20) As String
skal du sætte helt udenfor alle dine procedurer. Fejlen er simpelthen at du referere til et array der ikke findes.

VH CK
Avatar billede acp Nybegynder
19. juli 2002 - 21:01 #10
Kedde >> Min listbox hedder list1 :)

Denne linie Hvor henne vi du have den ?
Dim Prog(20), progsti(20) As String

Den er i form_load Det må da være det eneste sted som jeg kan se at den skal ligge...
Avatar billede kedde65 Praktikant
19. juli 2002 - 21:04 #11
Nej fordi så bliver den erklæret lokalt og dermed kan den ikke ses udenfor den procedure. Sæt den som den øverste linie i projektet så skulle det virke.

VH CK
Avatar billede acp Nybegynder
19. juli 2002 - 21:11 #12
Kommer og siger Run-Time 53 file not found....

Og det er den rigtige stil...

Den siger at problemer med denne linie
X = Shell(progsti(List1.ListIndex), 1)
Avatar billede kedde65 Praktikant
19. juli 2002 - 21:14 #13
File not found - det betyder ihvertfald at filen ikke findes på den placering som du har angivet. Prøv lige at skrive følgende kode lige før der hvor det giver fejl.

msgbox progsti(List1.ListIndex)

og se om det er den rigtige sti der står der.

VH CK
Avatar billede acp Nybegynder
19. juli 2002 - 21:18 #14
Fejlen er fundet:

Dim n As Integer skulle samme sted hen som Dim Prog(20), progsti(20) As String, nu virker det.... tak for hjælpen...

Joern får disse 200 piont, og opretter et spm mere så for kedde også 200 piont...
Avatar billede kedde65 Praktikant
19. juli 2002 - 21:20 #15
ok - jeg fatter nu ikke hvorfor n skulle ud og stå som en global variabel. Men det er jo også ligemeget, bare det virker. JEg vil dog anbefale dig at bruge så få Globale variable som muligt, for det kan blive noget rod.
Avatar billede jelzin101 Praktikant
19. juli 2002 - 21:46 #16
jf. www.exp.dk/regler.phtml 2.1.15 er det ikke tilladt at give mere end 200 point for ét spørgsmål.

Mvh.
Jelzin101/CoAdmin.
Avatar billede joern Nybegynder
20. juli 2002 - 01:02 #17
acp >>  Det er lidt sent, jeg kommer ind.  Kedde har hjulpet med at løse problemet og jeg får pointene :-)

Kedde foreslog meget fornuftigt at definere et dynamisk array.  Anders, du skal selvfølglige ændre de 20 til det tal, der kan forekomme.

Dimensionering af variable skal stå under 'General' hvis ikke de ærklæres i et modul.
Men i et modul skal de ærklæres globale.
Jeg deler ikke keddes betænkelighed ved globale variable, det giver den fordel at de så uden videre kan overføre værdier mellem forme.
Har man mange kan man løbe tør for bogstaver, så må de jo have mere end ét.

Kedde er prof VB, det er jeg ikke.  Min kode er jo præget af gammel DOS-GWBasic og VB3 som jeg startede med.  Men for en nybegynder er det måske det mest fremkommelige.

Glad for at Anders fik det til at virke.  Men hvad med når datafilen skal oprettes, gør du det i notepad?

M.v.h.  Jørn
Avatar billede joern Nybegynder
20. juli 2002 - 01:03 #18
Ups.  Jeg ved da godt det staves erklæres!
Avatar billede jelzin101 Praktikant
20. juli 2002 - 02:47 #19
acp>> jeg vil ikke gå ind og dømme hvem der skal have pointsene, det vil jeg lade dig om, men mulighederne er:
a) kedde65 beholder de 200, joern opretter et spørgsmål og tilbagebetaler de 200.
b) joern beholder de 200, kedde65 opretter.....
c) hver af de to pointmodtagere opretter et spørgsmål med 100 point som du svarer på, hvorved den samlede afgavne pointsum i dette spørgsmål vil være 200 point.

Mvh.
Jelzin101/CoAdmin.
Avatar billede kedde65 Praktikant
20. juli 2002 - 13:03 #20
Jamen når nu vi er kommet i modvind med ekspertens regler, så må vi jo hellere gøre noget ved det. Joern jeg foreslå at vi deler pointene, vi opretter begge et spørgsmål på 100 som acp svarer på.

Der er jo ingen grund til at Jelzin skal have ret i sin sag :-)

VH CK
Avatar billede joern Nybegynder
20. juli 2002 - 15:39 #21
Kedde>>  Gerne for mig, men kan det overhovedet løses på den måde?  Vi bør lige afvente at Anders giver sig til kende og aftale at han så svarer.  Jeg har engang foræret 1000 point til 'den kvikke kanin' her på eksperten, men han var længe om at forstå, at det var det der var øvelsen.

M.v.h.  Jørn
Avatar billede acp Nybegynder
21. juli 2002 - 01:38 #22
Okay jeg kan se at dette har vækket en del oprøre... Men jeg har sku lige brug for jeres hjælp til at afslutte dette ! Er der en der kan sende et komplet projekt med den source kode som Joern skrev... jeg har en del problemer med at den siger "Path not found" og et den ikke vil godtage denne linie

"X = Shell(progsti(List1.ListIndex), 1)"

Mit ser sådan ud:

Dim n As Integer

Dim Prog(20), progsti(20) As String
Private Sub Form_Load()
    n = n + 1

Open App.Path & "\select.ini" For Input As #1
  Do While EOF(1) = False
Line Input #1, Prog(n)
Line Input #1, progsti(n) ' Problemer med denne linie (Path not found)
List1.AddItem Prog(n)
       
  Loop
Close #1

Private Sub Command1_Click()

    MsgBox "Programmet afsluttes, da du har valgt at installere et program.", vbInformation
        X = Shell(progsti(List1.ListIndex), 1)

jeg kan også kun installere de sidste program som findes i select.ini filen

Sådan ser Filen ud:

Microsoft Windows 2000 Professional - Service Pack 2 - Dansk
I:\Service Pack 2 - Windows 2000\DK\W2KSP2.EXE
Avatar billede acp Nybegynder
21. juli 2002 - 01:48 #23
Jeg testede lige igen: Følgende Fejl kommer:

Når jeg vælger det øverste program i list1  og vælger at trykke på command1 kommer den med denne fejl "File Not Found", vælger jeg debug kommer jeg hen til denne linie:

X = Shell(progsti(List1.ListIndex), 1)

Og det er den rigtige Stil !!! Min Select.ini

Microsoft Windows 2000 Professional - Service Pack 2 - Dansk
I:\Service Pack 2 - Windows 2000\DK\W2KSP2.EXE
Microsoft Windows 2000 Professional - Service Pack 2 - Dansk
I:\Service Pack 2 - Windows 2000\UK\W2KSP2.EXE

Vælger jeg linie 2 i listen og trykker på command1 virker det !!!

Hjæææælp

Anders
Avatar billede kedde65 Praktikant
21. juli 2002 - 08:59 #24
Her kommer hele koden udfra Joerns forslag. Jeg har lavet noget om i det, men nu virker det.

Dim n As Integer
Dim Prog() As String, progsti() As String

Private Sub Form_Load()
    n = 1
    Open App.Path & "\select.ini" For Input As #1
    Do While EOF(1) = False
        ReDim Preserve progsti(n)
        ReDim Preserve Prog(n)
        Line Input #1, Prog(n - 1)
        Line Input #1, progsti(n - 1) ' Problemer med denne linie (Path not found)
        List1.AddItem Prog(n - 1)
        n = n + 1
    Loop
Close #1
End Sub

Private Sub Command1_Click()
    MsgBox "Programmet afsluttes, da du har valgt at installere et program.", vbInformation
    X = Shell(progsti(List1.ListIndex), 1)
End Sub


VH CK
Avatar billede joern Nybegynder
21. juli 2002 - 11:06 #25
anders>>
Kedde har sikkert ADSL så en mail straks 'plinger' ind i hans øregang :-)  Jeg bruger modem og tjekker 3-4 gange i dagens løb.
Det med tælleren: n    Idéen er selvfølgelig at den skal tælle én op for hver linie der læses i din ini-fil.  Derved kan man referere til den rigtige streng når man klikker i listen.
Et klik i listen tildeler returnerer et nummer, nemlig liniens nummer - der startes med nul.  Dette tal indeholdes i 'list1.listindex'
Et array er en række værdier der identificeres med et nummer, ligesom fodboldspillere har et nummer på ryggen.
Det dér med (n-1) u keddes kode skyldes at han lader n starte med værdien én (n=1).  Hvis n starter med nul skal der ikke stå (n-1).

Når man dimensionerer et array prog() - uden at angive et tal i parantesen, så kan array'et anvendes dynamisk med 'Redim Preserve'  Hvis man på forhånd ved hvor mange poster der maksimalt kan forekomme, kan man skrive det ved Dimensioneringen.

Hvis man dimensionerer er array stort for at være på den sikre side, koster det noget ram til ingen nytte, fordi der oprettes 'kasser' til værdier, der ikke udnyttes.
Dynamisk array er fint, når blot man forstår det.
On-line hjælpen forklarer jo udmærket funktionen af både shell og de øvrige kommandoer, så bliv klogere dér.


Kedde>> Det med point kan vi to vel klare indbyrdes, jeg laver et spørgsmål, som du svarer på.
I øvrigt har jeg forsøgt at lave dynamisk array i 2 dimensioner i VB5.  Kan du bekræfte, at det ikke tillades, - og kan man i VB6?

M.v.h.  Jørn
Avatar billede kedde65 Praktikant
21. juli 2002 - 11:23 #26
Ja det er fuldstændigt korrekt at jeg har ADSL, og ligeledes en exchange server der står og knokler så derfor kommer der mail med det samme :-))


Joern>>Angående point jeg tror ikke Expertens regler bliver tilfredstillet ved at jeg svarer på et af dine spørgsmål! Eller det var måske ikke det du referede til.

Joern>>Dynamiske Array i 2 dimensioner - hvordan mener du?

VH CK
Avatar billede joern Nybegynder
21. juli 2002 - 11:46 #27
kedde>>  Tak for svar.  Jo jeg mente at hvis de 200 point jeg har fået af Anders skal deles mellem os, så er det da det enkleste at jeg afgiver 100 til dig.  Ellers skal jeg stille et spørgsmål til Anders, som så skal stille et nyt spørgsmål til dig.
I øvrigt interesserer point mig slet ikke, og jeg har rigeligt til at kunne stille spørgsmål selv.

Et array kan f.eks. dimensioneres i 3 (om mange flere dimensioner)  melodi (20,12,500)

Jeg har 500 grammofonplader med indtil 12 skæringer og op til 20 oplysninger om hver skæring.  Det kan jeg indlæse i et array om opnå lynhurtig søgning, uden at læse fra disken igen.

Jeg mener der kan være 60 dimensioner i et array, men hvad med dynamisk tildeling?

Dette opretter jeg tillige som et spørgsmål til 100 point, som du kan svare på!
Avatar billede kedde65 Praktikant
21. juli 2002 - 11:59 #28
Okay - Det er lidt noget rod det her. Men jeg har fået 200 point af Anders. Derfor skal jeg faktisk også af med 100 point. Dvs...noget rod.

Løsning - du opretter et spørgsmål til anders på 100 og det samme gør jeg. På den måde er det ude af verdenen :-))

VH CK
Avatar billede NanoQ Nybegynder
29. juli 2002 - 13:13 #29
Hmmm... har man efterhånden fundet ud af det? :)

NanoQ/coadmin
Avatar billede resten Nybegynder
31. juli 2002 - 21:41 #30
joern-> Skal du ikke også se at oprette et spørgsmål til acp med 100 point som kedde65 så vi kan komme vidre ?

http://www.eksperten.dk/spm/237775

Resten\CoAdmin
Avatar billede joern Nybegynder
31. juli 2002 - 22:21 #31
Resten>> Har vi et problem her stadigvæk?

Det bliver så bare et "Point til Anders", så vi ikke ulejliger andre med at skulle svare.

M.v.h.  Jørn
Avatar billede resten Nybegynder
31. juli 2002 - 22:24 #32
Perfekt så kan vi lukke de andmeldser der er :-)
Avatar billede resten Nybegynder
31. juli 2002 - 22:26 #33
acp-> Så kan du godt komme og svare på disse 2
http://www.eksperten.dk/spm/241644
http://www.eksperten.dk/spm/237775
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester