⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elibtypes.pas

📁 本程序旨在讲解如何用Delphi创建一个可以在易语言中执行的支持库
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    m_pDataType              : pLIB_DATA_TYPE_INFO; // 本库中所有自定义数据类型的定义信息
    m_nCategoryCount         : Integer;             // 全局命令类别数目,必须等同于下面m_szzCategory成员所实际提供的数目
    m_szzCategory            : PChar;               // 全局命令类别说明表,每项为一字符串,前四位数字表示图象索引号(从1开始,0表示无)。减一后的值为指向支持库中名为"LIB_BITMAP"的BITMAP资源中某一部分16X13位图的索引。
    m_nCmdCount              : Integer;             // 本库中提供的所有命令(全局命令及对象方法)的数目(如无则为0)
    m_pBeginCmdInfo          : pCMD_INFO;           // 指向所有命令及方法的定义信息数组(如m_nCmdCount为0,则为nil)
    m_pCmdsFunc              : ^pFN_EXECUTE_CMD;    // 指向每个命令的实现代码首地址,(如m_nCmdCount为0,则为nil)
    m_pfnRunAddInFn          : pFN_RUN_ADDIN_FN;    // 用作为易语言IDE提供附加功能,可为nil
    m_szzAddInFnInfo         : PChar;               // 有关AddIn功能的说明,两个字符串说明一个功能。第一个为功能名称(限20字符),第二个为功能详细介绍(限60字符),最后由两个空串结束。
    m_pfnNotify              : pFN_NOTIFY_LIB;      // 提供接收来自易语言IDE或运行环境通知信息的函数,不能为nil

    m_pfnSuperTemplate       : pFN_SUPER_TEMPLATE;  // 超级模板,暂时保留不用,为nil
    m_szzSuperTemplateInfo   : PChar;               // 为nil

    m_nLibConstCount         : Integer;             // 常量数目
    m_pLibConst              : pLIB_CONST_INFO;     // 指向常量定义数组
    m_szzDependFiles         : PChar;               // 本库正常运行所需要依赖的其他文件,在制作安装软件时将会自动带上这些文件。可为nil。

    ////////////////////////////////////////////////////////////////////////////
    //
    // 其中,m_nLanguage 可取以下值之一:
    //   LT_CHINESE = 1;  // 中文
    //   LT_ENGLISH = 2;  // 英文
    //
    // 其中,m_dwState 可取 0 或以下值之一:
    //   LBS_FUNC_NO_RUN_CODE = 4;  // 本库仅为声明库,没有对应功能的支持代码,因此不能运行
    //   LBS_NO_EDIT_INFO     = 8;  // 本库内无供编辑用的信息(编辑信息主要为:各种名称、解释字符串等),无法被易语言IDE加载
    //
    ////////////////////////////////////////////////////////////////////////////
  end;

const
  //////////////////////////////////////////////////////////////////////////////
  // 以下常量在 LIB_INFO 结构的成员m_nLanguage和m_dwState中使用

  // 支持库所支持的语言(m_nLanguage)
  LT_CHINESE = 1;  // 中文
  LT_ENGLISH = 2;  // 英文

  // 支持库状态值(m_dwState)
  LBS_FUNC_NO_RUN_CODE = 4; {1 shl 2}  // 本库仅为声明库,没有对应功能的支持代码,因此不能运行
  LBS_NO_EDIT_INFO     = 8; {1 shl 3}  // 本库内无供编辑用的信息(编辑信息主要为:各种名称、解释字符串等),无法被易语言IDE加载

  ////////////////////////////////////////////////////////////////////////////////


type

  pFN_GET_LIB_INFO = function() : pLIB_INFO; stdcall; // GetNewInf的函数原型
  pFN_ADD_IN_FUNC  = function() : Integer; cdecl;     // m_pfnRunAddInFn的函数原型

  function RGB(r, g, b: Byte): LongWord; // 合成RGB颜色值

