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

📄 elibtypes.pas

📁 本程序旨在讲解如何用Delphi创建一个可以在易语言中执行的支持库
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  UD_CUSTOMIZE        = 1024;  // 自定义类型属性


  // “窗口单元属性”的状态值(m_wState)
  UW_HAS_INDENT  = (1 shl 0);  // 在属性表中显示时向外缩进一段,一般用于子属性。
  UW_GROUP_LINE  = (1 shl 1);  // 在属性表中本属性下显示分组底封线。
  UW_ONLY_READ   = (1 shl 2);  // 只读属性,设计时不可用,运行时不能写。
  UW_CANNOT_INIT = (1 shl 3);  // 设计时不可用,但运行时可以正常读写。与上标志互斥。

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

const
  // 固定属性的数目
  FIXED_WIN_UNIT_PROPERTY_COUNT = 8;

  // 每个固定属性定义
  FIXED_WIN_UNIT_PROPERTY : array[0..FIXED_WIN_UNIT_PROPERTY_COUNT-1] of UNIT_PROPERTY =
   (( m_szName: PChar('左边');     m_szEGName: PChar('left');         m_szExplain: nil; m_shtType: UD_INT;    m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('顶边');     m_szEGName: PChar('top');          m_szExplain: nil; m_shtType: UD_INT;    m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('宽度');     m_szEGName: PChar('width');        m_szExplain: nil; m_shtType: UD_INT;    m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('高度');     m_szEGName: PChar('height');       m_szExplain: nil; m_shtType: UD_INT;    m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('标记');     m_szEGName: PChar('tag');          m_szExplain: nil; m_shtType: UD_TEXT;   m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('可视');     m_szEGName: PChar('visible');      m_szExplain: nil; m_shtType: UD_BOOL;   m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('禁止');     m_szEGName: PChar('disable');      m_szExplain: nil; m_shtType: UD_BOOL;   m_wState: 0; m_szzPickStr: nil ),
    ( m_szName: PChar('鼠标指针'); m_szEGName: PChar('MousePointer'); m_szExplain: nil; m_shtType: UD_CURSOR; m_wState: 0; m_szzPickStr: nil ));

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

type
  //////////////////////////////////////////////////////////////////////////////
  // “事件参数信息”EVENT_ARG_INFO结构

  pEVENT_ARG_INFO = ^EVENT_ARG_INFO;
  EVENT_ARG_INFO  = record
    m_szName    : PChar;  // 参数名称
    m_szExplain : PChar;  // 参数详细解释
    m_dwState   : Word;   // 状态值,见下面的常量定义(const EAS_IS_BOOL_ARG = (1 shl 0);)
  end;

const
  //////////////////////////////////////////////////////////////////////////////
  // 以下常量用于在EVENT_ARG_INFO结构的m_dwState成员

  EAS_IS_BOOL_ARG = (1 shl 0); // 为逻辑型参数,如无此标志,则认为是整数型参数

type
  //////////////////////////////////////////////////////////////////////////////
  //

  pEVENT_INFO = ^EVENT_INFO;
  EVENT_INFO  = record
    m_szName        : PChar;           // 事件名称
    m_szExplain     : PChar;           // 事件详细解释
    m_dwState       : Longword;        // 状态值,见下面的常量定义
    m_nArgCount     : Integer;         // 事件的参数数目
    m_pEventArgInfo : PEVENT_ARG_INFO; // 事件参数
  end;
  //////////////////////////////////////////////////////////////////////////////

const
  //////////////////////////////////////////////////////////////////////////////
  // 以下常量用于EVENT_INFO结构的m_dwState成员

  EV_IS_HIDED    = (1 shl 0);   // 本事件是否为隐含事件(即不能被一般用户所使用或被废弃但为了保持兼容性又要存在的事件)。
  EV_RETURN_INT  = (1 shl 3);   // 本事件的处理子程序需要返回一个整数值,与下标志互斥。
  EV_RETURN_BOOL = (1 shl 4);   // 本事件的处理子程序需要返回一个逻辑值,与上标志互斥。

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


type HUNIT = LongWord;

