07. september 2004 - 08:33Der er
35 kommentarer og 2 løsninger
Problemer med ini funktion
Hej,
Jeg har kæmpet med et problem siden fredag, og har pejlet mig ind på hvor det går galt for mig...
Jeg har en funktion der henter nogle værdier fra en ini fil. Hvis jeg skriver dem ud i tekstboxe, eller i msgsbox'e virker det ganske glimrende...
Hvis jeg vil have dem i en sammenhæng, lad og sige msgbox (værdi1 & værdi2) kikser den. Den tager kun værdi1 med, og dropper simpelthen alt hvad der står efter...
Min funktioner ser således ud:
Public Function CallINI(txtSection As String, txtKey As String, txtPath As String) As String ' Funktionen henter værdier fra inifil. Dim sValue As String Dim lSize As Long Dim lTemp As Long Dim sDefault As String sValue = String(256, " ") lSize = Len(sValue) lTemp = GetPrivateProfileString(txtSection, txtKey, sDefault, sValue, lSize, txtPath) If lTemp <> 0 Then CallINI = sValue Else CallINI = sDefault End If End Function
Jeg anvender VB5 og bruger slet ikke den syntaks som du anvender - jeg er selvlært.
On Error GoTo fejlini Open App.Path & "\fotos.ini" For Input As #1 For a = 0 To 19 Line Input #1, ini(a) If a < 16 Then txtini(a).Text = ini(a) Next Close #1 txtalbum.Text = ini(7)
netsti = ini(0) bmpsti = ini(1) jpgsti = ini(2) postnumsti = ini(3) pspsti = ini(4) baksti1 = ini(5) orgsti = ini(6) albumsti = ini(7) If Len(ini(12)) > 0 Then knscpos.Caption = Left(ini(12), 1) ' "P" If Len(ini(13)) > 0 Then knscneg.Caption = Left(ini(13), 1) ' "N"
frmfoto.Top = Val(ini(14)) frmfoto.Left = Val(ini(15)) chkover.Value = Val(ini(16)) 'om der spørges om overskrivning ved gem eller ej chk2.Value = Val(ini(17)) chk3.Value = Val(ini(18)) chk4.Value = Val(ini(19))
'filter for private poster If chk4.Value = 1 Then txtlab(6).Visible = False txtdata(6).Visible = False End If
Det betyder at værdierne i ini-filen må have en helt fast placering og ikke stå under nogle sektions-overskrifter. Men det fungerer.
Nu er det bare sådan, at min ovenstående kode er lidt "mindre" og lidt mere flexibel - Og den virker... næsten... Vil bare gerne have løst den bug, ikke til at lave hele funktionen om... Men ellers godt forslag :)
Lige for at komme med et andet eksempel på hvordan jeg kalder en ini.........
I et bas modul:
'Declaretion for writing to an .ini file
Public Declare Function WritePrivateProfileString _ Lib "kernel32" Alias "WritePrivateProfileStringA" _ (ByVal lpApplicationname As String, ByVal _ lpKeyName As Any, ByVal lsString As Any, _ ByVal lplFilename As String) As Long
'Declaretion for read from an .ini file
Public 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
'variables for reading and writing .ini files 'They are dimensioned here becaus then the module 'can be freely moved to other programs
Global lngResult As Long Global strFileName Global strResult As String * 50
Hvis jeg bytter om på IP_HOST og USER_NAME, viser den usernavnet
Grunden til mit experiment, er fordi jeg vil have instillinger til min database opsætning i en ini fil - Og min database funktion fatter ikke at få alle parametrene med.. .Den tager den førster, og så stopper den... Så er resten bare "væk"...
Den virker, hvis jeg vel og mærke kun skal bruge 1 værdi, eller jeg skal bruge dem forskudt fra hinanden...
Jeg har sat sDefault til at være "Fejl" nu, og hvis jeg sætter 256 ned til 1, melder den FEJL FEJL, hvilket indikere at så får den begge værdier med... Men ændre jeg tallet i andre retninger, virker det ikke... hvis jeg sætter den til bare 10, får den kun de første 10 tegn med af første værdi...
Public 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
'variables for reading and writing .ini files 'They are dimensioned here becaus then the module 'can be freely moved to other programs
Global lngResult As Long Global strFileName Global strResult As String * 50
Hvis man lige husker at sige: Dim strFileName, strResult, lngResult As String - Hvilket jeg tror du glemte? :) - Så siger den 2x "An error has occureed", og kommer så med en popupbox hvor kun ip adressen er
Med variabler kan jeg ikke få den til at gøre det du vil.....
Men du skulle kunne gøre følgende:
Sæt 2 textboxe ind (txtUserName og txtIpHost)
bas modul:
'Declaretion for read from an .ini file
Public 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
'variables for reading and writing .ini files 'They are dimensioned here becaus then the module 'can be freely moved to other programs
Global lngResult As Long Global strFileName Global strResult As String * 50
og Form kode:
Private Sub Form_Load() Text1.Visible = False Text2.Visible = False End Sub
Hov til min metode er det ikke Text1 og Text2 men txtIpHost.Text og txtUserName.Text
Hvorfor den ikke vil med de variabler fra ini filen ved jeg ikke, prøvede at lave noget med variable jeg selv satte i koden og der virkede msgboxen......
Jeg får lige kigget videre på det igen imorgen på arbejde :) Men ærgeligt at man ikke kan få de åndsvare variabler bixet sammen :( Kan ikke rigtigt bruge textboxe i et modul :(
Svaret var, at lægge det ind i nogle skjulte textboxe, hvorefter man hiver værdien fra dem, over i funktionen - Spørg mig ikke hvorfor man skal dette igennem, men det virker :) Så point til jer... Tubber, du du har ikke lagt et svar, så du bliver lige udlukket af point denne gang - Er lige ved at rydde ud i mine åbne spørgsmål :(
Synes godt om
Ny brugerNybegynder
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.