const
  ////////////////////////////////////////////////////////////////////////////////
  FUNCNAME_GET_LIB_INFO = 'GetNewInf';   // 取本支持库的PLIB_INFO指针的输出函数名称

  LIB_BMP_RESOURCE = 'LIB_BITMAP';  // 支持库中提供的图像资源的名称
  LIB_BMP_CX       = 16;            // 每一图像资源的宽度
  LIB_BMP_CY       = 13;            // 每一图像资源的高度
  LIB_BMP_BKCOLOR  = $FFFFFF;       // 图像资源的底色(白色): RGB(255, 255, 255)=$FFFFFF=16777215


  
  { 运行时使用 }  WM_APP = $8000;        // 定义于VC中的WinUser.h,含条件编译参数WINVER>=$0400(即Windows95及以上版本)
  WU_GET_WND_PTR         = (WM_APP + 2); // 用作支持窗口单元事件反馈。
  WU_SIZE_CHANGED        = (WM_APP + 3); // 用作在窗口尺寸改变后通知所有条状窗口单元。
  WU_PARENT_RELAYOUT_BAR = (WM_APP + 4); // 用作通知顶层窗口重新布局所有的 bar 单元,通常在 bar 单元改变了自身尺寸后使用。

const
  //////////////////////////////////////////////////////////////////////////////
  // 以下常量在函数GetDataTypeType中用到,做为返回值类型

  DTT_IS_NULL_DATA_TYPE  = 0;
  DTT_IS_SYS_DATA_TYPE   = 1;
  DTT_IS_USER_DATA_TYPE  = 2;
  DTT_IS_LIB_DATA_TYPE   = 3;

var
  //============================================================================
  // 定义全局函数和全局变量
  //============================================================================
  
  g_nLastNotifyResult : Integer;
  g_fnNotifySys : PFN_NOTIFY_SYS = nil;

  // 向易IDE系统发送信息
  function NotifySys (nMsg: Integer; dwParam1,dwParam2: Longword): Integer;

  // 使用指定文本数据建立易程序中使用的文本数据。
  function CloneTextData (ps: PChar) : PChar; overload;

  // 使用指定文本数据建立易程序中使用的文本数据。nTextLen用作指定文本部分的长度(不包含结束零),如果为-1,则取ps的全部长度。
  function CloneTextData (ps: PChar; nTextLen: Integer): PChar; overload;

  // 使用指定数据建立易程序中使用的字节集数据。
  function CloneBinData (pData: PByte; nDataSize: Integer): PByte;

  // 向易IDE报告运行时错误。
  procedure GReportError (szErrText: PChar);

  // 向易IDE申请内存
  function MMalloc (nSize: Integer): Pointer;

  // 释放从易IDE申请来的内存
  procedure MFree (p: Pointer);

  // 返回数组的数据部分首地址及成员数目。
  function GetAryElementInf (pAryData: Pointer; var pnElementCount: Integer): PByte;

  // 取回数据类型的类别。
  function GetDataTypeType (dtDataType: DATA_TYPE): Integer;


{$ENDIF} { __LIB_H }

implementation
uses SysUtils;  //SysUtils用于处理PChar字串

// 合成RGB颜色值。本函数的定义和实现代码拷贝自Delphi中的Windows.pas
function RGB(r, g, b: Byte): LongWord;
begin
  Result:= (r or (g shl 8) or (b shl 16));
end;

{ EVENT_NOTIFY }
procedure EVENT_NOTIFY.EVENT_NOTIFY(dwFormID, dwUnitID: LongWord;
  nEventIndex: Integer);
begin
    m_dwFormID         := dwFormID;
    m_dwUnitID         := dwUnitID;
    m_nEventIndex      := nEventIndex;
    m_nArgCount        := 0;
    m_blHasReturnValue := FALSE;
end;