type pFN_INTERFACE = procedure(); stdcall;  // 通用接口指针

  
const
  //////////////////////////////////////////////////////////////////////////////
  // 窗口单元对外接口ID

  ITF_CREATE_UNIT             = 1;  // 创建单元

  // 下面两个接口仅在可视化设计窗口界面时使用。
  ITF_PROPERTY_UPDATE_UI      = 2;  // 说明属性目前可否被修改
  ITF_DLG_INIT_CUSTOMIZE_DATA = 3;  // 使用对话框设置自定义数据

  ITF_NOTIFY_PROPERTY_CHANGED = 4;  // 通知某属性数据被修改
  ITF_GET_ALL_PROPERTY_DATA   = 5;  // 取全部属性数据
  ITF_GET_PROPERTY_DATA       = 6;  // 取某属性数据
  ITF_IS_NEED_THIS_KEY        = 8;  // 询问单元是否需要指定的按键信息,用作窗口单元截获处理默认为运行时环境处理的按键,如TAB、SHIFT+TAB、UP、DOWN等。

type

  pFN_GET_INTERFACE = function (nInterfaceNO:Integer) : PFN_INTERFACE; stdcall;

  //////////////////////////////////////////////////////////////////////////////
  // 接口:

  // 创建单元,成功时返回HUNIT,失败返回NULL。
  pFN_CREATE_UNIT = function (
    pAllPropertyData     : PByte;      // 指向本窗口单元的已有属性数据,由本窗口单元的
    nAllPropertyDataSize : Integer;    // 提供pAllPropertyData所指向数据的尺寸,如果没有则为0。
    dwStyle        : LongWord;         // 预先设置的窗口风格。
    hParentWnd     : LongWord;         // 父窗口句柄。
    uID            : LongWord;         // 在父窗口中的ID。
    hMenu          : LongWord;         // 未使用。
    x, y           : Integer;          // 位置
    cx, cy         : Integer;          // 尺寸
    dwWinFormID    : LongWord;         // 本窗口单元所在窗口的ID,用作通知到系统。
    dwUnitID       : LongWord;         // 本窗口单元的ID,用作通知到系统。
    hDesignWnd     : LongWord = 0;     // 如果blInDesignMode为真,则hDesignWnd提供所设计窗口的窗口句柄。
    blInDesignMode : LongBool = false  // 说明是否被易语言IDE调用以进行可视化设计,运行时为假。
  ) : LongWord; stdcall;

  // 如果指定属性目前可以被操作,返回真,否则返回假。
  pFN_PROPERTY_UPDATE_UI = function (
    hUnit          : LongWord;         // 由PFN_CREATE_UNIT返回的已创建窗口单元的句柄,下同。
    nPropertyIndex : Integer           // 所需要查询属性的索引值,下同。
  ) : LongBool; stdcall;

  // 用作设置类型为UD_CUSTOMIZE的单元属性。如果需要重新创建该单元才能修改单元外形,请返回真。
  pFN_DLG_INIT_CUSTOMIZE_DATA = function (
    hUnit          : LongWord;
    nPropertyIndex : Integer;
    pblModified    : PLongBool= nil;   // 如果pblModified不为nil,请在其中返回是否被用户真正修改(便于易语言IDE建立UNDO记录)。
    pReserved      : Pointer = nil     // 保留未用。LPVOID
  ) : LongBool; stdcall;   

