Avatar billede locturian Nybegynder
07. september 2004 - 08:33 Der 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 kalder den sådan her:

IP_HOST = CallINI("General", "IP_HOST", App.Path & "/settings.ini")

Hvis nogen lige har svaret, er min dag reddet :)
Avatar billede joern Nybegynder
07. september 2004 - 11:28 #1
Hej.

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.

Koden udføres under FormLoad.  Programmet præsenteres på http://jkfsoft.dk/fotos.htm

M.v.h.  Jørn
Avatar billede locturian Nybegynder
07. september 2004 - 11:41 #2
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 :)
Avatar billede tubber Juniormester
07. september 2004 - 13:27 #3
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

og for at læse og skrive fra og til ini filen:

'Read option setup from .ini file

strFileName = App.Path & "\setup.ini"
lngResult = GetPrivateProfileString("Options", _
"ToTray", strFileName, strResult, Len(strResult), _
strFileName)

'Writes new setting to .ini file
   
strFileName = App.Path & "\Setup.ini"
lngResult = WritePrivateProfileString("Options", _
"ToTray", "2", strFileName)
Avatar billede tubber Juniormester
07. september 2004 - 13:27 #4
Prøv at komme med hele det stykke kode hvor du prøver at smide data i en msg box, altså kald til ini og msgboxen
Avatar billede locturian Nybegynder
07. september 2004 - 13:54 #5
IP_HOST = CallINI("General", "IP_HOST", App.Path & "/settings.ini")
USER_NAME = CallINI("General", "USER_NAME", App.Path & "/settings.ini")

msgbox (IP_HOST & USER_NAME)

Det returnere Ip adresse

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"...
Avatar billede thesurfer Nybegynder
07. september 2004 - 14:01 #6
Variablen sDefault sættes ikke til noget som helst?:

  Dim sDefault As String
...
  If lTemp <> 0 Then
    CallINI = sValue
  Else
    CallINI = sDefault ' her returneres sDefault, som indeholder ingenting?
  End If


Prøv at indsætte noget, i stedet for sDefautl:

    CallINI = "feeeeejl"
Avatar billede thesurfer Nybegynder
07. september 2004 - 14:05 #7
sValue sættes til at være 256 x " " (256 mellemrumme):

sValue = String(256, " ")

Er du sikker på at funktionen er korrekt?
Avatar billede locturian Nybegynder
07. september 2004 - 14:10 #8
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...
Avatar billede tubber Juniormester
07. september 2004 - 14:21 #9
Dimmer du IP_HOST og USER_NAME ?
Er de reserverede ?

Prøv med:

Dim varIpHost as String
Dim varUserName as String
varIpHost = CallINI("General", "IP_HOST", App.Path & "/settings.ini")
varUserName = CallINI("General", "USER_NAME", App.Path & "/settings.ini")
Avatar billede tubber Juniormester
07. september 2004 - 14:22 #10
og så:

msgbox(varIpHost & " - " & varUserName)
Avatar billede locturian Nybegynder
07. september 2004 - 14:34 #11
1. IP_HOST, USER_NAME osv.. Er alle global
2. HAR prøvet med at:

Dim TmpStr, TmpStr2 AS String
TmpStr = CallINI(....
TmpStr2 = CallINI(...

Msgbox(TmpStr & " " & TmpStr2)

Giver præcist samme resultat - Den skriver den første ud, men ikke den sidste...
Avatar billede tubber Juniormester
07. september 2004 - 14:37 #12
Prøv så lige sådan her:

IP_HOST = CallINI("General", "IP_HOST", App.Path & "/settings.ini")
MsgBox(IP_HOST)
USER_NAME = CallINI("General", "USER_NAME", App.Path & "/settings.ini")
MsgBox(USER_NAME)

bare for lige at se om den henter dem begge.......
Avatar billede tubber Juniormester
07. september 2004 - 14:38 #13
og kunne du evt. paste inifilens indhold....
Avatar billede locturian Nybegynder
07. september 2004 - 14:56 #14
Det virker fint, hvis jeg putter dem ud seperat...

Min inifil ser sådan her ud:

[General]
IP_HOST= "xxx"
DATA_SOURCE= 2
DATA_PORT= 3306
USER_NAME= "xxx"
USER_PASSWORD= "xxx"
DATABASE= PcMan
FILE_PATH=
Avatar billede tubber Juniormester
07. september 2004 - 15:07 #15
Prøv så den her:

MsgBox(CallINI("General", "IP_HOST", App.Path & "/settings.ini") & " - " & CallINI("General", "USER_NAME", App.Path & "/settings.ini"))
Avatar billede locturian Nybegynder
07. september 2004 - 15:14 #16
Akurat samme resultat... :(
Avatar billede tubber Juniormester
07. september 2004 - 15:21 #17
ok prøv følgende:

Opret et nyt bas modul og indsæt følgende kode:

'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
Avatar billede tubber Juniormester
07. september 2004 - 15:25 #18
Dernæst prøv at læse din ini sådan her:

strFileName = App.Path & "\setup.ini"
lngResult = GetPrivateProfileString("General", _
"IP_HOST", strFileName, strResult, Len(strResult), _
strFileName)

If lngResult = 0 Then
Call MsgBox("An error has occurred", _
vbExclamation)
Else
IP_HOST = Trim(strResult)
end if

strFileName = App.Path & "\setup.ini"
lngResult = GetPrivateProfileString("General", _
"USER_NAME", strFileName, strResult, Len(strResult), _
strFileName)

If lngResult = 0 Then
Call MsgBox("An error has occurred", _
vbExclamation)
Else
USER_NAME = Trim(strResult)
end if

MsgBox(IP_HOST & " - " & USER_NAME)
Avatar billede tubber Juniormester
07. september 2004 - 15:27 #19
Hvis det virker så ligger fejlen i din funktion vil jeg mene......

btw så skal strFileName = App.Path & "\setup.ini" se sådan her ud:
strFileName = App.Path & "\settings\setup.ini"
Avatar billede locturian Nybegynder
07. september 2004 - 15:31 #20
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
Avatar billede tubber Juniormester
07. september 2004 - 15:34 #21
Nej de er dimmet i bas modulet.....skulle de gerne være.....
Avatar billede locturian Nybegynder
07. september 2004 - 15:37 #22
Ah, så ikke lige det med den bas fil :)
Avatar billede locturian Nybegynder
07. september 2004 - 15:38 #23
Hum, ingen fejl nu, men den spytter stadig kun ip adressen ud :(
Avatar billede tubber Juniormester
07. september 2004 - 15:54 #24
samme her sidder og tester, med min metode så kan jeg få dem ud hver for sig altså med 2 msgboxe....

msgbox ip_host
msgbox user_name

kan godt køre dem ud sammen med en debug.print ip_host & user_name

skal lige ind og handle og så kigger jeg vidre på det....

/Tubber
Avatar billede tubber Juniormester
07. september 2004 - 18:20 #25
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

kode for at læse ini:

strFileName = App.Path & "\settings.ini"
lngResult = GetPrivateProfileString("General", _
"IP_HOST", strFileName, strResult, Len(strResult), _
strFileName)

If lngResult = 0 Then
Call MsgBox("An error has occurred", _
vbExclamation)
Else
Text1.Text = strResult
End If

strFileName = App.Path & "\settings.ini"
lngResult = GetPrivateProfileString("General", _
"USER_NAME", strFileName, strResult, Len(strResult), _
strFileName)

If lngResult = 0 Then
Call MsgBox("An error has occurred", _
vbExclamation)
Else
Text2.Text = strResult
End If


MsgBox (Text1.Text & " - " & Text2.Text)
End Sub
Avatar billede tubber Juniormester
07. september 2004 - 18:21 #26
Prøver lige at skrive din om......
Avatar billede tubber Juniormester
07. september 2004 - 18:23 #27
Med 2 textboxe igen igen med de navne

txtIpHost.Text = CallINI("General", "IP_HOST", App.Path & "/settings.ini")
txtUserName.Text = CallINI("General", "USER_NAME", App.Path & "/settings.ini")

msgbox (txtIpHost.Text & " - " " txtUserName.Text)
Avatar billede tubber Juniormester
07. september 2004 - 18:25 #28
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......
Avatar billede joern Nybegynder
07. september 2004 - 20:00 #29
Hej.

'Den flexible kildetekst' er blevet noget af en natbords-roman.  Håber I får det løst tilfredsstillende.

Med venlig hilsen  Jørn
Avatar billede tubber Juniormester
07. september 2004 - 20:26 #30
Hehe ja og god natlæsning til dig Jørn :)
Håber ikke din printer bliver træt :)
Avatar billede locturian Nybegynder
07. september 2004 - 21:38 #31
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 :(
Avatar billede tubber Juniormester
07. september 2004 - 23:08 #32
Jørn: Har siddet og kigget lidt på din rutine, det er vel egenligt bare at åbne den som en txt fil ?
Avatar billede tubber Juniormester
07. september 2004 - 23:19 #33
Jeg har nu prøvet at putte dem ind i et array i stedet for en variabel og det give samme resultat :(
Avatar billede tubber Juniormester
07. september 2004 - 23:28 #34
Tror du bliver nød til at kigge på joerns version, for tror ikke du får den til det du vil....nogen dybere forklaring kan jeg ikke komme med.....

Jeg har siddet og gået mit eget igennem, og jeg kan se alle steder jeg har brugt det der er det brugt med det samme og ikke gemt.......
Avatar billede thesurfer Nybegynder
09. september 2004 - 21:52 #35
- Jeg hopper ud af spm'et.
Avatar billede kdje Nybegynder
02. november 2004 - 19:08 #36
Hvis du striper de styrecode du få med ind fra din ini så virker det.
Så brug den her hvis du skal bruge den code dims du har der

MsgBox (Replace(IP_HOST, Chr(0), "") & Replace(USER_NAME, Chr(0), ""))
/KDJ
Avatar billede locturian Nybegynder
03. november 2004 - 09:50 #37
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 :(
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