// 向易IDE系统发送信息。失败返回0 ;使用之前必须初始化函数指针g_fnNotifySys。
function NotifySys (nMsg: Integer; dwParam1,dwParam2: Longword): Integer;
begin
  if Assigned(g_fnNotifySys) then
    g_nLastNotifyResult:= g_fnNotifySys(nMsg,dwParam1,dwParam2)
  else
    g_nLastNotifyResult:= 0;
  Result:= g_nLastNotifyResult;
end;

// 使用指定文本数据建立易程序中使用的文本数据。
function CloneTextData (ps: PChar) : PChar;
var
  nTextLen: Integer;
  pd: PChar;
begin
  if (ps=nil) or (ps[1]=#0) then begin Result:=nil; exit; end;
  nTextLen:= StrLen(ps);
  pd:= PChar(NotifySys(NRS_MALLOC, LongWord(nTextLen+1),0));
  //SysUtils.StrLCopy(pd, ps, nTextLen);
  System.Move(ps, pd, nTextLen);
  pd[nTextLen] := #0;
  Result:= pd;
end;

// 使用指定文本数据建立易程序中使用的文本数据。nTextLen用作指定文本部分的长度(不包含结束零),如果为-1,则取ps的全部长度。
function CloneTextData (ps: PChar; nTextLen: Integer): PChar;
var pd: PChar;
begin
  if nTextLen <= 0 then begin Result:=nil; exit; end;
  pd:= PChar(NotifySys(NRS_MALLOC,LongWord(nTextLen+1),0));
  //SysUtils.StrLCopy(pd, ps, nTextLen);
  System.Move(ps, pd, nTextLen);
  pd[nTextLen]:= #0;
  Result:= pd;
end;

// 使用指定数据建立易程序中使用的字节集数据。
function CloneBinData (pData: PByte; nDataSize: Integer): PByte;
var pd: PByte;
begin
  if nDataSize=0 then begin Result:=nil; exit; end;
  pd:= PByte(NotifySys(NRS_MALLOC,LongWord(sizeof(Integer)*2+nDataSize),0));
  pd^:= 1;
  //??? Integer(Pointer(Integer(pd)+sizeof(Integer))^) := nDataSize;
  //??? System.Move(pData,Pointer(Integer(@pd)+sizeof(Integer)*2),nDataSize);
  Result:= pd;
end;

// 向易IDE报告运行时错误。
procedure GReportError (szErrText: PChar);
begin
  NotifySys(NRS_RUNTIME_ERR,LongWord(szErrText),0);
end;

// 向易IDE申请内存
function MMalloc (nSize: Integer): Pointer;
begin
  Result:= Pointer(NotifySys(NRS_MALLOC,LongWord(nSize),0));
end;

// 释放从易IDE申请来的内存
procedure MFree (p: Pointer);
begin
  NotifySys(NRS_MFREE,LongWord(p),0);
end;

// 返回数组的数据部分首地址及成员数目。
function GetAryElementInf (pAryData: Pointer; var pnElementCount: Integer): PByte;
var
  pnData : PInteger;
  nArys, nElementCount : Integer;
begin
  pnData:= PInteger(pAryData);
  nArys:= pnData^;  // 取得维数。
  Inc(pnData);
  nElementCount:= 1;  // 计算成员数目。
  while (nArys > 0) do begin
    nElementCount:= nElementCount * pnData^;
    Inc(pnData);
    Dec(nArys);
  end;
  pnElementCount:= nElementCount;
  Result:= PByte(pnData);
end;

// 取回数据类型的类别。
function GetDataTypeType (dtDataType: DATA_TYPE): Integer;
var dw: Longword;
begin
  if dtDataType= _SDT_NULL then begin
    Result:= DTT_IS_NULL_DATA_TYPE;
    exit;
  end;
  dw:= dtDataType and $C0000000;
  if dw=DTM_SYS_DATA_TYPE_MASK then
    Result:= DTT_IS_SYS_DATA_TYPE
  else if dw=DTM_USER_DATA_TYPE_MASK then
    Result:= DTT_IS_USER_DATA_TYPE
  else
    Result:=DTT_IS_LIB_DATA_TYPE;
end;

end.


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -