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

From den4b Wiki
Jump to: navigation, search
m (Add example to use single file to store many vars/values)
m (Text replacement - "</source>" to "</syntaxhighlight>")
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
== --- This page is work in process! --- ==
+
{{Up|ReNamer:Pascal Script}}
 
+
{{Cleanup|This page is work in process! I want to clean up this page later. If you want to help please do so. -- [[User:Stefan|Stefan]]}}
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.
 
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 several techniques to store variable values, feel free to choose the one that suits you.
  
For examples you can store the last used path, folder or file name or parts of them.<br>
+
== File Approach ==
Also you may want to store an index number, or perhaps a list of the original file names.
 
<br>
 
<br>
 
<br>
 
 
 
 
 
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.
 
First we take a look on the file approach.
Line 32: Line 12:
 
We use simple plain text files to store the variable.
 
We use simple plain text files to store the variable.
  
=== utilized function ===
+
=== Utilized Function ===
  
 
The ReNamer PascalScript functions to write and read text files are:
 
The ReNamer PascalScript functions to write and read text files are:
<source>
+
 
 +
<syntaxhighlight lang="pascal">
 
FileWriteContent( "FileName" , "Content" );
 
FileWriteContent( "FileName" , "Content" );
 
FileAppendContent( "FileName" , "Content" );
 
FileAppendContent( "FileName" , "Content" );
Line 42: Line 23:
 
FileCountLines("FileName");
 
FileCountLines("FileName");
 
FileReadLine( "FileName" , LineNum );
 
FileReadLine( "FileName" , LineNum );
</source>
+
</syntaxhighlight>
 
 
  
 
For "FileName" you can just use a name without a path to store the file into the ReNamer folder.<br>
 
For "FileName" you can just use a name without a path to store the file into the ReNamer folder.<br>
 
Example:
 
Example:
<source>
+
<syntaxhighlight lang="pascal">
 
FileWriteContent( "FileName.txt" , "Content" );
 
FileWriteContent( "FileName.txt" , "Content" );
 
FileWriteContent( ".\FileName.txt" , "Content" );
 
FileWriteContent( ".\FileName.txt" , "Content" );
</source>
+
</syntaxhighlight>
 
 
 
 
  
 
To use an full path to your ReNamer folder use the ReNamer PascalScript function "GetApplicationPath"<br>
 
To use an full path to your ReNamer folder use the ReNamer PascalScript function "GetApplicationPath"<br>
 
Example:
 
Example:
<source>
+
<syntaxhighlight lang="pascal">
 
FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" );
 
FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" );
</source>
+
</syntaxhighlight>
 
 
 
 
  
 
You can use your private temp (temporary) folder in your profile<br>
 
You can use your private temp (temporary) folder in your profile<br>
 
by using the ReNamer PascalScript function "WideGetTempPath"<br>
 
by using the ReNamer PascalScript function "WideGetTempPath"<br>
 
Example:
 
Example:
<source>
+
<syntaxhighlight lang="pascal">
 
FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" );
 
FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" );
</source>
+
</syntaxhighlight>
 
 
  
 
Also you can access all system environment variables by using "WideGetEnvironmentVar"<br>
 
Also you can access all system environment variables by using "WideGetEnvironmentVar"<br>
 
Example:
 
Example:
<source>
+
<syntaxhighlight lang="pascal">
 
UserName := WideGetEnvironmentVar('USERNAME');
 
UserName := WideGetEnvironmentVar('USERNAME');
</source>
+
</syntaxhighlight>
 
 
  
 
+
=== Script examples ===
=== script examples ===
 
  
 
==== Store one value to one dedicated file ====
 
==== Store one value to one dedicated file ====
Line 84: Line 57:
 
First rule in rule list:<br>
 
First rule in rule list:<br>
 
(GET stored variable 'LastFolder')
 
(GET stored variable 'LastFolder')
<source>
+
<syntaxhighlight lang="pascal">
 
var
 
var
 
   LastFold:string;
 
   LastFold:string;
Line 90: Line 63:
 
begin
 
begin
 
  if(GetCurrentFileIndex=1)then
 
  if(GetCurrentFileIndex=1)then
     if(WideFileExists(WideGetTempPath +'\den4b_LastFolder.txt')) then
+
     if(WideFileExists(WideGetTempPath + 'den4b_LastFolder.txt')) then
 
         LastFold := FileReadContent(WideGetTempPath +'den4b_LastFolder.txt');
 
         LastFold := FileReadContent(WideGetTempPath +'den4b_LastFolder.txt');
  
Line 96: Line 69:
 
   ShowMessage(LastFold);
 
   ShowMessage(LastFold);
 
end.
 
end.
</source>
+
</syntaxhighlight>
 
 
  
 
Other rules here in between<br>
 
Other rules here in between<br>
Line 103: Line 75:
 
-<br>
 
-<br>
 
-<br>
 
-<br>
 
  
 
Last rule in rule list:<br>
 
Last rule in rule list:<br>
 
(SET variable 'LastFolder' to stored for later reuse)
 
(SET variable 'LastFolder' to stored for later reuse)
<source>
+
<syntaxhighlight lang="pascal">
 
var
 
var
 
   ParentFold:string;
 
   ParentFold:string;
Line 121: Line 92:
 
   ExecuteProgram('notepad ' + WideGetTempPath + 'den4b_LastFolder.txt',false);
 
   ExecuteProgram('notepad ' + WideGetTempPath + 'den4b_LastFolder.txt',false);
 
end.
 
end.
</source>
+
</syntaxhighlight>
 
 
  
 
====Store more then one value into a common file====
 
====Store more then one value into a common file====
Line 128: Line 98:
 
Note this approach is to cumbersome for real use. <br>
 
