OPTION 转移项目

该博客展示了一个基于HTML和JavaScript实现的人员分配选择功能。通过多个JavaScript函数,实现了人员列表的添加、全部添加、删除、全部删除等操作,用户可从负责人员列表中选择人员添加到已选中列表,还能进行反向操作,最后可确定选择或取消。


<HTML>
 <HEAD>
  <title>UserConfig</title>
  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
  <meta name="CODE_LANGUAGE" Content="C#">
  <meta name="vs_defaultClientScript" content="JavaScript">
  <LINK href="../appCssStyle/css.css" type="text/css" rel="stylesheet">
  <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  <script language="JavaScript">  
 //添加  
 function AddSelect(){
  destList = window.document.forms[0].SlectedListBox;
  srcList = window.document.forms[0].ListBoxList;
  var len = destList.length;
  for(var i = 0; i < srcList.length; i++) {
      if ((srcList.options[i] != null) && (srcList.options[i].selected)) {

   var found = false;
   for(var count = 0; count < len; count++) {
    if (destList.options[count] != null) {
     if (srcList.options[i].value == destList.options[count].value) {
     found = true;
     break;
     }
    }
  }
  if (found != true) {
  destList.options[len] = new Option(srcList.options[i].text,srcList.options[i].value);
  len++;
    }
   }
  }  
 } 
 
 //全部添加
 function AddA(){
   var i;
   var str = "";
   for (i=0;i<window.Form1.ListBoxList.options.length;i++)
   {
    if(is_exist_option(Form1.SlectedListBox,Form1.ListBoxList.options(i).value)) continue;
    sel_option=document.createElement("option");
    sel_option.text=Form1.ListBoxList.options(i).text;
    sel_option.value=Form1.ListBoxList.options(i).value;
    Form1.SlectedListBox.options.add(sel_option);

   } 
 } 
 function is_exist_option(list_obj,one_str)
 {
  var i,list_option_num;

  if (list_obj.options.length>0){
   list_option_num=list_obj.options.length;
   for (i=0;i<list_option_num;i++)
   {
    if (list_obj.options(i).value==one_str)
    return(true);
   }
  }
  return(false);
 }
 function AddChange(){
     AddSelect();
 }
 //确定
 function OK(){
  if (!opener) return true;
  var i;
  var seloption;
  var sel_option;

  var t_array = new Array();
  var v_array = new Array();


  var obj = document.Form1.SlectedListBox;
  for (i=0;i<obj.options.length;i++){
   t_array[i] = obj.options(i).text;
   v_array[i] = obj.options(i).value;
  }

  opener.Set_SlistBoxOption(t_array,v_array);
  self.close();
  return false;
 }


 //删除选择的
 function delselected() {
  var ListBoxObj = window.document.forms[0].SlectedListBox;
  var len = ListBoxObj.options.length;
  for(var i = (len-1); i >= 0; i--) {
   if ((ListBoxObj.options[i] != null) && (ListBoxObj.options[i].selected == true)) {
   ListBoxObj.options[i] = null;
  }
 }
 }

 //全部删除
 function delall(){
  for(var i=window.document.forms[0].SlectedListBox.options.length-1;i>=0;i--){
      
      window.document.forms[0].SlectedListBox.options[i] = null;
  }
 }
 //单击删除
 function DelChange(){
   delselected();
 }
   
  </script>
 </HEAD>
 <body MS_POSITIONING="GridLayout">
  <form name="Form1" method="post" action="UserConfig.aspx" id="Form1">
   <table class="bg1" cellSpacing="0" borderColorDark="#ffffff" cellPadding="0" width="500"
    align="center">
    <tr>
     <td height="26">
      <table cellSpacing="0" cellPadding="0" width="100%" border="0">
       <tr>
        <td width="1%"><IMG height="35" src="../img/im_0007.gif" width="35"></td>
        <td class="bg001" vAlign="middle" align="left"><font class="bt001">人员分配</font>
        </td>
       </tr>
      </table>
     </td>
    </tr>
    <tr>
     <td align="center"><br>
      <table lass="zi" cellSpacing="0" borderColorDark="#ffffff" cellPadding="0" width="450"
       align="center" borderColorLight="#909090" border="1">
       <tr valign="middle" bgcolor="#ebeae8">
        <td height="25" colspan="3" align="left"><strong> 选择负责人</strong></td>
       </tr>
       <tr>
        <td height="25" align="center" valign="middle" bgcolor="#6699cc"><strong><font color="#ffffff">负责人员列表</font></strong></td>
        <td width="70" rowspan="2" align="center" valign="middle" bgcolor="#fbfaf9">
         <P>
          <INPUT id="AddAll" type="button" value="全部添加" name="Add" class="cmd_but2" onclick="return AddA();">
         </P>
         <P>
          <INPUT id="Add" type="button" value="添加" name="Add" class="cmd_but2" onclick="return AddSelect();">
         </P>
         <P>
          <INPUT id="Del" type="button" value="删除" name="Del" class="cmd_but2" onclick="return delselected();">
         </P>
         <P>
          <INPUT id="DelAll" type="button" value="全部删除" name="DelAll" class="cmd_but2" onclick="return delall();">
          <BR>
         </P>
        </td>
        <td height="25" align="center" valign="middle" bgcolor="#6699cc"><strong><font color="#ffffff">
           已选中负责人员</font></strong></td>
       </tr>
       <tr>
        <td width="190" height="300" align="left" valign="top">
         <DIV id="plan2" style="OVERFLOW: auto; WIDTH: 190px; HEIGHT: 300px">
          <select name="ListBoxList" size="4" multiple="multiple" id="ListBoxList" ondblclick="AddChange()" style="height:296px;width:184px;">
 <option value="b14d98ae-5f47-447e-9393-9bfdb2947016">admin</option>
 <option value="d99b1806-4209-404f-bf6a-75d18eff37d6">test</option>
 <option value="cdafd130-decf-4e9d-9316-cef74ecd3893">但工</option>
 <option value="18e0715d-b740-4ce6-ad4f-b8252eb5c20d">zxy</option>
 <option value="3274b0b7-db65-4d13-a701-c6bdaf141bbd">ly</option>
 <option value="8a411cb0-01ed-4dc5-92d6-910c4f1e710f">郑良</option>
 <option value="b49f065a-36c1-45ee-9e02-69cd410398df">夏建萍</option>
 <option value="5c2050e5-3a7f-4c0c-92ba-177fe79a67ec">罗胜国</option>
 <option value="8605666e-0554-483b-a30c-e4a954d30c85">刘文杰</option>
 <option value="af99e1c6-00ea-4f80-9179-a24a8e0f9aa1">孙占来</option>
 <option value="ba87092c-516b-41bd-b62a-875adbc04842">赵淑华</option>
 <option value="6c8d655e-d5d0-49a8-a315-dd4c87e1d1b6">赵常顺</option>
 <option value="ef539b44-8d95-460a-99fc-a8a35ae73dd3">张效朝</option>
 <option value="ea3a6076-086a-4307-8dac-210728e7e6fe">柳原</option>
 <option value="44f2c588-d21a-42b1-ab48-059e056bbd01">测试人员1</option>


