Avatar billede safl Nybegynder
28. november 2001 - 14:08 Der er 12 kommentarer og
4 løsninger

Ini-filer

Hello!

Jeg skal bruge nogle eksempler på hvordan man læser/skriver fra og til ini-filer. Jeg ville ikke have nogle \"classes\" men kun ren kode.

på forhånd tak
safl
Avatar billede terry Ekspert
28. november 2001 - 14:10 #1
You should concider using the registry and NOT ini files, they went out with Windows 3.1
Avatar billede goz Nybegynder
28. november 2001 - 14:10 #2
Avatar billede goz Nybegynder
28. november 2001 - 14:12 #3
Avatar billede goz Nybegynder
28. november 2001 - 14:13 #4
Jeg er iøvrig enig med terry i at du børe overveje at gemme dine info i Registry
Avatar billede safl Nybegynder
28. november 2001 - 14:13 #5
qoz > broken link
Avatar billede goz Nybegynder
28. november 2001 - 14:15 #6
ups. Her er det første link igen. Her finder du også eksempler på read/write til reg.
http://www.vbcode.com/asp/code.asp?lstCategory=Registry
Avatar billede winkill Nybegynder
28. november 2001 - 14:15 #7
Declare Function WritePrivateProfileString Lib \"kernel32\" Alias \"WritePrivateProfileStringA\" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As Any, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileSection Lib \"kernel32\" Alias \"WritePrivateProfileSectionA\" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
Declare Function GetPrivateProfileSection Lib \"kernel32\" Alias \"GetPrivateProfileSectionA\" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Declare Function GetPrivateProfileString Lib \"kernel32\" Alias \"GetPrivateProfileStringA\" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Property Get INI(sFile As String, sSection As String, sKey As String) As String
    Dim sValue As String
    sValue = String$(128, 32)
    Call GetPrivateProfileString(sSection, sKey, \"Failed\", sValue, Len(sValue), sFile)
    If Left(sValue, 6) <> \"Failed\" Then
        sValue = RTrim(sValue)
        sValue = Left(sValue, Len(sValue) - 1)
        INI = sValue
    End If
End Property

Property Let INI(sFile As String, sSection As String, sKey As String, ByVal sValue As String)
    Call WritePrivateProfileString(sSection, sKey, sValue, sFile)
End Property


\' Eksempel
INI(\"c:\\test.ini\", \"Mit-Program\", \"Titel\") = \"Test program\"
INI(\"c:\\test.ini\", \"Mit-Program\", \"Version\") = \"1.0\"

Debug.Print INI(\"c:\\test.ini\", \"Mit-Program\", \"Titel\")
Debug.Print INI(\"c:\\test.ini\", \"Mit-Program\", \"Version\")
Avatar billede joern Nybegynder
28. november 2001 - 14:45 #8
Hej.
Jeg synes at registreringsdatabasen er roden til megen forvirring i win9x\'s funktioner, så den holder jeg mig fuldstændig fra.

Eksemplet er revet ud f sit program, men det giver vel en ide.  Vil du bruge det kan jeg også indsætte det område hvor man skriver til og gemmer i ini-filen.

If Dir(App.Path & \"\\jkfaerge.ini\") = \"\" Then
    X = MsgBox(\"Der er ingen initieringsfil, den oprettes nu med standardværdier.\", 64, \"Medd. fra programstart.\")
    Open App.Path & \"\\jkfaerge.ini\" For Output As #1
      Print #1, netsti
      Print #1, \"Standardværdier indsat \" & Date
      Print #1, \"2\"            \'antal uger for automatisk sletning
      Print #1, \"1\"            \'hvis sejler færge 1
      Print #1, \"1\"            \'hvis sejler færge 2
      Print #1, \"True\"          \'hvilken fartplan der åbnes med
      Print #1, \"False\"        \'hvilken fartplan der åbnes med
      Print #1, \"5\"            \'grænse for farveskift ved få ledige pladser
      Print #1, \"10\"            \'sekunder mellem test for autoopdateringer
      Print #1, \"False\"        \'om programmørens knapper vises ved åbning
      Print #1, \"ini 11\"        \'disponibel
      Print #1, \"ini 12\"        \'disponibel
      Print #1, \"ini 13\"        \'disponibel
    Close #1
    txtini(1).Text = \"Standardværdier indsat \" & Date    \'(1)
    txtini(2).Text = \"2\"                                  \'(2)
    ini(2) = \"2\"
    sletuge = ugenr - 2                                  \'(2)
    chksejler(0).Value = 1                                \'(3)
    chksejler(1).Value = 2                                \'(4)
    fs = 5                                                \'(7)
    opd = 10                                              \'(8)
    ini(9) = \"0\"                                          \'(9) Programmørens knapper
    \'Hundested vælges som afgangshavn med vintersejlplan  \'(5)
    optstart(0).Value = True
    optplan(0).Value = True
    tidfil = \"A01.dat\"
    knplan1_Click              \'her indlæses afgangstider
       
    GoTo nyini:
  End If
     
  n = 0
  On Error GoTo inifejl
  Open App.Path & \"\\jkfaerge.ini\" For Input As #1
    Do While EOF(1) = False
      Line Input #1, ini(n)
      n = n + 1
      If n >= 21 Then Exit Do
    Loop
  Close #1
 
  If Len(ini(0)) > 5 Then netsti = ini(0)
 
  \'oprettelse af bookdat.tid og lokaltid
  Open netsti & \"bookdat.tid\" For Output As #5
    Print #5, Now
  Close #5
  Open App.Path & \"\\lokal.tid\" For Output As #5
    Print #5, Now
  Close #5
 
nyini:
  \'Data indsættes i ramme for redigering af initierings-data
  txtini(0).Text = netsti
  txtini(1).Text = ini(1)
  txtini(2).Text = ini(2)
 
  \'antal uger for autosletning
  If ugenr < 12 Then sletuge = \"0\" & ugenr - 2 Else sletuge = ugenr - 2
  If IsNumeric(ini(2)) Then
    If ugenr - Val(ini(2)) < 10 Then
        sletuge = \"0\" & ugenr - Val(ini(2))
      Else
        sletuge = ugenr - Val(ini(2))
    End If
  End If
  labsletuge.Caption = sletuge
   
  If IsNumeric(ini(3)) Then chksejler(0).Value = Val(ini(3))
  If IsNumeric(ini(4)) Then chksejler(1).Value = Val(ini(4))
     
  \'Forberedelse af indlæsning af sejlplanernes afgangstider
  \'-----------------------------------------------------------------

M.v.h.  Jørn
Avatar billede safl Nybegynder
28. november 2001 - 15:03 #9
jørn > jeg fatter ikke en brik af det du skriver der :) funktionerne: ini() og nyini() går jeg udfra at du har deklæret et andet sted? Kan jeg ikke få de funktioner der læse og skriver?
Avatar billede joern Nybegynder
28. november 2001 - 17:44 #10
Safl>> Hyg dig med registry !

M.v.h.  Jørn
Avatar billede safl Nybegynder
29. december 2001 - 01:05 #11
Til andre der løber ind i samme problem, det her er alt hvad i skal bruge:
Option Explicit

Private Declare Function GetPrivateProfileString Lib \"kernel32\" Alias \"GetPrivateProfileStringA\" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
   
   
Private Declare Function WritePrivateProfileString Lib \"kernel32\" Alias \"WritePrivateProfileStringA\" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Og her er en god beskrivelse af API\'en.
http://www.vbapi.com/ref/g/getprivateprofilestring.html

Ellers tak for svarene terry, goz, winkill og joern.
Avatar billede Slettet bruger
29. december 2001 - 17:29 #12
Hvorfor bruger du ikke bare de tre indbyggede registry-funktioner der er i VB?

SaveSetting()
GetSetting()
DeleteSetting()

Det er da nemmere end at bruge eksterne filer.
Avatar billede safl Nybegynder
29. december 2001 - 17:36 #13
Jeg programmerer ikke normalt i VB. Jeg er PHP og Delphi tilhænger men desværre skulle vi have VB i Datalogi på mit gymnasie og der skulle vi så løse en opgave med ini-filer. Derfor kunne jeg ikke bare bruge registry.
Avatar billede Slettet bruger
29. december 2001 - 20:24 #14
Ja, så kan det jo ikke rigtig bruges til noget :)
Avatar billede safl Nybegynder
29. december 2001 - 20:45 #15
hehe nej :) Men havde det været en program jeg skulle have brugt til noget fornuftigt så ville jeg have gjordt noget helt tredje, gemt data i en MySQL database og programmeret det i Delphi.
Avatar billede joern Nybegynder
30. december 2001 - 10:58 #16
Jamen altså:
Dim inidata(20) as string


I form load læser du din ini-fil.

x=0
Open App.Path & \"\\program.ini\" for Input As #1              \'eller c:\\windows\\ hvis du vil have filen dér
  Do while EOF(1) = False
    Line Input #1, inidata(x)
    x=x+1
  Loop
Close #1

Så har du de forskellige værdier (hvad det nu er !) i array\'et inidata, derpå må du jo anvende dem.
Det kunne være formens placering på skærmen, stier til datafiler, tællere, farver eller hvad ved jeg.

Et eller andet sted skal disse værdier jo kunne sættes og gemmes.  Hvis du har en frame eller form
med indekserede tekstfelter så f.eks.:


Open app.path & \"\\program.ini\" for output as #1
For x=0 to 17   
  print #1, tekst1(x).text
Next x
Close #1

Hvis der altså ER 17 værdier.

Den eksisterende ini-fil overskrives fuldstændig, så det er vigtigt at de omtalte tekstfelter alle ajourføres
med de respektive ini-værdier ved programstart, også de der ikke ændres i sessionen.
Gælder det f.eks. tællere, farveindstillinger, placering af forme etc. kan det automatiseres i lukke-funktionen at der skrives til ini-filen hver gang.
For at kunne anvende tal-værdier som tal, må anvendes funktionen Val forinden:
  Form1.top = Val(inidata(7))

Nu hører du ikke mere fra mig, jeg står af spørgsmålet.  M.v.h.  Jørn

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
Kategori
Kurser inden for grundlæggende programmering

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