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

From den4b Wiki
Jump to: navigation, search
(First content collection - work in process)
 
m (Text replacement - "</source>" to "</syntaxhighlight>")
 
(13 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]]}}
  
 
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.
+
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.
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.
 
 
 
  
 +
== File Approach ==
  
 
First we take a look on 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:
  
 +
<syntaxhighlight lang="pascal">
 
FileWriteContent( "FileName" , "Content" );
 
FileWriteContent( "FileName" , "Content" );
 
FileAppendContent( "FileName" , "Content" );
 
FileAppendContent( "FileName" , "Content" );
Line 23: Line 23:
 
FileCountLines("FileName");
 
FileCountLines("FileName");
 
FileReadLine( "FileName" , LineNum );
 
FileReadLine( "FileName" , LineNum );
 +
</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.
 
 
Example:
 
Example:
 +
<syntaxhighlight lang="pascal">
 
FileWriteContent( "FileName.txt" , "Content" );
 
FileWriteContent( "FileName.txt" , "Content" );
 
FileWriteContent( ".\FileName.txt" , "Content" );
 
FileWriteContent( ".\FileName.txt" , "Content" );
 +
</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"
 
 
Example:
 
Example:
 +
<syntaxhighlight lang="pascal">
 
FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" );
 
FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" );
 +
</syntaxhighlight>
  
 
+
You can use your private temp (temporary) folder in your profile<br>
 
+
by using the ReNamer PascalScript function "WideGetTempPath"<br>
 
 
You can use your private temp (temporary) folder in your profile
 
by using the ReNamer PascalScript function "WideGetTempPath"
 
 
Example:
 
Example:
 +
<syntaxhighlight lang="pascal">
 
FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" );
 
FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" );
 +
</syntaxhighlight>
  
 
+
Also you can access all system environment variables by using "WideGetEnvironmentVar"<br>
 
 
Also you can access all system environment variables by using "WideGetEnvironmentVar"
 
 
Example:
 
Example:
  UserName := WideGetEnvironmentVar('USERNAME');
+
<syntaxhighlight lang="pascal">
 
+
UserName := WideGetEnvironmentVar('USERNAME');
 
+
</syntaxhighlight>
 
 
  
== PascalScript rule examples ==
+
=== Script examples ===
  
 +
==== Store one value to one dedicated file ====
  
 
+
First rule in rule list:<br>
First rule in rule list:
 
 
(GET stored variable 'LastFolder')
 
(GET stored variable 'LastFolder')
<source>
+
<syntaxhighlight lang="pascal">
 
var
 
var
 
   LastFold:string;
 
   LastFold:string;
Line 67: 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 73: Line 69:
 
   ShowMessage(LastFold);
 
   ShowMessage(LastFold);
 
end.
 
end.
</source>
+
</syntaxhighlight>
  
 +
Other rules here in between<br>
 +
-<br>
 +
-<br>
 +
-<br>
  
 
+
Last rule in rule list:<br>
Last rule in rule list:
 
 
(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 91: Line 90:
 
   
 
   
 
   //check if it works:
 
   //check if it works:
   ExecuteProgram('notepad ' + WideGetTempPath + '\den4b_LastFolder.txt',false);
+
   ExecuteProgram('notepad ' + WideGetTempPath + 'den4b_LastFolder.txt',false);
 +
end.
 +
</syntaxhighlight>
 +
 
 +
====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>
 +
 
 +
<syntaxhighlight lang="pascal">
 +
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.
 
end.
</source>
+
</syntaxhighlight>
  
 +
== Registry Approach ==
 +
 +
=== Not recommended ! ===
 +
 +
Not recommended !
 +
 +
<syntaxhighlight lang="pascal">
 +
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.
 +
</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>
  
#
+
[[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.