</select>
         </DIV>
        </td>
        <td width="190" height="300" align="left" valign="top">
         <DIV id="plan" style="OVERFLOW: auto; WIDTH: 190px; HEIGHT: 300px">
          <SELECT size="18" id="SlectedListBox" name="SlectedListBox" type="select-multiple" style="WIDTH: 184px; HEIGHT: 296px"
           ondblclick="DelChange()" multiple>
          </SELECT>
         </DIV>
        </td>
       </tr>
       <tr bgcolor="#ebeae8">
        <td height="21" colspan="3" align="right" valign="top"><INPUT name="button" type="button" onclick="return OK();" value="确定" class="cmd_but2">
         &nbsp;&nbsp; <INPUT name="button" type="button" onclick="window.close()" value="取消" class="cmd_but2">
         &nbsp; &nbsp;</td>
       </tr>
      </table>
      <br>
     </td>
    </tr>
   </table>
  </form>
 </body>
</HTML>

将 **Makefile** 迁移到 **CMake** 需要理解两者的核心差异,并按照结构化步骤进行转换。以下是详细指南,包含示例和注意事项: --- ### **1. Makefile 与 CMake 的核心差异** | **特性** | **Makefile** | **CMake** | |------------------|---------------------------------------|----------------------------------------| | **语法** | 规则、依赖、命令(直接执行) | 函数、命令(生成平台无关的构建系统) | | **跨平台** | 需手动适配不同工具链 | 自动生成 Makefile/Ninja/VS 项目文件 | | **变量管理** | 显式定义(如 `CC=gcc`) | 通过 `set()`、`option()` 等管理 | | **依赖处理** | 手动声明(如 `main.o: main.c`) | 自动检测(通过 `target_sources()`) | | **扩展性** | 适合简单项目 | 支持复杂项目(子目录、外部依赖等) | --- ### **2. 迁移步骤** #### **步骤 1:分析原有 Makefile 结构** - **目标(Targets)**:识别 `all`、`clean`、`install` 等核心目标。 - **变量**:提取编译器、标志、路径等(如 `CC`、`CFLAGS`、`LDFLAGS`)。 - **依赖关系**:明确源文件与目标的生成规则(如 `.c` → `.o`)。 - **自定义命令**:记录非标准操作(如代码生成、文档生成)。 #### **步骤 2:创建基础 CMakeLists.txt** ```cmake cmake_minimum_required(VERSION 3.10) # 指定最低 CMake 版本 project(MyProject) # 项目名称 # 设置 C 标准(对应 Makefile 中的 CFLAGS) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) # 添加可执行文件(对应 Makefile 中的目标) add_executable(my_app src/main.c src/utils.c ) # 添加库(如有) # add_library(my_lib STATIC src/lib.c) # target_link_libraries(my_app PRIVATE my_lib) ``` #### **步骤 3:迁移变量和编译选项** - **Makefile 片段**: ```makefile CC = gcc CFLAGS = -Wall -O2 LDFLAGS = -lm ``` - **CMake 等效代码**: ```cmake # 设置编译器(通常无需显式指定,CMake 会自动检测) # set(CMAKE_C_COMPILER "gcc") # 仅在需要覆盖默认时使用 # 添加编译选项 add_compile_options(-Wall -O2) # 链接库(如 -lm) target_link_libraries(my_app PRIVATE m) ``` #### **步骤 4:处理依赖关系** - **Makefile 片段**: ```makefile main.o: src/main.c src/header.h $(CC) $(CFLAGS) -c src/main.c -o main.o ``` - **CMake 等效代码**: ```cmake # CMake 会自动处理头文件依赖(无需显式声明) # 若需手动指定包含路径: target_include_directories(my_app PRIVATE include/) ``` #### **步骤 5:迁移自定义目标** - **Makefile 片段**: ```makefile clean: rm -f *.o my_app ``` - **CMake 等效代码**: ```cmake # 添加自定义目标(clean 会由 CMake 自动生成,但可覆盖) add_custom_target(clean-custom COMMAND ${CMAKE_COMMAND} -P clean.cmake # 或直接使用 shell 命令 ) # 更推荐的方式:使用 CMake 内置的 clean # 运行 `make clean` 即可(无需额外定义) ``` #### **步骤 6:处理多目录项目** - **Makefile 片段**: ```makefile SUBDIRS = src lib .PHONY: all $(SUBDIRS) all: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ ``` - **CMake 等效代码**: ```cmake # 添加子目录 add_subdirectory(src) add_subdirectory(lib) # 若子目录生成库,需在父目录链接 # target_link_libraries(my_app PRIVATE lib_target) ``` --- ### **3. 完整示例对比** #### **原始 Makefile** ```makefile CC = gcc CFLAGS = -Wall -O2 LDFLAGS = -lm all: my_app my_app: main.o utils.o $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) main.o: src/main.c include/header.h $(CC) $(CFLAGS) -c src/main.c -o $@ utils.o: src/utils.c include/header.h $(CC) $(CFLAGS) -c src/utils.c -o $@ clean: rm -f *.o my_app ``` #### **迁移后的 CMakeLists.txt** ```cmake cmake_minimum_required(VERSION 3.10) project(MyApp) # 设置编译选项 set(CMAKE_C_STANDARD 11) add_compile_options(-Wall -O2) # 添加可执行文件 add_executable(my_app src/main.c src/utils.c ) # 链接数学库 target_link_libraries(my_app PRIVATE m) # 包含路径(若头文件在 include/ 目录) target_include_directories(my_app PRIVATE include/) # 可选:自定义 clean 目标(通常不需要) # add_custom_target(clean-all # COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_BINARY_DIR}/*.o ${CMAKE_BINARY_DIR}/my_app # ) ``` --- ### **4. 高级特性迁移** #### **条件编译** - **Makefile 片段**: ```makefile ifeq ($(DEBUG),1) CFLAGS += -g endif ``` - **CMake 等效代码**: ```cmake option(DEBUG "Enable debug mode" OFF) if(DEBUG) add_compile_options(-g) endif() ``` #### **跨平台配置** - **Makefile 片段**: ```makefile ifeq ($(OS),Windows_NT) LDFLAGS += -lws2_32 else LDFLAGS += -lpthread endif ``` - **CMake 等效代码**: ```cmake if(WIN32) target_link_libraries(my_app PRIVATE wsock32 ws2_32) else() target_link_libraries(my_app PRIVATE pthread) endif() ``` #### **生成代码** - **Makefile 片段**: ```makefile generated.c: generate_code.py python3 generate_code.py > $@ ``` - **CMake 等效代码**: ```cmake add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/generated.c COMMAND python3 ${CMAKE_SOURCE_DIR}/generate_code.py > $<TARGET_FILE:generated.c> DEPENDS generate_code.py ) add_library(generated_lib ${CMAKE_BINARY_DIR}/generated.c) target_link_libraries(my_app PRIVATE generated_lib) ``` --- ### **5. 迁移后验证** 1. **生成构建系统**: ```bash mkdir build && cd build cmake .. -G "Unix Makefiles" # 或 "Ninja" ``` 2. **编译并运行**: ```bash make # 或 ninja ./my_app ``` 3. **检查功能**: - 确认输出与原 Makefile 一致。 - 验证调试/发布模式、跨平台行为等。 --- ### **6. 常见问题解答** #### **Q1: 如何迁移 `PHONY` 目标?** - CMake 的 `add_custom_target()` 可创建伪目标(如 `install`、`test`): ```cmake add_custom_target(install_data COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/data ${CMAKE_INSTALL_PREFIX}/data ) ``` #### **Q2: 如何处理 Makefile 中的通配符?** - CMake 使用 `file(GLOB)` 或显式列出文件(推荐后者): ```cmake file(GLOB SOURCES "src/*.c") add_executable(my_app ${SOURCES}) # 或更安全的方式: set(SOURCES src/main.c src/utils.c) ``` #### **Q3: 如何迁移 `include` 指令?** - 使用 `include()` 加载其他 CMake 文件: ```cmake include(CMakeLists.subdir.txt) # 加载子目录配置 ``` #### **Q4: 如何调试 CMake 脚本?** - 使用 `message(STATUS "Debug info")` 输出变量: ```cmake message(STATUS "Sources: ${SOURCES}") ``` - 运行 CMake 时添加 `--debug-find` 查看依赖查找过程。 #### **Q5: 如何保持与原 Makefile 完全一致的行为?** - 通过 `CMAKE_C_FLAGS` 直接传递标志(不推荐,优先使用 `target_compile_options()`): ```cmake set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2") ``` --- ### **7. 最佳实践** 1. **避免直接使用 `file(GLOB)`**:显式列出源文件可确保 CMake 在文件增删时自动重新配置。 2. **优先使用 `target_*` 命令**:如 `target_include_directories()` 而非全局 `include_directories()`。 3. **模块化设计**:将大型项目拆分为多个 `CMakeLists.txt` 并使用 `add_subdirectory()`。 4. **测试跨平台行为**:在 Linux、Windows、macOS 上分别验证构建。 --- ### **总结** | **步骤** | **Makefile 操作** | **CMake 等效操作** | |------------------------|----------------------------------|----------------------------------------| | **项目初始化** | 手动编写规则 | `cmake_minimum_required()`, `project()`| | **添加目标** | `target: dependencies` | `add_executable()`, `add_library()` | | **设置编译选项** | `CFLAGS += ...` | `add_compile_options()` | | **处理依赖** | 手动声明 `.o: .c` | 自动检测(或 `target_sources()`) | | **自定义命令** | `rule: command` | `add_custom_command()` | | **跨平台适配** | 条件判断 `ifeq` | `if(WIN32)`, `if(APPLE)` | 通过系统化迁移,可以充分利用 CMake 的跨平台能力和高级特性(如外部依赖管理、测试集成等)。建议从简单项目开始实践,逐步掌握复杂场景的迁移技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值