Note this approach is to cumbersome for real use. <br>
 
Better use dedicated file for each var/value (see above).
 
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>
 
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.
 
and a routine to read the lines of that common vars.txt.
 
  
 
Here just as proof of concept:
 
Here just as proof of concept:
Line 140: Line 107:
 
(add a line with "NAME=VALUE" pair)
 
(add a line with "NAME=VALUE" pair)
 
   FileAppendContent('den4b_vars.txt','LastFolder=' + ParentF + #13#10);
 
   FileAppendContent('den4b_vars.txt','LastFolder=' + ParentF + #13#10);
 
 
  
 
This 'den4b_vars.txt' could look now like:
 
This 'den4b_vars.txt' could look now like:
Line 147: Line 112:
 
  LastString=Vacation 2013
 
  LastString=Vacation 2013
 
  LastFolder=Translits
 
  LastFolder=Translits
 
 
 
  
 
Other rules here in between<br>
 
Other rules here in between<br>
Line 155: Line 117:
 
-<br>
 
-<br>
 
-<br>
 
-<br>
 
  
 
To get the wanted value i would use a code like this:
 
To get the wanted value i would use a code like this:
Line 165: Line 126:
 
- check if 'name' is a wanted var name, if yes get the value<br>
 
- check if 'name' is a wanted var name, if yes get the value<br>
  
var
+
<syntaxhighlight lang="pascal">
  vars,v:string;
+
var
  Lines,CurrLine:TStringsArray;
+
  vars,v:string;
  i:integer;
+
  Lines,CurrLine:TWideStringArray;
 +
  i:integer;
 
    
 
    
begin
+
begin
 
   if(GetCurrentFileIndex=1)then
 
   if(GetCurrentFileIndex=1)then
 
   begin
 
   begin
Line 195: Line 157:
 
     end;
 
     end;
 
   end;
 
   end;
end.
+
end.
 
+
</syntaxhighlight>
 
 
 
 
 
 
 
 
 
 
  
== the registry approach ==
+
== Registry Approach ==
  
 
=== Not recommended ! ===
 
=== Not recommended ! ===
Line 209: Line 166:
 
Not recommended !
 
Not recommended !
  
 +
<syntaxhighlight lang="pascal">
 
  var
 
  var
 
   ECAreturn:string;
 
   ECAreturn:string;
 
+
 
 
  begin
 
  begin
 
   // Add your code here
 
   // Add your code here
Line 219: Line 177:
 
      
 
      
 
     //Load/Read/Get:  
 
     //Load/Read/Get:  
     ExecConsoleApp('reg query  HKCU\Software\den4b /v Test6', ECAreturn);
+
     ExecConsoleApp('reg query  HKCU\Software\den4b /v TestName1', ECAreturn);
 
     ShowMessage(ECAreturn);
 
     ShowMessage(ECAreturn);
 +
    // Result:
 
     //   
 
     //   
 
     //  ! REG.EXE VERSION 3.0
 
     //  ! REG.EXE VERSION 3.0
 
     //   
 
     //   
 
     //  HKEY_CURRENT_USER\Software\den4b
 
     //  HKEY_CURRENT_USER\Software\den4b
     //      Test6       REG_SZ  gut
+
     //      TestName1       REG_SZ  Test value 1
 
     //   
 
     //   
     //>---more code needed here to extract the value---<
+
     
 +
     //>---more code needed here to extract the value "Test value 1"---<
 
end.
 
end.
 +
</syntaxhighlight>
  
 +
== Clipboard Approach ==
  
 +
<syntaxhighlight lang="pascal">
 +
var
 +
  vLastExtension, vCurrentExtension: WideString;
 +
begin
 +
  // At start, load stored data //Load/Read/Get:
 +
  vLastExtension := GetClipboardText;
 +
  // Add here some error handling and cleanup code for vLastExtension
 +
  //if Length(vLastExtension) > 4 then Exit;
 +
  //
 +
  // Add your code here and use content of var vLastExtension
 +
  vCurrentExtension := WideExtractFileExt(FileName);
 +
  if vCurrentExtension <> vLastExtension then
 +
  .....
 +
  //
 +
  //
 +
  //
 +
  // At the end store the wanted data //Store/Write/Set:
 +
  SetClipboardText(vCurrentExtension);
 +
end.
 +
</syntaxhighlight>
  
-# end
+
[[Category:ReNamer]]
 +
[[Category:Pascal Script]]

Latest revision as of 15:03, 8 February 2017

{{{iparam}}} This article needs to be cleaned up!

This page is work in process! I want to clean up this page later. If you want to help please do so. -- Stefan

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 several techniques to store variable values, feel free to choose the one that suits you.

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:TWideStringArray;
  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.

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 TestName1', ECAreturn);
    ShowMessage(ECAreturn);
    // Result:
    //  
    //  ! REG.EXE VERSION 3.0
    //  
    //  HKEY_CURRENT_USER\Software\den4b
    //      TestName1       REG_SZ  Test value 1
    //  
      
    //>---more code needed here to extract the value "Test value 1"---<
end.

Clipboard Approach

var
  vLastExtension, vCurrentExtension: WideString;
begin
  // At start, load stored data //Load/Read/Get:
  vLastExtension := GetClipboardText;
  // Add here some error handling and cleanup code for vLastExtension 
  //if Length(vLastExtension) > 4 then Exit;
  //
  // Add your code here and use content of var vLastExtension
  vCurrentExtension := WideExtractFileExt(FileName);
  if vCurrentExtension <> vLastExtension then
   .....
  // 
  // 
  // 
  // At the end store the wanted data //Store/Write/Set:
  SetClipboardText(vCurrentExtension);
end.