PLUGINS
Top  Previous  Next

Many software products now used a technology called "PLUGIN". This technology is based on API, which is declared by the program creator. A sample of products which use plugins includes: WinAMP, Adobe Photoshop, ACDSee, etc. It means that the computer programmers can enhance and improve product possibilities using programing languages such as C/C++, Pascal, Basic.


plugins


Options


filename
Your plugin file name (extension for plugin must be RBL)

parameters
parameters which used internally by a plugin


Plugins can be the following type:

100 – General type of plugin, these plugins appear in RBG76 Main Menu under "Utilities" > "Plugins".
101 – These plugins does not appear in RBG76 Main Menu, but return a value to R:BASE.


Additional Plugins are made available through R:BASE Technologies, Inc. and Authorized R:BASE Developers at the R:BASE Community Home Page: http://www.rbasecommunity.com/




These plugins are DLL files with 4 exported functions:


GetRBPluginName

Syntax:

procedure GetRBPluginName(Value : PChar); stdcall;

Value – result value which you can see in Plugins menu.

A sample of implementing this function in RBL:

procedure GetRBPluginName(Value : PChar); stdcall;
var Name : string;
begin
  Name := 'My Sample Plugin'
;
  StrLCopy(Value, Pchar(Name), Length(Name));
end;


GetRBPluginType

Syntax:

function GetRBPluginType : integer; stdcall;

This function returns the type of a plugin to RBG76.

A sample of implementing this function in RBL:

function GetRBPluginType : integer; stdcall;
begin
  Result := 100
;
end;


GetBitmap

Syntax:

function GetGetBitmap : THandle; stdcall;

This function returns to RBG76 a handle for a Bitmap. This is the bitmap you can see in the plugins menu.

A sample of implementing this function in RBL:

function GetGetBitmap : THandle; stdcall;
begin
  
Bitmap.LoadFromResourceName(Hinstance, 'MAINBMP'
);
  Result := Bitmap.Handle;
end;


StartRBPlugin

Syntax:

procedure StartRBPlugin(Params : PChar); stdcall;

This function starts your plugin.

101 – Same as in type 100 except:

function StartRBPlugin(Params : PChar) : PChar; stdcall;

In the result of this function, you need to put a value which will go to the R:BASE variable.

LoadDirectoryName Plugin schema:

loaddirname


Example:


///////////////////////////////////////////////////////////////////////
// Example to presentation:                                          //
//                                                                   //
//                                                                   //
//                                                                   //
// "Designing and Implementing R:BASE 7.6 Plugins"                   //
//                                                                   //
//                                                                   //
//                                                                   //
// Author: Aleksey V. Chuyasov.                                      //
//                                                                   //
//                                                                   //
//                                                                   //
// Load user-selected folder name to R:BASE variable                 //
//                                                                   //
///////////////////////////////////////////////////////////////////////


library LoadDirectoryName;

uses
  SysUtils,
  RzShellDialogs,
  Forms,
  Classes;

{$E rbl}

{$R *.res}

procedure GetRBPluginName(ResName : PChar); stdcall;
var Name : string;
begin
  Name := 'Get File Name'
;
  StrLCopy(ResName, PChar(Name), Length(Name));
end;

function GetRBPluginType : Integer; stdcall;
begin
  Result := 101
;
end;

function StartRBPlugin(Params : PChar) : PChar; stdcall;

  procedure ParseParams(Strings : TStringList);
  var st, s : string;
      i : integer;
  begin
    Strings.Clear;
    st := string(Params);
    s := '';
    for i := 1
 to Length(Params) do
    begin
      if st[i] <> '|'
 then
      begin
        s := s + st[i];
        if i = Length(Params) then Strings.Add(s);
      end else
      begin
        Strings.Add(s);
        s := ''
;
      end;
    end;
  end;

var FolderDLG : TRzSelectFolderDialog;
    FileName : string;
    st, st2 : string;
    List : TStringList;
    CurrDir : string;
    i,j : integer;
    fullpath : boolean;
    Ans : array[0..65535
of char;
begin
  FillChar(Ans, 65536
#0);
  CurrDir := GetCurrentDir;
  try
    FolderDLG := TRzSelectFolderDialog.Create(nil);
    try
      List := TStringList.Create;
      try
        ParseParams(List);
        for i := 0 to List.Count - 1 do
        begin
          st  := trim(UpperCase(List[i]));
          st2 := trim(List[i]);
          if pos('TITLE'
, st) = 1 then
          begin
            Delete(st2, 1
, Length('TITLE'));
            st := trim(st2);
            FolderDLG.Title := st;
          end else
          if pos('PATH_NAME'
, st) = 1 then
          begin
            Delete(st2, 1
, Length('PATH_NAME'));
            st := trim(st2);
            FolderDLG.SelectedPathName := st;
          end else
          if pos('WINDOW_STATE'
, st) = 1 then
          begin
            Delete(st, 1, Length('WINDOW_STATE'
));
            st := trim(st);
            if st = 'MAX'
 then 
  FolderDLG.FormWindowState :=  wsMaximized else  
            if st = 'MIN' then 
         FolderDLG.FormWindowState :=  wsMinimized else
            if st = 'NORMAL'
 then 
              FolderDLG.FormWindowState :=  wsNormal;
          end else
          if pos('HEIGHT'
, st) = 1 then
          begin
            Delete(st, 1
, Length('HEIGHT'));
            st := trim(st);
            try
              FolderDLG.FormHeight := StrToInt(st);
            except
              //if user typing non-integer value here.
            end;
          end else
          if pos('WIDTH'
, st) = 1 then
          begin
            Delete(st, 1
, Length('WIDTH'));
            st := trim(st);
            try
              FolderDLG.FormWidth := StrToInt(st);
            except
              //if user typing non-integer value here.
            end;
          end else
          if pos('DELETE_BUTTON'
, st) = 1 then
          begin
            Delete(st, 1
, Length('DELETE_BUTTON'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
                FolderDLG.Options + [sfdoCreateDeleteButtons]  else
            if st = 'OFF'
 then FolderDLG.Options := 
                FolderDLG.Options - [sfdoCreateDeleteButtons];
          end else
          if pos('CONTEXT_MENUS'
, st) = 1 then
          begin
            Delete(st, 1
, Length('CONTEXT_MENUS'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
                 FolderDLG.Options + [sfdoContextMenus]  else
            if st = 'OFF'
 then FolderDLG.Options := 
                 FolderDLG.Options - [sfdoContextMenus];
          end else
          if pos('READ_ONLY'
, st) = 1 then
          begin
            Delete(st, 1
, Length('READ_ONLY'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoReadOnly]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoReadOnly];
          end else
          if pos('INCLUDE_NON_FOLDERS'
, st) = 1 then
          begin
            Delete(st, 1
, Length('INCLUDE_NON_FOLDERS'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoIncludeNonFolders]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoIncludeNonFolders];
          end else
          if pos('OLE_DRAG'
, st) = 1 then
          begin
            Delete(st, 1
, Length('OLE_DRAG'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoOleDrag]  else
            if st = 'OFF'
 then FolderDLG.Options := 
                FolderDLG.Options - [sfdoOleDrag];
          end else
          if pos('OLE_DROP'
, st) = 1 then
          begin
            Delete(st, 1
, Length('OLE_DROP'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoOleDrop]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoOleDrop];
          end else
          if pos('CREATE_FOLDER_ICON'
, st) = 1 then
          begin
            Delete(st, 1
, Length('CREATE_FOLDER_ICON'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoCreateFolderIcon]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoCreateFolderIcon];
          end else
          if pos('DELETE_FOLDER_ICON'
, st) = 1 then
          begin
            Delete(st, 1
, Length('DELETE_FOLDER_ICON'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoDeleteFolderIcon]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoDeleteFolderIcon];
          end else
          if pos('VIRTUAL_FOLDERS'
, st) = 1 then
          begin
            Delete(st, 1
, Length('VIRTUAL_FOLDERS'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoVirtualFolders]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoVirtualFolders];
          end else
          if pos('SHOW_HIDDEN'
, st) = 1 then
          begin
            Delete(st, 1
, Length('SHOW_HIDDEN'));
            st := trim(st);
            if st = 'ON'
 then FolderDLG.Options := 
              FolderDLG.Options + [sfdoShowHidden]  else
            if st = 'OFF'
 then FolderDLG.Options := 
              FolderDLG.Options - [sfdoShowHidden];
          end;
        end;
        if FolderDLG.Execute then
        begin
          FileName := FolderDLG.SelectedPathName;
        end;
      finally
        List.Free;
      end;
    finally
      FolderDLG.Free;
    end;
  finally
    StrPCopy(Ans, FileName);
    Result := Ans;
    SetCurrentDir(CurrDir);
  end;
end;

Exports GetRBPluginName, GetRBPluginType, StartRBPlugin;
begin

end.


SYNTAX:

PLUGIN LoadDirectoryName.rbl vFolderName|CREATE_FOLDER_ICON ON| DELETE_FOLDER_ICON ON