Difference between revisions of "ReNamer:Pascal Script:Reuse variable"

From den4b Wiki
Jump to: navigation, search
m (just clean up a bit)
m (Add example to use single file to store many vars/values)
Line 1: Line 1:
== This page is work in process!==
+
== --- This page is work in process! --- ==
 +
 
 +
currently i just collect here a few information and POC proof of concept code.
 +
 
 +
I want to clean up this page later.
 +
 
 +
If you want to help please do so.
 +
 
 +
 
 +
 
 +
== Set/Get or Write/Read or Save/Load variable values ==
  
  
Line 16: Line 26:
  
  
==First we take a look on the file approach.==
+
== the file approach ==
 +
 
 +
First we take a look on the file approach.
  
 
We use simple plain text files to store the variable.
 
We use simple plain text files to store the variable.
 +
 +
=== utilized function ===
  
 
The ReNamer PascalScript functions to write and read text files are:
 
The ReNamer PascalScript functions to write and read text files are:
Line 64: Line 78:
  
  
 +
=== script examples ===
  
== PascalScript rule examples ==
+
==== Store one value to one dedicated file ====
  
 
First rule in rule list:<br>
 
First rule in rule list:<br>
Line 107: Line 122:
 
end.
 
end.
 
</source>
 
</source>
 +
 +
 +
====Store more then one value into a common file====
 +
 +
Note this approach is to cumbersome for real use. <br>
 +
Better use dedicated file for each var/value (see above).
 +
 +
 +
 +
We can also use  FileAppendContent();  to add "NAME=VALUE" pairs to an single file<br>
 +
and a routine to read the lines of that common vars.txt.
 +
 +
 +
Here just as proof of concept:
 +
 +
Last rule in rule list:<br>
 +
