19. juli 2002 - 18:32Der 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 ?
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.
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.
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
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.
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
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.
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.
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.
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.
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?
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.
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 :-)
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.
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
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 !!!
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
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?
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?
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å!
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.