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.
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:
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 := 1to Length(Params) do begin
if st[i] <> '|'then begin
s := s + st[i];
if i = Length(Params) then Strings.Add(s);
endelse 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) = 1then begin
Delete(st2, 1, Length('TITLE'));
st := trim(st2);
FolderDLG.Title := st;
endelse if pos('PATH_NAME', st) = 1then begin
Delete(st2, 1, Length('PATH_NAME'));
st := trim(st2);
FolderDLG.SelectedPathName := st;
endelse if pos('WINDOW_STATE', st) = 1then 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;
endelse if pos('HEIGHT', st) = 1then begin
Delete(st, 1, Length('HEIGHT'));
st := trim(st);
try
FolderDLG.FormHeight := StrToInt(st);
except
//if user typing non-integer value here.
end;
endelse 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;
endelse 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) = 1then 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) = 1then 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];
endelse 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];
endelse if pos('OLE_DROP', st) = 1then 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];
endelse if pos('CREATE_FOLDER_ICON', st) = 1then 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];
endelse if pos('DELETE_FOLDER_ICON', st) = 1then 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];
endelse if pos('VIRTUAL_FOLDERS', st) = 1then 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];
endelse 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