(add a line with "NAME=VALUE" pair)
 +
  FileAppendContent('den4b_vars.txt','LastFolder=' + ParentF + #13#10);
 +
 +
 +
 +
This 'den4b_vars.txt' could look now like:
 +
LastIndex=10
 +
LastString=Vacation 2013
 +
LastFolder=Translits
 +
 +
 +
 +
 +
Other rules here in between<br>
 +
-<br>
 +
-<br>
 +
-<br>
 +
 +
 +
To get the wanted value i would use a code like this:
 +
 +
First rule in rule list:<br>
 +
- read the vars.txt<br>
 +
- split into lines<br>
 +
- split line into 'name' and 'value'<br>
 +
- check if 'name' is a wanted var name, if yes get the value<br>
 +
 +
var
 +
  vars,v:string;
 +
  Lines,CurrLine:TStringsArray;
 +
  i:integer;
 +
 
 +
begin
 +
  if(GetCurrentFileIndex=1)then
 +
  begin
 +
    if( WideFileExists('.\den4b_vars.txt') ) then
 +
    begin
 +
      vars := FileReadContent('.\den4b_vars.txt');
 +
      ShowMessage('complete content:'+#10+vars);
 +
      Lines:= WideSplitString(vars, #13#10);
 +
      if( length(Lines) > 0 ) then
 +
        begin
 +
            for i:=0 to length(Lines)-1 do
 +
            begin
 +
                CurrLine := WideSplitString(Lines[i],'=');
 +
                v := CurrLine[0];
 +
                //ShowMessage(v);
 +
                if ( WideCompareText( v, 'LastIndex' ) =0) then
 +
                    ShowMessage( v + ' has value ' + CurrLine[1] );
 +
                if ( WideCompareText( v, 'LastFolder' ) =0) then
 +
                    ShowMessage( v + ' has value ' +  CurrLine[1] );
 +
                if ( WideCompareText( v, 'LastString' ) =0) then
 +
                    ShowMessage( v + ' has value ' +  CurrLine[1] );
 +
            end;
 +
        end;
 +
    end;
 +
  end;
 +
end.
 +
 +
 +
 +
 +
 +
 +
 +
== the registry approach ==
 +
 +
=== Not recommended ! ===
 +
 +
Not recommended !
 +
 +
var
 +
  ECAreturn:string;
 +
 
 +
begin
 +
  // Add your code here
 +
 
 +
  //Store/Write/Set:
 +
    ExecuteProgram('reg add  HKCU\Software\den4b /v TestName1 /t REG_SZ /d "Test value 1" /f', true);
 +
   
 +
    //Load/Read/Get:
 +
    ExecConsoleApp('reg query  HKCU\Software\den4b /v Test6', ECAreturn);
 +
    ShowMessage(ECAreturn);
 +
    // 
 +
    //  ! REG.EXE VERSION 3.0
 +
    // 
 +
    //  HKEY_CURRENT_USER\Software\den4b
 +
    //      Test6      REG_SZ  gut
 +
    // 
 +
    //>---more code needed here to extract the value---<
 +
end.
  
  
  
-#
+
-# end

Revision as of 14:28, 27 January 2013

--- This page is work in process! ---

currently i just collect here a few information and POC proof of concept code.

I want to clean up this page later.

If you want to help please do so.


Set/Get or Write/Read or Save/Load variable values

If you want to store a variable to reuse the value later you can read here a few tips.


For examples you can store the last used path, folder or file name or parts of them.
Also you may want to store an index number, or perhaps a list of the original file names.



There are two main techniques to store variable values: use the registry or use a temporary file on disc.


the file approach

First we take a look on the file approach.

We use simple plain text files to store the variable.

utilized function

The ReNamer PascalScript functions to write and read text files are:

FileWriteContent( "FileName" , "Content" );
FileAppendContent( "FileName" , "Content" );

FileReadContent("FileName");
FileCountLines("FileName");
FileReadLine( "FileName" , LineNum );


For "FileName" you can just use a name without a path to store the file into the ReNamer folder.
Example:

FileWriteContent( "FileName.txt" , "Content" );
FileWriteContent( ".\FileName.txt" , "Content" );


To use an full path to your ReNamer folder use the ReNamer PascalScript function "GetApplicationPath"
Example:

FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" );


You can use your private temp (temporary) folder in your profile
by using the ReNamer PascalScript function "WideGetTempPath"
Example:

FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" );


Also you can access all system environment variables by using "WideGetEnvironmentVar"
Example:

UserName := WideGetEnvironmentVar('USERNAME');


script examples

Store one value to one dedicated file

First rule in rule list:
(GET stored variable 'LastFolder')

var
  LastFold:string;

begin
 if(GetCurrentFileIndex=1)then
    if(WideFileExists(WideGetTempPath +'\den4b_LastFolder.txt')) then
        LastFold := FileReadContent(WideGetTempPath +'den4b_LastFolder.txt');

  //check if it works:
  ShowMessage(LastFold);
end.


Other rules here in between
-
-
-


Last rule in rule list:
(SET variable 'LastFolder' to stored for later reuse)

var
  ParentFold:string;

begin
 if(GetCurrentFileIndex=GetTotalNumberOfFiles)then
   begin
       ParentFold := CalculateMetaTag(FilePath, 'File_FolderName');
       FileWriteContent(WideGetTempPath + 'den4b_LastFolder.txt', ParentFold);
   end;
 
  //check if it works:
  ExecuteProgram('notepad ' + WideGetTempPath + 'den4b_LastFolder.txt',false);
end.


Store more then one value into a common file

Note this approach is to cumbersome for real use.
Better use dedicated file for each var/value (see above).


We can also use FileAppendContent(); to add "NAME=VALUE" pairs to an single file
and a routine to read the lines of that common vars.txt.


Here just as proof of concept:

Last rule in rule list:
(add a line with "NAME=VALUE" pair)

 FileAppendContent('den4b_vars.txt','LastFolder=' + ParentF + #13#10);


This 'den4b_vars.txt' could look now like:

LastIndex=10
LastString=Vacation 2013
LastFolder=Translits



Other rules here in between
-
-
-


To get the wanted value i would use a code like this:

First rule in rule list:
- read the vars.txt
- split into lines
- split line into 'name' and 'value'
- check if 'name' is a wanted var name, if yes get the value

var
  vars,v:string;
  Lines,CurrLine:TStringsArray;
  i:integer;
  
begin
 if(GetCurrentFileIndex=1)then
 begin
   if( WideFileExists('.\den4b_vars.txt') ) then
   begin
      vars := FileReadContent('.\den4b_vars.txt');
      ShowMessage('complete content:'+#10+vars);
      Lines:= WideSplitString(vars, #13#10);
      if( length(Lines) > 0 ) then
        begin
            for i:=0 to length(Lines)-1 do
            begin
               CurrLine := WideSplitString(Lines[i],'=');
               v := CurrLine[0];
               //ShowMessage(v);
               if ( WideCompareText( v, 'LastIndex' ) =0) then
                   ShowMessage( v + ' has value ' + CurrLine[1] );
               if ( WideCompareText( v, 'LastFolder' ) =0) then
                   ShowMessage( v + ' has value ' +  CurrLine[1] );
               if ( WideCompareText( v, 'LastString' ) =0) then
                   ShowMessage( v + ' has value ' +  CurrLine[1] );
            end;
        end;
   end;
 end;
end.




the registry approach

Not recommended !

Not recommended !

var
 ECAreturn:string;
  
begin
  // Add your code here
  
  //Store/Write/Set:
   ExecuteProgram('reg add  HKCU\Software\den4b /v TestName1 /t REG_SZ /d "Test value 1" /f', true);
    
   //Load/Read/Get: 
   ExecConsoleApp('reg query  HKCU\Software\den4b /v Test6', ECAreturn);
   ShowMessage(ECAreturn);
   //  
   //  ! REG.EXE VERSION 3.0
   //  
   //  HKEY_CURRENT_USER\Software\den4b
   //      Test6       REG_SZ  gut
   //  
   //>---more code needed here to extract the value---<

end.


-# end