ReNamer:Pascal Script:Reuse variable

From den4b Wiki
Revision as of 16:01, 8 February 2017 by Den4b (talk | contribs) (Text replacement - "<source>" to "<syntaxhighlight lang="pascal">")
Jump to navigation Jump to search
{{{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:

<syntaxhighlight lang="pascal"> FileWriteContent( "FileName" , "Content" ); FileAppendContent( "FileName" , "Content" );

FileReadContent("FileName"); FileCountLines("FileName"); FileReadLine( "FileName" , LineNum ); </source>

For "FileName" you can just use a name without a path to store the file into the ReNamer folder.
Example: <syntaxhighlight lang="pascal"> FileWriteContent( "FileName.txt" , "Content" ); FileWriteContent( ".\FileName.txt" , "Content" ); </source>

To use an full path to your ReNamer folder use the ReNamer PascalScript function "GetApplicationPath"
Example: <syntaxhighlight lang="pascal"> FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" ); </source>

You can use your private temp (temporary) folder in your profile
by using the ReNamer PascalScript function "WideGetTempPath"
Example: <syntaxhighlight lang="pascal"> FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" ); </source>

Also you can access all system environment variables by using "WideGetEnvironmentVar"
Example: <syntaxhighlight lang="pascal"> UserName := WideGetEnvironmentVar('USERNAME'); </source>

Script examples

Store one value to one dedicated file

First rule in rule list:
(GET stored variable 'LastFolder') <syntaxhighlight lang="pascal"> 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. </source>

Other rules here in between
-
-
-

Last rule in rule list:
(SET variable 'LastFolder' to stored for later reuse) <syntaxhighlight lang="pascal"> 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. </source>

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

<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. </source>

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. </source>

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. </source>