type
  // 临时结构,仅在UNIT_PROPERTY_VALUE结构中用于定义m_data成员
  T_UNIT_PROPERTY_VALUE__m_data  = record
    m_pData     : PByte;
    m_nDataSize : Integer;
  end;

  // 用作记录某属性的具体属性值。 (In VC6, UNIT_PROPERTY_VALUE is defined as a UNION)
  pUNIT_PROPERTY_VALUE = ^UNIT_PROPERTY_VALUE;
  UNIT_PROPERTY_VALUE  = record
    case Integer of
      0: (m_int        : Integer);   // 对应的属性类别:UD_INT、UD_PICK_INT,下同。
      1: (m_double     : Double);    // UD_DOUBLE
      3: (m_bool       : LongBool);  // UD_BOOL
      4: (m_dtDateTime : TDateTime); // UD_DATE_TIME
      5: (m_clr        : Longword);  // UD_COLOR、UD_COLOR_TRANS、UD_COLOR_BACK
      6: (m_szText     : PChar);     // UD_TEXT、UD_PICK_TEXT、UD_EDIT_PICK_TEXT、UD_ODBC_CONNECT_STR、UD_ODBC_SELECT_STR
      7: (m_szFileName : PChar);     // UD_FILE_NAME
      8: (m_data : T_UNIT_PROPERTY_VALUE__m_data); // UD_PIC、UD_ICON、UD_CURSOR、UD_MUSIC、UD_FONT、UD_CUSTOMIZE、UD_IMAGE_LIST

      {	UNIT_PROPERTY_VALUE ()
	
		memset ((LPBYTE)this, 0, sizeof (UNIT_PROPERTY_VALUE));
	}
  end;

  // 通知某属性(非UD_CUSTOMIZE类别属性)数据被用户修改,需要根据该修改相应更改内部数据及外形,如果确实需要重新创建才能修改单元外形,请返回真。注意:必须进行所传入值的合法性校验。
  pFN_NOTIFY_PROPERTY_CHANGED = function (
    hUnit          : LongWord;
    nPropertyIndex : Integer;
    pPropertyValue : PUNIT_PROPERTY_VALUE;  // 用作修改的相应属性数据。
    ppszTipText    : PPChar = nil           // 目前尚未使用。LPTSTR*
  ) : LongBool; stdcall;

  // 取某属性数据到pPropertyValue中,成功返回真,否则返回假。注意:如果在设计时(由调用PFN_CREATE_UNIT时的blInDesignMode参数决定),pPropertyValue必须返回所存储的值。如果在运行时(blInDesignMode为假),必须返回实际的当前实时值。比如说,编辑框窗口单元的“内容”属性,设计时必须返回内部所保存的值,而运行时就必须调用GetWindowText去实时获取。
  pFN_GET_PROPERTY_DATA = function (
    hUnit          : LongWord;
    nPropertyIndex : Integer;
    pPropertyValue : pUNIT_PROPERTY_VALUE  // 用作接收欲读取属性的数据。
  ) : LongBool; stdcall;

  // 返回本窗口单元的全部属性数据,由该窗口单元的实现代码自行设计格式将所有属性数据组合到一起。此窗口单元的PFN_CREATE_UNIT接口必须能够正确解读此数据。
  pFN_GET_ALL_PROPERTY_DATA = function (hUnit : LongWord) : LongWord; stdcall;  // 在Delphi中, HGLOBAL=THandle=LongWord;

  // 询问单元是否需要指定的按键信息,如果需要,返回真,否则返回假。
  pFN_IS_NEED_THIS_KEY = function (hUnit : LongWord; wKey : Word) : LongBool; stdcall;

const

  UNIT_BMP_SIZE       = 24;       // 单元标志位图的宽度和高度。
  UNIT_BMP_BACK_COLOR = $C0C0C0;  // 单元标志位图的背景颜色(灰色): RGB(192,192,192)=$C0C0C0=12632256

