Page 1 of 2

Pulling data from an external file

Posted: Tue Feb 20, 2007 4:22 pm
by quailcreek
Hello once again,
Does Rev support an INI type external file structure? I want to pull information for an external file.

[objectName]
color=red
highlighted=false


Thanks
Tom

Posted: Tue Feb 20, 2007 4:34 pm
by malte
Could you be a bit more specific what exactly you are trying to do?

Set object properties depending on data fetched from an external file? Which is the bit you are having problems with? Reading the file? Storing it? Setting the properties?

All the best,

Malte

Posted: Tue Feb 20, 2007 6:01 pm
by quailcreek
Malte,
Sorry for being vague. I case you’re not familiar, INI files allow you to store and retrieve information by calling the header and item data. The structure is getIniVar(header,item,path to the INI file). One of the things I use this for is to set the highlight of buttons. My script in toolbook looks like this: highlight of buttonx = getIniVar(name of buttonx,item1,path to file). This way I can store data in a file so that when the app is updated the user defined information i.e. whether a button has been highlighted, can be pulled from the ini file and doesn’t need to be stored in the app itself.

[header]
Item1=true
Item2=valueofsomething

Thanks
Tom

Posted: Wed Feb 21, 2007 1:31 pm
by Mark
Took me 5 minutes. Let me know if there are any problems.

Code: Select all

function iniVar theHeader,theItem,thePath
  open file thePath
  read from file thePath until EOF
  close file thePath
  put it into myIniData
  filter myIniData without ";*"
  put offset("[" & theHeader & "]",myIniData) into myStartChar
  if myStartChar > 0 then
    if char (myStartChar + 1) to -1 of myIniData contains "[" then
      put offset("[",myIniData,myStartChar + 1) + myStartChar into myLastChar
      put char myStartChar to myLastChar of myIniData into myIniData
    else
      put char myStartChar to -1 of myIniData into myIniData
    end if
    delete line 1 of myIniData
    split myIniData by return and "="
    return myIniData[theItem]
  else
    return empty
  end if
end iniVar

Usage:

get inivar(header,item,file)


Best,

Mark

Posted: Wed Feb 21, 2007 4:18 pm
by quailcreek
Very nice, Mark.
I'll make a test run later today and let you know. In the mean time, if you have another 5 minutes to spare. There is the other side of the coin. setIniVar(header,item,value,path) where the value is saved into the file.

;-)
Tom

Posted: Wed Feb 21, 2007 10:50 pm
by quailcreek
Mark,
Please excuse my ignorance but should I do a "put it" to see the result? I have been doing a “put myIniDataâ€

Posted: Wed Feb 21, 2007 10:55 pm
by Mark
Hi Tom,

If I did it correctly, you can call the function like this:"

put inivar(header,item,file)

and you will see the result in the message box. If not, I might have to do some debugging.

Best,

Mark

Posted: Wed Feb 21, 2007 11:06 pm
by quailcreek
Sorry, Mark. I'm not seeing anything in the message box.

Tom

Posted: Wed Feb 21, 2007 11:23 pm
by Mark
Tom,

What exactly are you entering in the message box, including all parameters, and can you post a brief sample ini file?

Mark

Posted: Thu Feb 22, 2007 12:54 am
by quailcreek
Mark,
Sorry, I guess I wan't very clear. I'm not entering anything in the message box. I was trying to do a "put" to see the result.

In a button named "Sample" I have:

Code: Select all

on mouseUp
  get inivar(short name of target,"Color","path to Entries.ini")
end mouseUp
Along with your script.

This goes into a file named Entries.ini

Code: Select all

[Sample]
color=blue
highlighted=true
[Another Sample]
color=green
highlighted=false
[Yet Another Sample]
color=red
highlighted=false
theValue=325

Posted: Thu Feb 22, 2007 1:09 am
by Mark
What is the actual contents of the three parameters, i.e. the short name of the object and the path to the file?

Posted: Thu Feb 22, 2007 1:25 am
by quailcreek
Mark,
The short name of the target would be "Sample", the name of the button. And the path is "E:\MyRevStacks\Entries.ini" but that wil be different on your machine, right?

Tom

Posted: Thu Feb 22, 2007 1:30 am
by Mark
Hi Tom,

The path would be "E:/MyRevStacks/Entries.ini", because Revolution always uses forward slashes.

The following script works fine, with your sample file:

Code: Select all

on mouseUp
  answer file ""
  if it is not empty then
    put it into myFile
    open file myFile
    read from file myFile until EOF
    close file myFile
    put iniVar("Another Sample","color",myFile)
  end if
end mouseUp
I'll think about a script to write information to an INI file, but I need to find those 5 minutes :-)

Best regards,

Mark

Posted: Thu Feb 22, 2007 3:59 pm
by quailcreek
Thanks for your effort, Mark. But if RR can't handle reading and saving information to an external file better than this then, sadly, I guess I'm going to have to stay with Toolbook. I really like a lot of the things that RR has to offer but this is one I can't understand it not supporting.

Thanks again for your effort
Tom

Posted: Thu Feb 22, 2007 4:15 pm
by marielle
Tom,

It would help if you expressed your problem more clearly. Is it that you want to be able to read and write a full file? Is it that you want to be able to overwrite the value for a specific parameter?

First case:

Code: Select all

put myIniData into URL ("file:" & tPath & tFileName) 
This assumes that you know the value for tPath and the value for tFileName. If you don't, then use the approach proposed by Mark. "answer" will pop a dialog box asking you to specify a file. The file that is being specified is put into a it value. You then have.

Code: Select all

answer file "select the ini file to save the data in:"
put it into tFilePath
if it is not empty then 
     -- if the user pressed "cancel" and didn't specify a file, 
     -- then the value returned is empty
   put myIniData into URL ("file:" & tFilePath) 
end if
Second case:

you first need to read the data, find the relevant parameter in the file, replace the value.

Code: Select all

on iniFile.setValue pIniFile, pParameter, pNewValue
   if pIniFile is empty then exit iniFile.setValue
   if there is not a file pIniFile then exit iniFile.setValue
   if pParameter is empty then exit iniFile.setValue
   -----
   put URL ("file:" & pIniFile) into tIniData
   put lineoffset(cr & pParamater & "=", cr & tIniData) into tLineOffset
   put line tLineOffset of tIniData into tParamAndValue
   set the itemdel to "="
   put item 1 of tParamAndValue into tParam
   put tParam & "=" & pNewValue into line tLineOffset of tInitData
   put tIniData into URL ("file:" & pIniFile) 
end iniFile.setValue
If sections are important and you can have the same parameter name appearing in different sections, then you need to add a bit of code to handle this, but that's only a few lines more.

(written on the fly, in 2 minutes, not tested).