Delphi Pascal functions
Previous  Top  Next

This source code is found in the file Jeanie.pas

unit DynJeanie;
//This unit calls the JeanieTools.DLL

//as a dynamic call, finding it in the Jeanie install directory

//this is the preferred method

interface
uses windows;
type
  MvmtClass = (mcPairs, mcIndividuals);
  MvmtType = (mtAny,
            mt3QHowell,
            mt1HalfAMitchell,
            mtwhist,
            mtAppHowell,
            mtAppMitchell,
            mtBlackpool,
            mtBlockMitchell,
            mtBowman,
            mtCrissCrossMitchell,
            mtDispMitchell,
            mtDoubleHesMitchell,
            mtDoubleHowell,
            mtDoubleWeaveMitchell,
            mtExtraBoardHowell,
            mtExtraBoardMitchell,
            mtFlowerHowell,
            mtHesitationBowman,
            mtHesitationMitchell,
            mtHowell,
            mtInterwovenHowell,
            mtMitchell,
            mtNSRover,
            mtRelayMitchell,
            mtRovertableMitchell,
            mtSkipMitchell,
            mtStaggerMitchell,
            mtTwinMitchells,
            mtUndefined,
            mtWebMitchell,
            mtiHowelltype,
            mtiMitchelltype,
            mtiIrregular,
            mtiCombination,
            mtiShomate,
            mtPivotMitchell,
            mt2TAppMitchell,
            mtiUser1,
            mtiUser2,
            mtiUser3,
            mtiUser4,
            mtiUser5,
            mtUser1,
            mtUser2,
            mtUser3,
            mtUser4,
            mtUser5);


  ScorerType = (stASE, stSB, stACBL);

//************************************************

//  Set up Dynamic Functions for DLL

// All function return a boolean result as smallInt

// zero is false and -1 is true


// Main entry points to Jeanie tools

// ask the user to choose a movement

   tPickMovement = function(MvtClass, MvtType, Players, rounds, winners: smallInt;
                    var FileNo, BrdPerSet: smallInt; LibName: PChar): smallInt; stdcall;
// write the movement to a text file

    tExportMovement = function(Scorer, FileNo: smallInt; LibName, filename: PChar): smallInt; stdcall;
// get the full details of the movement

  tGetDetails = function (var Tables, rounds, winners, BrdPerSet, players, Brdsets, balance, MovementClass, FileNo: smallInt;
           name, MovementType, Description, Reference, page, MII, LibName: PChar): smallInt; stdcall;

//************************************************

// Other entry points to Jeanie tools

// In iteration use "first" then "next" until false returned followed by "Close"


// Iterate through the libraries

  tGetFirstLib = function (LibName: PChar): smallInt; stdcall;
  tGetNexttLib = function (LibName: PChar): smallInt; stdcall;
  tGetLibClose = function : smallInt; stdcall;
// Iterate through the movements of the library with properties supplied

  tGetFirstMvt = function (MvtClass, Tables, players, rounds, winners, balance, MovementType: smallInt; var FileNo: smallInt;
           Reference, LibName: PChar): smallInt; stdcall;
  tGetNextMvt = function (var FileNo: smallInt): smallInt; stdcall;
  tGetMvtClose = function : smallInt; stdcall;
// get the details from the index file - basic information

   tGetDisplay = function (var Tables, rounds, winners, players, balance, Sets, MovementType, FileNo: smallInt;
           name, Reference, Page: PChar): smallInt; stdcall;
// load up the names of the movements for the class in use

// so the "GetMovementName" will work

  tLoadMovementText = function (MvtClass: smallInt): smallInt; stdcall;
// unload before load is used - just to tidy up

  tUnLoadMovementText = function : smallInt; stdcall;
// Give me the movement name of supplied type

  tGetMovementName = function (mvtType: smallInt; MvtName: PChar): smallInt; stdcall;
//give me the name of the movement, in movement class of supplied type

// combination of LoadMovementText, GetMovementName, UnLoadMovementText

  tGetMovementTitle = function (MvtClass, mvtType: smallInt; var MvtTitle: PChar): smallInt; stdcall;
// Return index (0 based) of the movement with supplied name

// add 1 to get movement type. If false then mvtIdx = -1

  tGetMovementIndex = function (var mvtIdx: smallInt; MvtName: PChar): smallInt; stdcall;
// Iterate through all the movement names

// After LoadMovementtext of class this returns first movement name of that class

  tGetFirstMvtName = function (MvtName: PChar): smallInt; stdcall;
// After GetFirstMvtName this returns next movement name of the class

// will return false at end of list

  tGetNextMvtName = function (MvtName: PChar): smallInt; stdcall;
//************************************************

// end Other entry points to Jeanie tools

//  End of Dynamic Functions


function JeanieInstalled: boolean;
function ReleaseJeanie: boolean;

//*************************************************************

//Native format calls

// Main entry points to Jeanie tools

// ask the user to choose a movement


function UserChooses(MovementClass: MvmtClass; MovementType: MvmtType; Players, rounds, winners: smallInt;
               var FileNo, BrdsPerSet: smallInt;
              var LibName: string): boolean;

// write the movement to a text file

function SaveMovement(Scorer: ScorerType;
               FileNo: smallInt;
               LibName, filename: string): boolean;

// get the full details of the movement

function GetProperties(var Tables, rounds, winners, BrdPerSet, players, Brdsets, balance: smallInt;
               var MovementType: string;
               FileNo: smallInt;
                var name, Description, Reference, page: string;
                LibName: string): boolean;

var
   JeanieDLL: THandle;
  PickMovement: tPickMovement;
  ExportMovement: tExportMovement;
  GetDetails: tGetDetails;
//any other entry points just define here



implementation
uses registry, sysutils;

function GetSysPath: string;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\ASEComputing\ASE_movements'
, False) then
    //false means do not create if not there

        result := Reg.ReadString('Path'
)
    else
        result := 'c:\movements'
;
//         result := '';

  finally
    Reg.CloseKey;
    Reg.Free;
  end;
end;

function JeanieInstalled: boolean;
var
   s: string;
begin
   s := GetSysPath;
  if s <> ''
 then
     if FileExists(s + '\JeanieTools.dll'
then
     begin
       JeanieDLL := LoadLibrary(PChar(s + '\JeanieTools.dll'
));
       if JeanieDLL <> 0
 then
          begin
           PickMovement := GetProcAddress(JeanieDLL, 'PickMovement'
);
           ExportMovement := GetProcAddress(JeanieDLL, 'ExportMovement'
);
           GetDetails := GetProcAddress(JeanieDLL, 'GetDetails'
);
//any other entry points just define here

           Result := True;
          end
       else
         result := false;
     end
     else
         result := false
  else
     result := false;
end;

function ReleaseJeanie: boolean;
begin
   if JeanieDLL <> null then
      result := FreeLibrary(JeanieDLL)
  else
     result := false;
end;


// ask the user to choose a movement

function UserChooses(MovementClass: MvmtClass; MovementType: MvmtType; Players, rounds, winners: smallInt;
               var FileNo, BrdsPerSet: smallInt;
              var LibName: string): boolean;
var
  lpLibName: array [0
..1023of Char;
  MvtClass, MvtType: smallint;
begin
  LibName := #0
;
  if length(LibName) < 1024
 then
  begin
     strcopy(lpLibName, pchar(LibName));
     MvtClass := ord(MovementClass);
     MvtType := ord(MovementType);

     if  boolean(PickMovement(MvtClass, MvtType, Players, rounds, winners, FileNo, BrdsPerSet, lpLibName)) then
     begin
        LibName := lpLibName;
        result := true;
     end
     else
        result := false;
  end
  else
     result := false;
end;

// write the movement to a text file

function SaveMovement(Scorer: ScorerType;
               FileNo: smallInt;
               LibName, filename: string): boolean;
var
   lpLibName: array [0
..1023of Char;
   lpFileName: array [0
..1023of Char;
  screr: smallint;
begin
   result := false;

  if length(LibName) < 1024
 then
   begin
     lpLibName := #0
;
      strcopy(lpLibName, pchar(LibName));
  end
  else
     exit;

  if length(FileName) < 1024
 then
   begin
     lpFileName := #0
;
      strcopy(lpFileName, pchar(FileName));
  end
  else
     exit;

  screr := ord(Scorer);
  if boolean(ExportMovement(Screr, FileNo, lpLibName, lpFilename)) then
        result := true;
end;

// get the full details of the movement

function GetProperties(var Tables, rounds, winners, BrdPerSet, players, Brdsets, balance: smallInt;
               var MovementType: string;
               FileNo: smallInt;
                var name, Description, Reference, page: string;
                LibName: string): boolean;
var
  lpName, lpReference, lpLibName: array [0
..1023of Char;
  lpDescription: array [0
..2048of Char;
  lpPage: array [0
..64of Char;
  lpMvtType: array [0
..64of Char;
  lpMII: array [0
..64of Char;
  MvtType: smallint;
begin

    result := false;

   if length(LibName) < 1024
 then
    begin
     lpLibName := #0
;
      strcopy(lpLibName, pchar(LibName));
   end
   else
     exit;
   lpName := #0
;
   lpReference := #0
;
   lpDescription := #0
;
   lpPage := #0
;
   lpMvtType := #0
;
   lpMII := #0
;

   if boolean(GetDetails(Tables, rounds, winners, BrdPerSet, players, Brdsets, balance, MvtType, FileNo,
           lpName, lpMvtType, lpDescription, lpReference, lpPage, lpMII, lpLibName)) then
   begin
       Name := lpName;
      Description := lpDescription;
      Reference := lpReference;
      Page := lpPage;
      MovementType := lpMvtType;
      Result := true;
   end;
end;

end.