type
  //////////////////////////////////////////////////////////////////////////////
  // “库定义数据类型” LIB_DATA_TYPE_INFO

  pLIB_DATA_TYPE_INFO = ^LIB_DATA_TYPE_INFO;
  LIB_DATA_TYPE_INFO  = record
    m_szName      : PChar;     // 名称
    m_szEGName    : PChar;     // 英文名称,可为空或nil
    m_szExplain   : PChar;     // 详细解释,如无则可为nil

    m_nCmdCount   : Integer;   // 本数据类型成员方法的数目(可为0)
    m_pnCmdsIndex : ^Integer;  // 顺序记录本类型中所有成员方法命令在支持库命令表中的索引值,可为NULL。
    m_dwState     : LongWord;  // 状态值,见下面的说明及常量定义

    // 以下成员只有在为窗口单元、菜单时才有效。
    m_dwUnitBmpID    : LongWord;       // 指定在支持库中的单元图像资源ID(注意不同于上面的图像索引),0为无。尺寸必须为24*24 ,背景颜色为RGB(192,192,192) 。
    m_nEventCount    : Integer;        // 本单元的事件数目
    m_pEventBegin    : PEVENT_INFO ;   // 定义本单元的所有事件
    m_nPropertyCount : Integer;        // 本单元的属性数目
    m_pPropertyBegin : pUNIT_PROPERTY; // 定义本单元的所有属性

    // 用作提供本窗口单元的所有接口。
    m_pfnGetInterface : pFN_GET_INTERFACE;

    // 以下成员只有在不为窗口单元、菜单时才有效。
    m_nElementCount : Integer;                 // 本数据类型中子成员的数目(可为0)。如为窗口、菜单单元,此变量值必为0。
    m_pElementBegin : pLIB_DATA_TYPE_ELEMENT;  // 指向子成员数组的首地址。

    ////////////////////////////////////////////////////////////////////////////
    //
    // 其中,m_dwState 可以为以下常量值的组合:
    //   LDT_IS_HIDED             = (1 shl 0);  // 本类型是否为隐含类型(即不能由用户直接用作定义的类型,如被废弃但为了保持兼容性又要存在的类型)
    //   LDT_IS_ERROR             = (1 shl 1);  // 本类型在本库中不能使用,具有此标志一定隐含。即使具有此标志,本类型的类型数据也必须完整定义。
    //   LDT_WIN_UNIT             = (1 shl 6);  // 是否为窗口单元,如此标志置位则m_nElementCount必为0
    //   LDT_IS_CONTAINER         = (1 shl 7);  // 是否为容器型窗口单元,如有此标志,LDT_WIN_UNIT必须置位。
    //   LDT_IS_FUNCTION_PROVIDER = (1 shl 15); // 是否为仅用作提供功能的窗口单元(如时钟),如此标志置位则LDT_WIN_UNIT必置位。具有此标志的单元在运行时无可视外形。
    //   LDT_CANNOT_GET_FOCUS     = (1 shl 16); // 仅用作窗口单元,如此标志置位则表示此单元不能接收输入焦点,不能TAB键停留。
    //   LDT_DEFAULT_NO_TABSTOP   = (1 shl 17); // 仅用作窗口单元,如此标志置位则表示此单元可以接收输入焦点,但默认不停留TAB键,本标志与上标志互斥。
    //   LDT_BAR_SHAPE            = (1 shl 20); // 是否为需要自调整位置或尺寸的条状窗口单元(如工具条、状态条等),对于具有此标志的单元,所在窗口尺寸改变后易语言运行时环境会自动发送给WU_SIZE_CHANGED消息。注意:条状窗口单元如果需要自动顶部对齐必须具有 CCS_TOP 窗口风格,如果需要自动底部对齐必须具有 CCS_BOTTOM 窗口风格。
    //
    // 对于 m_dwState具有LDT_BAR_SHAPE标志的单元,所在窗口尺寸改变后易语言运行时环境会自动发送给WU_SIZE_CHANGED消息。
    // 注意,条状窗口单元如果需要自动顶部对齐必须具有CCS_TOP窗口风格,如果需要自动底部对齐必须具有CCS_BOTTOM窗口风格。
    //
    ////////////////////////////////////////////////////////////////////////////
  end;

const
  //////////////////////////////////////////////////////////////////////////////
  // 以下常量用于LIB_DATA_TYPE_INFO结构的m_dwState成员中

  LDT_IS_HIDED             = (1 shl 0);  // 本类型是否为隐含类型(即不能由用户直接用作定义的类型,如被废弃但为了保持兼容性又要存在的类型)
  LDT_IS_ERROR             = (1 shl 1);  // 本类型在本库中不能使用,具有此标志一定隐含。即使具有此标志,本类型的类型数据也必须完整定义。

  LDT_WIN_UNIT             = (1 shl 6);  // 是否为窗口单元,如此标志置位则m_nElementCount必为0
  LDT_IS_CONTAINER         = (1 shl 7);  // 是否为容器型窗口单元,如有此标志,LDT_WIN_UNIT必须置位。

  LDT_IS_FUNCTION_PROVIDER = (1 shl 15); // 是否为仅用作提供功能的窗口单元(如时钟),如此标志置位则LDT_WIN_UNIT必置位。具有此标志的单元在运行时无可视外形。
  LDT_CANNOT_GET_FOCUS     = (1 shl 16); // 仅用作窗口单元,如此标志置位则表示此单元不能接收输入焦点,不能TAB键停留。
  LDT_DEFAULT_NO_TABSTOP   = (1 shl 17); // 仅用作窗口单元,如此标志置位则表示此单元可以接收输入焦点,但默认不停留TAB键,本标志与上标志互斥。

  LDT_BAR_SHAPE            = (1 shl 20); // 是否为需要自调整位置或尺寸的条状窗口单元(如工具条、状态条等),对于具有此标志的单元,所在窗口尺寸改变后易语言运行时环境会自动发送给WU_SIZE_CHANGED消息。注意:条状窗口单元如果需要自动顶部对齐必须具有CCS_TOP窗口风格,如果需要自动底部对齐必须具有CCS_BOTTOM窗口风格。

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

type

⌨️ 快捷键说明

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